2010年02月27日 Saturday , 3,366 次点击

关于自动补全,最初用的是SuperTab,那个时候Vim的自动补全插件寥寥无几,也就SuperTab比较有名。不过实际使用过程中这个插件给我的体验不是很好,原因是补全的准确度不高。

后来出了一个新插件,AutoComplPop,功能和使用都很简单。但是很快我就又用回SuperTab,原因是AutoComplPop在输入的同时实时地查询匹配的关键词,导致输入极不流畅,效率很低。

一直就这么凑合着用着SuperTab,随着这个插件版本的更新,旧功能不断地完善,新功能也接二连三地引入,SuperTab在匹配关键词的准确度上有了一些改善,但是新的问题又出现了。SuperTab后来加入一个新功能,对于程序源文件,可以在其引入的文件以及API文件中匹配关键词。比如假设我当前正在编辑a.php,在a.php中有include ‘b.php’;这样的语句,当我输入array并按下Tab键时,SuperTab不但会在当前文件中查询所有匹配项,还会到b.php中查询,如果配置过vim、指定一个包含了php的API的文件,则SuperTab还会自动从这个文件中查询匹配项。按理说这个功能的理念很好,但问题就在于SuperTab做的是实时查询,如果源文件中包含的文件较多,各个文件又较大,问题就显而易见了。我不得不在写程序时小心地使用Tab键,否则有时就会出现按一下Tab键然后等着Vim在那狂搜的情况。

前两天发现了NeoComplCache,光看名字就让我有点儿兴奋,一般使用缓存的速度都很快。这个插件会在Vim打开文件的时候对上下文作一个索引,并把索引结果保存到缓存中。同时,文件更改的内容会在保存的时候被索引。此外,NeoComplCache支持多种关键词索引模式,例如它会判断当前路径下的文件或目录的名字是否匹配补全条件,也可以从缓存的程序语言API中匹配补全条件。到此为止,它就解决了SuperTab和AutoComplPop共同的效率问题,并具备它们各自的长处。看了一遍文档,发现这个插件的功能比较细致,大概有以下一些特点:

1、使用缓存,自动补全时效率高;
2、生成的关键词列表准确;
3、支持下划线分割的关键词,如apple_boy_cat,就可以只输入a_b_c,然后补全;
4、支持驼峰格式匹配关键词,如AppleBoyCat,就可以只输入ABC,然后补全;
5、既可以像AutoComplPop那样在Vim中输入的同时自动弹出补全列表,又可以自定义快捷键手动触发;
6、支持从文件名和目录名中匹配补全条件;
7、对于程序源文件,支持从语言API中匹配补全条件;

NeoComplCache的缺点是文档不全,虽然从只言片语中发现它还支持Snippet,但从文档中没有找到足够的有用信息。加之一直用SnipMate感觉不错,所以目前还是用它来实现snippet功能。

这就有个搭配问题:虽然NeoComplCache不存在补全时的效率问题,但我仍然打算只在需要补全时才用快捷键触发此功能,最主要的原因是我既希望用Tab键触发SnipMate的代码块补全功能,又希望修SuperTab那样用Tab选择补全列表中的选项。也就是要达到只用Tab键就可以完成打开自动补全列表、补全列表选项选择和SnipMate代码块替换的效果。但是,如果将Tab映射到触发自动补全,则补全列表选择和SnipMate均无法使用Tab,反之亦然。

所以我想如果能让NeoComplCache、SuperTab、SnipMate和谐共存,那问题就解决了,几经摸索,终于找到了办法:

1、设置NeoComplCache不自动弹出补全列表,即在vimrc中加入:

let g:NeoComplCache_DisableAutoComplete = 1

2、由于NeoComplCache在手工模式下使用快捷键组合<C-X><C-U>打开补全列表,故设置SuperTab的默认补全操作为<C-X><C-U>,即在vimrc中加入:

let g:SuperTabDefaultCompletionType = ‘<C-X><C-U>

这样,NeoComplCache只负责补全关键词缓存的生成,SuperTab控制Tab键的行为并在需要触发补全操作时打开补全列表、进而在列表中的选项间移动焦点,而当光标前的关键词是snippet时,SnipMate会被优先调用并完成代码块的替换。

就在写这篇文章的时候,我突然觉得NeoComplCache自动弹出补全列表+SnipMate的方式也挺好,只是这样就不能用Tab键选择列表中的选项了。

Tags :

随机日志

來留言吧!


Please copy the string ag04Fc to the field below:

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word

35 個留言

你好,博主,我想请教一下,这个插件最新版只有一个vba文件,应该怎么使用?能不能指点一下?我用的不是最新的,5.0的

简单地说就是先用Vim打开vba文件,然后输入命令“:so %”。
具体你可以google一下vimball。

 
 

let g:NeoComplCache_DisableAutoComplete = 1

最新的应该是

let g:neocomplcache_disable_auto_complete = 1

果然,你不提醒我都不知道,我现在用的还是4.x,最新的已经是5.1了,out了。

谢谢。

 
 

不知有没有办法在vim启动时自动执行定义在autoload子目录下的冒号命令?
在.vimrc或after等目录中配置,都不行。提示找不到命令,只能在启动vim后手动执行。
autoload中库函数命令,是在何时加载的?

没明白你的意思,vimrc中设置autocmd VimEnter不行吗。

 
 

用了neocomplcache,补全是很快,但是有个恼人的问题,
比如在看linux内核源码时候,第一次跳转到函数定义时会因为
进行cache,会卡住一会儿,对于大文件的话要卡好几秒,
不知道有什么好方法?
谢谢!

原理决定没有办法,不过配置高的电脑上时间会很短,尤其是Linux下。

我是禁止它自动启用,因为看代码的时间比较多,在写代码的时候再用一个快捷键手工打开它。

 
 

发现如果设置了vim的path选项,添加C++标准库的头文件目录,那么一旦在c++源文件中包含五个以上头文件时,补全时会经常出现假死现象,尤其是在进行成员函数、对象补全时。
去除path中的c++头文件位置后,正常。
发现这个插件会递归的扫描被包含的所有头文件。难以理解这有什么用–stl成员函数、对象补全有准备好的tags文件、关键字等补全有关键字列表文件,这些neocomplcache都能识别并自动补全,为什么还要递归扫描那些头文件?
文档中提到有一个g:neocomplcache_include_paths 参数表示头文件位置,如果不定义,它就会使用’path’值。可我设置了和path一样的值,结果却打开C++头文件时出错。没有找到禁用头文件扫描的参数,所以想把g:neocomplcache_include_paths设为空来禁用它,结果还是错。
neocomplcache是一个很好的插件,不过他的文档和参数像天书一样晦涩难懂。

没错,这插件的作者貌似不是英语国家的人,有不少话说得莫名其妙。尤其动不动就“Because it is complicated, refer to xxx.vim.”,喜欢让人看他源码,很可爱。

实在不行就给他发邮件,或者就refer to include_complete.vim,改他代码,给他禁用了。

看名字应该是日本人。感觉日本的做Vim和火狐插件的不少呵。

 
 
 

我只用了NeoComplCache 和 SnipMate,没有用supertab,请问为什么snipmate就是没有效果了呢,关闭了neocomplcache的自动补全功能,按tab snipmate还是没效果。兄弟这问题如何解决阿?可否告知

首先得保证vimrc里设定了“filetype plugin on”,
其次你所编辑的文件的文件类型要有对应的snippets文件,
第三你在Tab前必须输入正确的snippet名称

我这里是按下tab能看到有snip项,但是回车选中了还是没有出来

检查一下您的使用情况和我的是否一致,我只试过NeoComplCache+SnipMate+Supertab,NeoComplCache貌似也是支持snippets的,但是找不到详细的文档。

按下tab能看到snippets是因为它们被缓存或被supertab找到了,但并不表示它们是被当作snippets列出来的,它们只是被当作了用来自动补全的关键词,显然snippets功能没有生效。

我终于搞出来补全了,
因为我这里无法禁用自动弹出补全窗口,无法使用tab键来进行snippet展开,
不知道为什么,我现在干脆就使用自动补全,
imap (neocomplcache_snippets_expand)
smap (neocomplcache_snippets_expand)
使用CRTL+E来进行snippet补全。
多出一个问题,snippet补全后如何编辑后续的项?
比如for:
for ($ = 0; $1 < ${2}; $1++) {
${0}
}
这些如何在$,$1,${2},${0}之间直接挑战替换编辑?
我每次都得把这些删掉,然后在编辑,
这样导致慢,不用snippet直接写for可能还更快些
谢谢!

(Comments wont nest below this level)

let g:NeoComplCache_DisableAutoComplete = 1

这个可以禁用自动完成。

你用的不是SnipMate吧,一般来说在占位符之间跳转都是用Tab键,你可以试试。NeoComplCache的Snippets功能我没用过,但不管怎样,它不可能做得很麻烦。

 

感谢你耐心的解答,我不是用SnipMate,
NeoComplCache的snippet也很好用,比如:
输入for然后按,得到:
1514 for ($ = 0; $1 < ${2}; $1++) {
1515 ${0}
1516 }
这时候光标会在冒号后面,并且是insert模式,
输入i后再次按就变成:
1514 for (i = 0; i < ; i++) {
1515 ${0}
1516 }
光标在第二个分号上,并且是insert模式,
输入100后再次按就变成:
1514 for (i = 0; i < 100; i++) {
1515
1516 }
光标在1515行并且是insert模式加缩进好了
确实不错,可以不用Snippet插件。
我即使设置了
let g:NeoComplCache_DisableAutoComplete = 1
还是会自动弹出,可能跟某些插件冲突吧,
哎,懒得理了,有时间再看看是怎么回事。

 

感觉你可能用了其它自动补全的插件了,比如AutoComplPop,否则如果正确设置了let g:NeoComplCache_DisableAutoComplete = 1,不会还自动弹出菜单的。

 
 
 
 
 
 
 

我用这个插件来内核编程,非常卡

表现在删除的时候 整个vim卡得不动了

可能跟你使用的某些插件或配置有关,删除的时候它确实会更新缓存,但正常情况下不应该卡成你说的那样,除非你的电脑配置实在太低。

我电脑是t400 r28 双核p8700 2.53GHz 2G内存 应该和配置没什么关系

比如mod_的情况下我用tab补全 然后往回删字符 删除到mo的时候开始卡住了
结果连弹出的补全菜单都卡得缺了一个角

另外一种情况是补全得时候没反应 然后卡住 过了半天恢复了 在这之前按得字符全输入到vim中了。。

可能真和某些插件配置有关吧

 

下午看了一下neocomplcach的文档
有一个选项和我的情况还吻合:

g:NeoComplCache_ManualCompletionStartLength *g: NeoComplCache_ManualCompletionStartLength*
This variable controls the number of the input completioning
at the time of manual completion. It is convenient when you
reduce this value, but may get heavy when you deleted a
letter in or at popup indication time.

Default value is 2.

另外我想问一下这个选项是什么意思?
g:NeoComplCache_CacheLineCount *g: NeoComplCache_CacheLineCount*
This variable controls whether neocomplcache make a cash
every several lines of the buffer. The search of the
candidate becomes early so that this is small, but takes
time to make a cash.

Default value is 70.

要么是我英语不行,要么是写文档这哥们英语不行,看得不大明白,cash应该是cache的误写吧。
如果我没猜错的话,这个选项是控制每次生成缓存时从多少行内容中缓存关键字。

我今天没什么修改 再重新试了一下 倒是没怎么卡
不过我去下了最新的版本 功能挺强大的

(Comments wont nest below this level)
 
 
 
 
 

刚才不知怎么的用你的设置(关闭neo自动出提示以及设置supertab默认提示方式)
可以出php设置了,但是上下文设置却不行了,而且速度不是很快。打一些php的关键字的时候比如function 非常的卡,是不是我还少设置了什么东西?

可能是受别的插件影响,或者跟你vimrc里的配置有关,具体我无法判断。

 
 

请问我设置了superTab的let g:SuperTabDefaultCompletionType选项后怎么没有变化?总是显示^N^P,提示也的确只是上下文里出现过的,
而且无论我是设置他推荐的’context’还是你这里设置的,还是我自己想设置的,总之总搞不出来php自带的代码补全,总得使用^X^O才行,不知道您遇到过没有

没遇到过你说的这种情况,不过你既然可以用^X^O,那就把g:SuperTabDefaultCompletionType设成^X^O应该就可以了吧。

 
 

留言板RSS 引用 URI

來留言吧!

«
»