我的 Vim 日常使用

原生 vim 需要的配置不少,而且想要有一些特定自动补全需要的配置步骤就更多(iOS API),所以我主要是用 vim mode 插件。几乎主流的 IDE 应该都有 vim 插件,甚至 sublime text 都有 vim mode 可以开启。

和一条普世的需求一样,80%的使用需求由20%功能实现,vim 日常使用需要掌握的功能其实并不多。

insert mode edit mode

vim 与常见的文本输入软件最明显的区别是 insert mode 和 edit mode,这里的名字是我自己取的。正如这两个名字所透露出来的一样,在vim中输入和编辑是在两种不同的状态下进行。vim 可能真的是为程序员而成的编辑器,因为它所持的设计理念贴近编辑比输入更常用,和在开发过程中一样:维护工作要比新功能开发重要的多。所以进入vim 默认情况下是处于edit mode 此时无法进行输入,第一次打开vim 的人大概很多就在这里懵逼了。

光标移动

区分了这两种状态,并且明确edit mode 是默认之后,就可以开始进行其他vim操作了,首先依然从最明显的区别来,光标的上下左右移动,它们分别是

h 向左
j 向下
k 向上
l 向右。

大多数键盘其实都是有单独的上下左右键位的,除了大名鼎鼎的HHKB和一些61键小键盘。我自己还是更喜欢有独立的方向键这样在按IDE的快捷键的时候更方便一些。至于vim使用这四个键作为方向键,一方面是edit mode的得天独厚,一方面确实可以减少手部移动。总的来说有利有弊,我最终还是因为不习惯没有方向键的poker卖掉了。

vim的设计是用来处理英文文档的,所以对于英文来说除了每次一个单位的上下左右移动还有移动到下一个单词的首字母 w
移动到下一个单词的尾字母e
移动到上一个单词首字母b
移动到该行首部^
移动到该行尾部$
直接跳转到某一行 :50 跳转到50行
不滑动页面跳转到页面中部M(大写)
滑动页面将光标当前所在行移动到页面中部zz
滑动页面将当前行移动到页面底部zb
滑动到顶部zt
直接跳到第一行gg
直接跳到最后一行G
跳转到对应括号 %
向下翻半页ctrl+d
向上翻半页ctrl+u
跳到下一个空行 ctrl+]
对应跳到上一个空行是 ctrl+[
将 caps lock 键换成 ctrl 会降低按这些组合键的难度。以上都是在edit mode下直接按键就可以实现。除了这些内建的跳转按键,还是自定义位置跳转,或者说mark jump。在edit mode下按m紧接着一个字母就是用这个字母标记当前光标所在位置,将光标移动到当前文件其他任意位置点击’字母,就可以直接跳转到标记位置所在行。同理使用大写 M 可以实现跨文件跳跃。这个功能对于阅读代码、debug来说非常有用。

高效的光标移动是提高阅读编辑代码的第一步,毕竟我们只有一个光标位置可以进行输入。其他编辑器例如 sublime text emacs 和一些 IDE 在光标移动方面主要依赖组合快捷键,达到同样的效果 vim mode 下的移动我觉得更高效。

输入

在 vim 中进入 insert mode 的方式有很多种,常用的如按键 i 在当前位置后插入,按键 a 在当前位置前插入,组合按键 cw 删除当前位置到词尾并开始输入。输入完习惯直接按 ESC 退出 insert mode。按键 o 新起一行开始输入,大写 O 则是在当前行前面新起一行开始输入。

删除

dd 用来删除当前行
3dd 删除 3 行
dw 删除到词尾
db 删除到词首,这个按起来挺别扭
d + } 删除到下一个空行
d + { 删除到上一个空行

其他编辑功能

撤销上一步操作:按键 u
撤销撤销那步操作:ctrl + r
查找:edit mode 下输入 /word 查找当前位置之后的 word 单词位置,紧接着按 n 跳到下一个 word 出现的位置,N 跳到上一个出现的位置
指定行号间字符替换:在 edit mode 下输入:1,10s/one/two/g 回车会将第1行到第10行之间的字符 one 全部替换成 two,这个是最简单的应用,替换功能还可以增加更细致的配置
重复行为宏录制:按下 q+字母 开始录制,也就是开始进行任意操作,退出 insert mode 再次按下 q 结束录制,录制好之后将光标移动到合适位置,点击 @+字母 应用宏就可以将上一次的操作完成的重复一遍,要注意录制过程中的操作不要依赖于录制时的字符特点,例如字符长度,这样才更通用
visual mode:在 edit mode 下按下 v 会进入 visual mode,这个时候可以选择多行进行编辑,例如选择后按下 y 是复制,在任意位置按下 p 是粘贴。
visual block mode:在 edit mode 下按 ctrl+v 进入,这要应用是在多行的同一个位置进行插入。这个我总是记不住,步骤挺多,sof 一下就有。这是唯一一个我知道的 sublime text 的字符插入强于 vim 的地方,在 sublime text 中按着 option 外加鼠标点击可以选中多个地方同时输入,vim mode 下似乎不行。

总结

这些就是我日常使用中会用到的全部了,我没有自定义 vimrc 配置文件,其他重要的功能大多依赖 IDE,例如文件树结构,函数跳转,文件访问历史跳转,快捷文件查找、打开。这些功能在原生 vim 里大多通过插件实现,这就是我不喜欢原生 vim 的地方,配置太多了,很多基本的功能都要插件实现,所以还是 sublime text 用的多一些。

另外 vim 的源代码烂到有人写博客吐槽,有人干脆另起炉灶 neovim,也是挺有意思。

补充

居然有一套强大的编辑被我忽略了,在 Vim 中可以实现一定的编辑功能,例如:在一行中任意位置删除到某一个字符 dt[被删除字符],全程可以理解为 delete to [被删除字符];还有直接删除一对符号之间的内容 di[符号],一对的符号包括各种括号和引号;前一个命令中 i 代表 inside 不会包括符号本身,如果要包含符号本身可以用 a,删除包含符号的全部内容就是 da[符号],以上几个例子中的删除也可以换成复制 y。

寄存器应用

一种常用的效果是当作一个多项的剪切板。使用 “1 指明接下来复制操作进入的寄存器名称,”1yy 复制当前行到寄存器 1 中,然后 “1p 粘贴寄存器 1 中存的内容。