| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 932 人关注过本帖, 1 人收藏
标题:vim下的补全功能
只看楼主 加入收藏
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
结帖率:96%
收藏(1)
 问题点数:0 回复次数:1 
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)
括号的里是我自己想的助记符。
 

它们的功能基本上顾名思义就可以了。区别一般是搜索关键字的位置不同。很多命令会用 '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= 来完成,所以设不设的也无所谓。)
搜索更多相关主题的帖子: 而且 主题 按键 怎么办 
2012-01-03 16:33
kazephyr
Rank: 2
等 级:论坛游民
帖 子:11
专家分:20
注 册:2008-9-22
收藏
得分:0 
thx for sharing!
2012-01-04 05:38
快速回复:vim下的补全功能
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017315 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved