20 个 Vim 实用技巧

我是 Vim 的忠实用户,从开始编程起,就使用 Vim 作为编辑器。在我看来,Vim 的强大之处有三:

  1. 快速定位;
  2. 宏;
  3. 不计其数的插件。

在使用 Vim 的过程中,我从社区学习到很多有用的技巧,自己也总结和掌握了一些。正是这些技巧让我得以在个人的编程经验中,还算得心应手地使用 Vim。本文是我对自己平常使用的一些用法技巧的分享,这些技巧不借助任何插件,全部是 Vim 本身提供的功能。(当然这绝不是在否定插件的作用,只是说,编辑器本身可以提供或者达到的效果,则尽管用,keep it simple。)

1. 快速 esc

  • 模式:insert
  • 按键:<C-[>
  • 说明:返回到 normal 模式,等于按下 esc。

2. 翻页

  • 模式:normal
  • 按键:<C-f> / <C-u>
  • 说明:向下/向上翻页。

3. 交换字符

  • 模式:normal
  • 按键:xp
  • 说明:交换两个字符位置。
  • 引申:ddp 交换两行位置。

4. 搜索 word

  • 模式:normal
  • 按键:*
  • 说明:光标在一个 word 中间时,按下星号 * 能向下搜索这个 word;之后再按 n 跳到下一个,N 跳到上一个匹配位置。
  • 引申:井号 # 向上搜索这个 word。

5. 替换 word

  • 模式:normal
  • 按键:cw
  • 说明:替换当前 word,即删除当前 word 并进入 insert 模式。实际上,上述说法只适用于这种情况:光标处于 word 的开始字符处。如果光标处于 word 中间,那么该命令将删除光标至 word 结束字符处之间的字符,并进入 insert 模式。

6. 重复操作

  • 模式:normal
  • 按键:.
  • 说明:重复上一个操作。比如,技巧 4 中使用 *# 搜索到的 word ,如果想替换这些 word ,那么可以使用 cw 替换掉,之后再按 n/N 跳到下一个希望替换的 word 那里,接着按 . 就会重复之前的替换了。

7. 全局替换

  • 模式:normal
  • 按键::g/pat1/s//pat2/g / :%s/pat1/pat2/g
  • 说明:全局替换,将整个文档中的 pat1 全部替换为 pat2

8. 局部替换

  • 模式:visual
  • 按键::s/pat1/pat2/g
  • 说明:将选中区域内pat1 全部替换为 pat2

9. 替换行

  • 模式:normal
  • 按键:cc / S
  • 说明: 替换整行,也就是删除当前整行并进入 insert 模式。

10. 改变大小写

  • 模式:normal
  • 按键:~
  • 说明:改变当前字符的大小写。在 visual 模式下,改变所选字符的大小写。
  • 引申:uU 分别将选中字符变为小写和大写。

11. 跳到上一位置

  • 模式:normal
  • 按键:`'
  • 说明: 跳到上一个位置,会更新 jump 的历史,也就是说,多次使用该命令会在两个位置之间跳来跳去。
  • 引申:<C-o> 也可以跳到上一个位置,不过它不会更新 jump 历史,会一直跳到文件关闭为止。

12. 标记位置

  • 模式:normal
  • 按键:ma
  • 说明:将当前位置标记为 a,之后可以按 `a 跳到此位置。a 可以为其他字母。

13. 多行操作

  • 模式:visual block(意即使用 <C-v> 选中的)
  • 按键:I
  • 说明:选中字符区域后,按 I 进入 insert 模式(光标处在选中区域的第一行),输入一些字符,按 esc 返回到 normal 模式,则针对第一行所作的操作将反映到所有选中的行上。这一技巧常用于多行注释(当然也有不少插件的多行注释更好用)。

14. redo

  • 模式:normal
  • 按键:<C-r>
  • 说明:redo,重新应用 u 命令所撤销的操作。

15. 替换字符

  • 模式:normal
  • 按键:r
  • 说明:替换当前字符,比如 ra 可以将当前字符替换为 a。
  • 引申:cl 可以删除当前字符并进入 insert 模式。

16. 快速缩进

  • 模式:visual
  • 按键:> / <
  • 说明:向右/左缩进。
  • 引申:mormal 模式可以 >> / << 来分别向右/左缩进当前行

17. 分割窗口

  • 模式:normal
  • 按键::sp
  • 说明:将当前窗口分割为两个,当然每个窗口的 buffer 还是同一个文件。

18. 括号跳转

  • 模式:normal
  • 按键:%
  • 说明:当光标处字符为 ()[]{} 中任意一个时,按下 % 可以跳到括号的另一半处。

19. sudo 保存

  • 模式:normal
  • 按键::w !sudo tee %
  • 说明:不小心打开了一个需要 sudo 的文件,而且做了不少更改?这条命令可以挽救。完整解释可参看 这里

20. 宏

  • 模式:normal
  • 按键:q
  • 说明:纪录宏。将多处相似的更改抽象为一个可共用的操作,能够节省大量时间。比如,按下 qa 开始记录,接着进行所需的操作,按下 q 结束。此时再到其他需要更改的区域,按下 @a 把刚才宏记录的操作应用到这一区域。另外,n@a@na 将会把宏 a 重复 n 次,n 可以为任意数字。

最后说一下关于 vimrc,个人愚见,别人的配置文件未必百分百适合自己,用一句时髦的话说,Vim 也是“需要调教”的。当然,一些公认的好习惯还是可以强迫自己去适应的,剩下的就需要自己慢慢摸索,慢慢总结了,最终找到自己觉得最舒服的使用方式。