浅说一下VIM中的一些技巧

纪念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实用技巧》里面的一个表格大致给大家看一下,如何操作。

569f01f825a0454da0ef1181f6cb8a67.jpg

 其实这里面说的回退就是我们说的撤销,当你发现一些地方写错的时候,或者你删错东西了,就可以按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{ 选中{}里面的内容含最外层{}

那么这次文章就写到这里。下次介绍命令行模式,查找,替换和正则表达式。

  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值