Vim是linux和Unix上的编辑器,由Vi升级而来。
已经使用了Vim好多年,但是,水平仅仅停留在修改配置文件的水平。不会把它当做主要的编辑器,更不会用它进行编码开发。最近,童钢老师提醒了我,作为运维人员,Vim需要用得更加熟练一些,最好能把Vim作为默认编辑器使用。
所以,本文决定研究一下更高阶的Vim使用技巧,主要参考 优雅玩转Vim 。
VimrcVimrc指的是Vim的配置文件, rc=run command ,Vim 的全局配置一般在 /etc/vim/vimrc 或者 /etc/vimrc ,对所有用户生效。用户个人的配置在 ~/.vimrc 。
如果只对单次编辑启用某个配置项,可以在命令模式下,先输入一个冒号,再输入配置。举例来说, set number 这个配置可以写在 .vimrc 里面,也可以在命令模式输入。
配置项一般都有”打开”和”关闭”两个设置。”关闭”就是在”打开”前面加上前缀”no”。
" 打开 set number " 关闭 set nonumber
上面代码中,双引号开始的行表示注释。
查询某个配置项是打开还是关闭,可以在命令模式下,输入该配置,并在后面加上问号。
:set number?
上面的命令会返回number或者nonumber。
如果想查看帮助,可以使用help命令。
:help number
更多内容参考 Vim 配置入门 。
有一些大神把Vim配置得非常炫酷,比如 amix 和 humiaozuzu 。
四种模式 普通模式进入vim后默认普通模式,可以进行移动、复制、粘贴、删除、修改等。其他模式点击 Esc 返回普通模式。
可视模式对一块区域进行操作,就像windows中的鼠标选中。普通模式下点击 v 进入可视模式。
插入模式插入模式和普通文本编辑器相同,可以进行输入和删除。普通模式下点击 i 进入插入模式。
命令模式在命令模式中可以执行一些指令,就像在shell里一样。普通模式下点击 Shift + : 进入命令模式。
快捷键 移动跳转为了减少右手移动距离,h可代替左,j可代替下,k可代替上,l可代替右。
0移动到行首,Shift + 6也是移动到行首(不包含空格)。Shift + 4移动到行尾。
w光标正向移动到下一个单词,3w正向移动3个单词,b反向移动。e正向移动到下一个单词词尾,ge反向移动。W(Shift+w)表示忽略特殊字符,比如逗号句号等。
gg跳回第一行,10gg跳到第10行,G跳到最后一行。g、Ctrl+g显示文件信息。
f、空格,跳到下一个空格。
>>右缩进,<<左缩进。
多行缩进,进入命令模式,输入:
75,80> 75>6
删除复制yy复制一行,内容存入无名寄存器和0号寄存器。
准确地来说,Vim中没有删除,只有剪切。dd剪切一行,内容存入无名寄存器和1号寄存器。
p粘贴到光标下一行,P粘贴到光标前一行。
u撤销上一步的操作。
ctrl+r重做。
命令模式下输入 reg 可以查看寄存器。
yw复制当前单词,y2w复制正向两个单词。x复制当前字符。
dw删除当前单词,dj删除下一行,dk删除上一行,dh删除左边一个字符,dl删除当前字符。
d、Shift+6删除到行首,d、Shift+4删除到行尾。
3dd向下删除3行,5dw正向删除5个单词。
修改查找shift+i,跳到行首并进入插入模式;shift+a,跳到行尾并进入插入模式。
o进入下一行插入模式,O进入上一行插入模式。
3i进入插入模式,输入内容,Esc,输入的内容会被复制3次。
5o进入下一行插入模式,输入内容,Esc,输入的内容会插入5行。
~单个字符大小写转换,g~w整个单词大小写转换,g~$整行大小写转换,.对上一个操作重复。
fa在行内查找a,Fa在行内反向查找a。
/word查找word,n查找下一个,N查找上一个。在命令模式下设置 set hlsearch 可以高亮显示。
进入命令模式,进行替换:
:s/oldword/newword/g :%s/oldword/newword/g
r替换单个字符,shift+r替换当前行,cw替换当前单词,c$修改光标后的内容。
多文件编辑假设有buffer1.txt、buffer2.txt、buffer3.txt三个文件,那么可以使用 vim buffer* 打开三个文件。当前显示buffer1.txt,进入命令行模式,查看缓冲区列表:
:files :buffers :ls
badd buffer4.txt 打开一个缓冲区, bn 切换下一个缓冲区, bp 切换上一个缓冲区, bf 切换到第一个缓冲区, bl 切换到最后一个缓冲区, b3 切换到第三个缓冲区, b buffer1.txt 切换到buffer1.txt, ball 编辑所有缓冲区, 1,3bd 删除1-3缓冲区列表, %bd 删除所有缓冲区列表, qall 退出所有。
bufdo set number 所有缓冲区设置number。
多窗口与标签分组vim -o3 buffer* ,分屏打开三个文件,垂直方向分屏。 vim -O3 buffer* ,分屏打开三个文件,竖直方向分屏。
ctrl+w、s垂直复制分屏,ctrl+w、v水平复制分屏,ctrl+w、q删除分屏。
sp buffer4.txt 打开buffer4.txt并且上下分屏, vsp buffer4.txt 打开buffer4.txt并且左右分屏。
ctrl+w、h向左移动,ctrl+w、j向下移动,ctrl+w、k向上移动,ctrl+w、l向右移动。
ctrl+w、+增加高度,ctrl+w、-减少高度,ctrl+w、=设置高度相等。
标签里面可以包含多个窗口,使用类似于buffers。
命令模式下, tabnew 创建标签, tabfind 查找并在新标签中打开文件, tabs 查看打开的标签列表, tabclose 关闭当前标签页, tabonly 只保留当前标签页, tabn/p/first/last 切换标签页, tabm 0 将标签页放到第一个位置。
普通模式下, gt/gT 切换标签页。
文本对象和宏文本对象:w代表word,s代表sentence,p代表paragraph,此外还有textblock块对象。
操作:
{operator}{i}{object} {operator}{a}{object} daw = delete a word ==a==n object: include the tail space ciw = change inner word ==i==nner object: not include the tail space
viw选中单词,v3iw选中三个单词,vis选中句子,vip选中段落,vi(选中圆括号中的内容,vi[选中中括号中的内容,vit选中标签中的内容。使用宏输入1到99:
普通模式下,o进入下一行插入,输入1,Esc返回普通模式,qa开始录制,yyp复制粘贴一行,ctrl+a当前数字加一,q完成录制,97@a执行97次。
Visual模式在可视模式下,可以对一个文本块的整体进行操作。可视模式有三种子模式,v激活面向字符的可视模式,V激活面向行的可视模式,ctrl+v激活面向列块的可视模式。
gv重选刚才选择的选区,o在选择区两端跳动。
ctrl+v、3j垂直下拉三列,r进行替换。
ctrl+v、3j垂直下拉三列,e选择单词直到词尾,c进行单词替换,输入完成,Esc。
ctrl+v、3j垂直下拉三列,$选择到行尾,A进行插入,输入完成,Esc。
后记至此,已经系统学习了Vim的高阶知识点,包括Vim配置、四种模式、快捷键、多文本编辑、多窗口标签、文本对象和宏、可视模式等。接下来,就是在学习工作中多多使用Vim,最终熟能生巧。