vim下的补全功能
经常有人问,“vim 里忘了相关的功能按键怎么办?”或者是问“到哪能找到按键与功能对应的列表呀?”其实手册里有总结这些的::h quickref它会按功能主题,列出绝大部分的命令。
如果连这个指令也记不住怎么办?其实也没事,只需 :h,看看分隔线下的第一个帮助是什么?正是 quickref。但英文不好也许是个短坂。
我找到了论坛里其它人发过的帖子:
https://bbs.bccn.net/thread-184649-1-1.html
https://bbs.bccn.net/thread-355444-1-1.html
都比我这回要说的东西基础。而且往往基础的东西更实用。
我这个帖子主要是谈一谈 vim 里的补全功能。当然说的费话也比较多,可能只有变颜色的那几块值得看看。
当然,虽然想讲的细一些,可是完全不知道 vim 是什么,或者极不熟悉的人可能还是看不懂。如果英语还好,或者是你本地的 vim 文档是中文的,那么直接
:h ins-completion出来的东西绝对比我这写的要好的多。也要更详细。
以下正文:
凡是写过程序的人,一定知道补全功能非常有意义。很多编辑器都有这个功能。
它除了能够节约大量的打字时间以外,更重要的是它可以省去很多切换到头文件中查看的工作。也不用担心会拼错。
当然,后来我确实也发现,如果补全功能足够强大的话,在写作一些非程序代码时也能很好地发挥作用。同样这些工作除了可以节约打字时间以外,也可以减少很多错误的发生。
vim 的补全功能就很丰富。当然我爱用 vim 的补全功能的另一个很重要的原因是因为它很灵活,键按的比较快,可以用很短的时间插入我想要的内容。
vim 里一共有以下 13 类补全(均在插入模式(insert-mode)下进行):
1 整行补全 C-x C-l (line)
2 当前文件补全 C-x C-n (next)
3 字典补全(dictionary-) C-x C-k (key)
4 词汇补全(thesaurus-) C-x C-t (thesaurus)
5 包含文件补全 C-x C-i (include)
6 标签补全 C-x C-] (vim 里的标签命令大多都用])
7 文件名补全 C-x C-f (file)
8 定义或宏补全 C-x C-d (defination)
9 命令行补全 C-x C-v (vim-cmd)
10 自定义补全 C-x C-u (user)
11 全能补全(omni-) C-x C-o (omni)
12 拼写建议 C-x s (C-x C-s) (spell, suggeste)
13 默认补全 C-n (next)
括号的里是我自己想的助记符。 2 当前文件补全 C-x C-n (next)
3 字典补全(dictionary-) C-x C-k (key)
4 词汇补全(thesaurus-) C-x C-t (thesaurus)
5 包含文件补全 C-x C-i (include)
6 标签补全 C-x C-] (vim 里的标签命令大多都用])
7 文件名补全 C-x C-f (file)
8 定义或宏补全 C-x C-d (defination)
9 命令行补全 C-x C-v (vim-cmd)
10 自定义补全 C-x C-u (user)
11 全能补全(omni-) C-x C-o (omni)
12 拼写建议 C-x s (C-x C-s) (spell, suggeste)
13 默认补全 C-n (next)
它们的功能基本上顾名思义就可以了。区别一般是搜索关键字的位置不同。很多命令会用 'complete' 来确定搜索范围。'path' 会用来指定头文件的搜索位置。
字典补全和词汇补全分别用 'dictionary' 和 'thesaurus' 来指定搜索位置,因此适合用文件类型插件来定制补全。有些时候这就已经很够用了。
自定义补全(user defined completion) 和 全能补全(omni completion) 可以提供一个自定义函数来完成补全。所以可以完成非常复杂的补全任务。当然开发脚本本身会浪费很多精力,所以只有当你长期需要完成某类特殊的补全,而且其它补全又不能很好的完成工作时,它们才显得很有用。
我一直也没学补全函数的写法。一是以前 vim 的水平比较烂,基本功能都用不熟。二是一直觉得其它补全功能也能将就着完成任务。不过后来随着写的 vim 脚本多了,尝到了写些简单脚本做大量辅助工作的甜头。也觉得一直“将就”不是长久之计,所以最近开始准备学学。学之前先整理整理有关补全功能的相关知识。学完之后没准会再总结总结学习心得的。
详细内容可以自己阅读参考手册
:h ins-completion
简单介绍一下补全的用法:
简单来说,只要在打字的时候按一下 C-n 就可以触发补全了。如果想触发不同类型的补全,先按一下 C-x 然后按想要的功能对应的键就可以了。很快你就会知道补全究竟是干什么的。
一般使用补全之后,按按 C-n, C-p 就能找到自己要的内容。接着往后打字就行了,补全的内容会自动插入。但也有时在补全之后,不会接着打字了。这时可以用 C-y (yes) 接受当前选中的补全;或者没有合适的补全,那么用 C-e (end) 来取消补全,恢复补全之前的样子。
如果补全出来的东西,和预想的出入比较大,可以按一下退格键(backspace),进入第二阶段(second state),这时再打字不会退出补全,而是可以动态的“编辑”补全列表。这时用空格呀,或者 C-y 就可以接受补全了。当然也可以随时 C-e。
相关功能可以用一用,体会一下。开始用的不熟也许不习惯,但我想用不到10次应该就会爱上这些功能。另外大部分的时候,并不需要“编辑”补全列表。如果用的合理的话,一般第一阶段就够了,用用 C-n, C-p 很快就可以补全想要的东西。
手册里还建议使用以下的映射:
:inoremap ^] ^X^] :inoremap ^F ^X^F :inoremap ^D ^X^D :inoremap ^L ^X^L我觉得有些映射很不错,的确可以用一用。
(不知道怎么用的看这:
进入 vim 后,用 :e $MYVIMRC,来编辑 vimrc 文件。
把刚才那几行加在文件的最后就行了。注意 ^L 这样的东西要用
C-v C-l 的方法来插入。^X ^] 的也是类似。
弄好之后就可以用 C-l 来调用本来需要按两下键的整行补全了。)
当然作这些映射会覆盖这些键本来的功能。我把它们原先的功能列在下面,大家可以自己酌情定制。(以下按键均指在插入模式下)
C-l 当设置 insertmode 时,用于返回普通模式(至少我觉得 insertmode 没什么用,值得覆盖。)
C-k 插入二合字母(digraph)。(这个功能我偶尔会使使,有的时候还是比较方便的。如果不用这个功能的话,可以覆盖。)
C-t 增加缩进。(程序员的话都会用这个功能,不建议覆盖。另外它和上面那个都不设置,从补全的角度看其实挺谐调的。)
C-i 就是 tab 键。(最好就别动手脚了。如果想让 tab 有更多的功能,建议写个函数,而不是简单的映射一下。)
C-] 触发缩写功能(abbreviation)。(如果没有特殊要求,一般并不用这种方式触发缩写,可以覆盖)
C-f 默认用于重缩进当前行。参见 cinkeys-format。(个人认为不常用,我更倾向于用 C-t, C-d 来调整缩进。)
C-d 减少缩进。(和 C-t 是一对,个人角度不建议覆盖。如果你喜欢退出插入模式用 > 和 < 来调整缩进,那么可以覆盖。)
C-v 用于插入键盘字面值,或按字符编码插入字符(应该是很常用的一个功能了吧,要是没了可能挺头痛的。最好别覆盖)
C-o 在插入模式下执行一条普通模式下的命令。(偶尔会用,但退出执行完了再手动返回插入模式也行。个人没有偏好。)
C-s (好像没有其它功能。另外这个拼写建议的功能可以在普通模式下用 z= 来完成,所以设不设的也无所谓。)
C-k 插入二合字母(digraph)。(这个功能我偶尔会使使,有的时候还是比较方便的。如果不用这个功能的话,可以覆盖。)
C-t 增加缩进。(程序员的话都会用这个功能,不建议覆盖。另外它和上面那个都不设置,从补全的角度看其实挺谐调的。)
C-i 就是 tab 键。(最好就别动手脚了。如果想让 tab 有更多的功能,建议写个函数,而不是简单的映射一下。)
C-] 触发缩写功能(abbreviation)。(如果没有特殊要求,一般并不用这种方式触发缩写,可以覆盖)
C-f 默认用于重缩进当前行。参见 cinkeys-format。(个人认为不常用,我更倾向于用 C-t, C-d 来调整缩进。)
C-d 减少缩进。(和 C-t 是一对,个人角度不建议覆盖。如果你喜欢退出插入模式用 > 和 < 来调整缩进,那么可以覆盖。)
C-v 用于插入键盘字面值,或按字符编码插入字符(应该是很常用的一个功能了吧,要是没了可能挺头痛的。最好别覆盖)
C-o 在插入模式下执行一条普通模式下的命令。(偶尔会用,但退出执行完了再手动返回插入模式也行。个人没有偏好。)
C-s (好像没有其它功能。另外这个拼写建议的功能可以在普通模式下用 z= 来完成,所以设不设的也无所谓。)