vim使用技巧

导入

今天朋友问我vim好像不好用,为什么这么多人喜欢用。我说让我看看你是怎么用的,结果他就方向键上下左右移动,i 插入,然后退格慢慢删除单词,再修改成新的单词,然后esc :wq保存。我说这就难怪不好用了,不过好歹他还知道使用多行复制和粘贴。

所以今天我就想写篇博客,简单介绍几个我觉得vim中非常好用的命令和技巧,不涉及任何的插件,vim的插件是非常强大的,但是不用插件,vim已经足够好用。

正文

  • ia的使用

    这里我说的并不是插入命令的ia,而是配合c,d,v,y命令的ia,以最常用的ci组合为例,可以理解为change in ..,在什么之中修改。比如ciw,表示在单词之中修改,有些读者可能修改一个单词的内容,会使用w移动到单词的首部,然后再使用dw删除这个单词,最后还要使用i进入插入模式,甚至有的就像我这位朋友一样,直接进入插入模式,然后慢慢退格删除。其实我们只要光标移动到这个单词上,不论在单词的什么位置都可以,不需要特地移动到单词首部或者尾部,直接普通模式下输入ciw就可以删除这个单词,并且自动进入插入模式,而如果只是想删除这个单词,不进入插入模式,就是用diw,意思是delete in word,同样还有yiw,viw分别表示复制和视图模式选中这个单词。下面为了简洁,我都用ci举例,yi,vi,di都是同理。

    那么a又是什么呢?ca其实可以理解成change around,和ci的区别就是,后者只删除本身,不包含包围的符号,而前者除了删除本身还包括包围本身的符号。以ci'为例,表示删除单引号'包围的内部内容,并且进入插入模式,但是保留单引号,那么ca'就是删除包括单引号,并且进入插入模式,知道这个区别就可以了,接下来a也不专门说明。

    看到ci'你可能已经想到,其实很多的包围结构的内容,都可以这样修改,比如删除整个小括号里的内容,并且进入插入模式,只需要ci)即可,同理]}>中括号大括号,尖括号都是一样的,大括号我们直接修改一个结构,尖括号我们可以方便修改C/C++头文件。

    ciw,其实单词也就是被空格包围的内容,同样vim中还有一个概念,叫段落p,段落其实就是被空行包围的内容,一段连续内容上下都有空行的话,比如函数,结构体,类等等独立的代码块的情况,直接使用cip可以直接删除整个段落并进入插入模式。

    除此之外,cdvy还可以配合f,t使用,f,t是vim的两个命令,用于在同一行内快速移动光标,分别表示find,to,比如我想直接定位这一行斜杠/的位置,可以直接f/或者t/,有多个目标的话就按顺序移动,或者可以2f/手动指定跳转到第二个斜杠处,这也是非常有用的命令。和c配合后,可以这样cfo,表示修改当前光标位置到下一个字符o中间的所有内容。

  • 函数级跳转

     光标跳转效率是vim使用高效的关键,除了常用的w,b,我们还应该熟练上面提到的f,t,以及函数级别的跳转[[,]],[m.]m,分别表示表示跳转到上一个顶层函数,下一个顶层函数,上一个成员函数,下一个成员函数。所谓顶层函数,其实就是代码块,包含类,结构体或者外部函数。

除了跳转,还有非常常用高效,但是发现很多人并不知道的命令,那就是返回跳转。使用`(左上角esc下面的按键),连按两次可以立即跳转到上次跳转前的位置,比如我正在修改一个函数,但是突然要稍微去修改另一个函数,修改完就回来,这时候我们可以使用寄存器,但是也可以直接跳转到那一行,然后返回跳转就能回来。还有配合.可以返沪上次编辑的位置,相对用的更多。

  • .的使用

.命令表示重复上一次命令,可以记录上一次编辑的命令组,没错,可以记录一系列的命令和编辑组合,非常的实用,比如我要改名好几个不同的单词变成一个名字,我们可以移动到其中一个单词上然后ciw修改这个单词,然后esc退出编辑模式,然后光标移动到其他要修改的单词上的时候,直接.就可以自动重复上面的操作流程,也就是ciw,输入新的名字,esc退出编辑模式,也就是可以直接改好名。

.配合u撤销命令,可以非常方便的进行代码的修改,修改代码发现改的不好,直接u撤销,然后发现其实还不错,就.可以撤销刚才的撤销。

总结

就简单说下我个人非常常用的几个命令,cdvy+i/a+包围符号]],[[,]m,[m函数跳转,f,t行内定位,还有返回跳转,和.命令。还有mark标记没有说,就是m{mark}标记一个位置,然后使用esc下面的键+{mark}就可以返回标记位置,很方便,尤其是大写字母的标记名,可以跨缓冲区跳转,对于代码的编写效率提升明显。此外还有寄存器的使用也相对常见。