纪念Bram Moolenaar
第一部分vim常用模式
严格来说vim的模式不只三种,不过最常用的是插入,可视,正常(或者称为一般)三种模式。(了解更多请:h map-modes)
当vim启动时会进入正常模式,在这个模式下会把键盘键入的所有字符当成操作来处理,此时还不能正常的输入。
插入模式下可以正常编写内容
可视模式用于选择一块区域进行操作
正常模式切换插入模式
用键盘键入i,I,a,A,o,O这些字母中的任意一个可以进入插入模式,以下是它们的用法
i在当前光标位置下进入插入模式
I(大写i)跳转到当前行首并进入插入模式
a在当前光标所在位置向前一格进入插入模式
A跳转到当前行末并进入插入模式
o 在下一行插入一个新行并进入插入模式
O 在上一行插入一个新行并进入插入模式
插入模式切换正常模式
按ESC
正常模式切换可视模式
在正常模式下键入v,V,CTRL-V可以进入可视模式。以下是它们的区别
v 是普通的visual模式。
V 是visual-line模式。
CTRL-V 是visual-block模式。
这里不仔细说,如果想了解更多,请看第三部分可视模式。
第二部分正常模式常用操作
除了i,I,a和A,其实vim正常模式下的操作遍布键盘,每一个字符都有它的使命。以下用它们的功能来分类。
移动光标操作
移动光标的操作非常多,不过这也是非常重要的操作,用好了可以摆脱鼠标完全靠键盘打字非常爽。
比较常用的分别有[count]h,[count]j,[count]k,[count]l,[count]e,[count]b,[count]w,[count]ge,f{char},F{char},t{char},T{char},[count]gg,[count]G,[count]|,^,$,%,{,}。
更多操作请:h
先说具体用法之前要看懂他们,用[]{}括起来的意思是传一个量,区别是使用[]代表它可以传也可以不用传,使用{}代表这个量必须传。
其中[count]代表一个数,如你所见这个数可以传也可以不传。{char}代表一个字符,这个字符必须传。
[count]h 光标向左移动count次,不指定count向左移动1次。
[count]j 光标向下移动count次,不指定count向下移动1次。
[count]k 光标向上移动count次,不指定count向上移动1次(不指定的都是这样,后面就不再叙述了)。
[count]l 光标向右移动count次
[count]e 如果当前光标不在单词末尾则跳到当前单词的末尾,否则跳到下一个单词的末尾,count是指将此命令重复执行count次(后面不再叙述)
[count]b 如果当前光标不在单词开头则跳转到单词开头,否则跳到上一个单词的开头
[count]w 跳转到下一个单词的开头
[count]ge 跳转到上一个单词的末尾
f{char} 在当前光标下不含当前光标,向后搜索{char}字符,搜索到了跳转到这个字符的前面。如果有多个字符满足可以按;重复搜索。
比如fu,意思是向后搜索u字符,搜索到了跳到u字符所在位置的前面。
F{char} 在当前光标下不含当前光标,向前搜索{char}字符,搜索到了跳转到这个字符的前面。同样的按;可以重复搜索,特别的按,(逗号)可以反向继续搜索(这两个操作是适于f,F,t和T)。
t{char} 在当前光标下不含当前光标,向后搜索{char}字符,搜索到了跳转到这个字符的后面。
T{char} 在当前光标下不含当前光标,向前搜索{char}字符,搜索到了跳转到这个字符的后面。
[count]gg 跳转到第count行行首,没指定count跳转到第一行行首
[count]G 跳转到第count行行首,没指定count跳转到最后一行行首
[count]|跳转到当前行的第count字符上,没指定count跳转到行首。
^ 跳转到当前行行首
$ 跳转到当前行行尾
% 匹配到对应括号处,可以匹配(),[],{},<>,和xml标签。
{ 跳转到上一个段落,vim判断段落是两段文字间有一个空行,vim在跳转时会跳到空行里面。所以建议打代码时可以将代码用空行隔开进行分块编写不仅美观,而且操作也方便!
} 跳转到下一个段落。
多加练习这些跳转操作你已经入门vim了!
删除复制粘贴
删除[count]["x]d[count]{motion},复制[count]["x]y[count]{motion},粘贴[count]["x]p
这里有两个全新的参数motion和"x,其中motion是移动操作(刚刚已经学过了),"x是引用寄存器,关于寄存器我们以后再讲。
[count]["x]d[count]{motion} 说它是删除其实他更像剪切,删除之后可以用p粘贴出来,count是一个老朋友了都是代表着次数,而{motion}就是我们刚刚学过的跳转操作。比如下面几个命令
3dj 删除当前行并向下删除3行(一共删除4行)
4dk 删除当前行并向上删除4行(一共删除5行)
dgg从当前行删除到开头行
dG从当前行删除到末尾行
dge 从当前位置删到上一个单词的末尾(含末尾)。
dw 从当前位置删除到下一个单词的开头(不含开头)。
其实包不包含某个位置你只需要仔细观察这些motion操作到底跳转到哪里你就知道了。
关于2dw和d2w以及类似的操作,你会发现结果都是一样的(都是删除当前行以及下面两行)。但是这两个命令有一点点区别,2dw是将dw执行两遍,而d2w是告诉d需要删除两个单词。
总之d可以和所有的跳转指令联合起来使用,当然也有一些特别的操作。比如daw和diw,看起来有点无厘头,这两个操作都是在删除当前光标下的单词,区别是daw会多删除一个单词后面的空格。
[count]["x]y[count]{motion} 它的用法几乎和d一样,区别是它是复制,不会删掉内容。
[count]["x]p 执行count次粘贴操作,粘贴的内容不仅仅可以是复制出来的,也可以是刚刚删除的,所以我也说d操作其实更像剪切!
重复执行,撤销和恢复撤销
我认为vim一大亮点就是极其方便的重复执行了。比如在学习移动光标时,你就已经学过f,F,t,T这四个搜索指令可以用;重复搜索,用,可以回退搜索。
下面用《vim实用技巧》里面的一个表格大致给大家看一下,如何操作。
其实这里面说的回退就是我们说的撤销,当你发现一些地方写错的时候,或者你删错东西了,就可以按u进行撤销操作。如果你发现撤销过多了,可以按CTRL-R恢复撤销。其中的文档查找,执行替换,和一系列修改(也就是寄存器操作),我们后面再讲!
第三部分可视模式
刚开始时就介绍了可视模式,进入可视模式的方法这里不再叙述,忘记的可以翻到最前面看一下。
最普通的visual模式,其实特别像你用鼠标选中一块文本一样,区别是在vim中你需要hjkl移动选择的区域,而且在正常模式下你学习到的跳转也可以用在可视模式上!
visual-line模式,每次都会选中一行无论你的光标在第几个字符上。
visual-block模式,这个模式有点奇葩,用的不多,它是进行块选中也就是选中一个矩形。
删除复制
当你选择一块区域时可以用d进行删除,用y进行复制,当然在可视模式中它同样也有将内容放进寄存器,不过我们还没有讲,等到以后再说。
试着输入以下文本,并进入正常模式。
I am vimmer.
然后一次键入这些这些操作ved,试着自己解释一下刚才发生了什么?
重新选中上一次的区域
使用gv操作可以重新选中上一次的区域。
你会发现可视模式我叙述的特别少,因为很多东西你都可以从正常模式下搬过来,就比如现在你想复制一个代码块
int main(){
....;
}
现在你的光标在int main的m上,你如何复制这个代码块呢?
可以执行以下操作,f{v%y,解读一下f{跳到{的前面v进入可视模式,%跳转到匹配的}也就是选中了整个代码段,最后y进行复制。
还有更多的操作,只需要你有需求,就可以去思考,相信你很快就能熟悉vim的!
可视模式的特有操作
进入可视模式可以用iw,aw,i(,a(,i[,a[,i{,a{。
iw 选中当前光标下的一个单词
aw 选中当前光标下的一个单词和末尾的一个空格
i( 选中()里面的内容不含最外层()
a( 选中()里面的内容含最外层()
i[ 选中[]里面的内容不含最外层[]
a[ 选中[]里面的内容含最外层[]
i{ 选中{}里面的内容不含最外层{}
a{ 选中{}里面的内容含最外层{}
那么这次文章就写到这里。下次介绍命令行模式,查找,替换和正则表达式。