导入
今天朋友问我vim好像不好用,为什么这么多人喜欢用。我说让我看看你是怎么用的,结果他就方向键上下左右移动,i
插入,然后退格慢慢删除单词,再修改成新的单词,然后esc :wq
保存。我说这就难怪不好用了,不过好歹他还知道使用多行复制和粘贴。
所以今天我就想写篇博客,简单介绍几个我觉得vim中非常好用的命令和技巧,不涉及任何的插件,vim的插件是非常强大的,但是不用插件,vim已经足够好用。
正文
-
i
和a
的使用这里我说的并不是插入命令的
i
和a
,而是配合c,d,v,y
命令的i
和a
,以最常用的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}
就可以返回标记位置,很方便,尤其是大写字母的标记名,可以跨缓冲区跳转,对于代码的编写效率提升明显。此外还有寄存器的使用也相对常见。