关于自动补全,最初用的是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键选择列表中的选项了。
你好,博主,我想请教一下,这个插件最新版只有一个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可能还更快些
谢谢!
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,不会还自动弹出菜单的。
[...] http://sinolog.it/?p=1399 Tags: [...]
我用这个插件来内核编程,非常卡
表现在删除的时候 整个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的误写吧。
如果我没猜错的话,这个选项是控制每次生成缓存时从多少行内容中缓存关键字。
我今天没什么修改 再重新试了一下 倒是没怎么卡
不过我去下了最新的版本 功能挺强大的
刚才不知怎么的用你的设置(关闭neo自动出提示以及设置supertab默认提示方式)
可以出php设置了,但是上下文设置却不行了,而且速度不是很快。打一些php的关键字的时候比如function 非常的卡,是不是我还少设置了什么东西?
可能是受别的插件影响,或者跟你vimrc里的配置有关,具体我无法判断。
请问我设置了superTab的let g:SuperTabDefaultCompletionType选项后怎么没有变化?总是显示^N^P,提示也的确只是上下文里出现过的,
而且无论我是设置他推荐的’context’还是你这里设置的,还是我自己想设置的,总之总搞不出来php自带的代码补全,总得使用^X^O才行,不知道您遇到过没有
没遇到过你说的这种情况,不过你既然可以用^X^O,那就把g:SuperTabDefaultCompletionType设成^X^O应该就可以了吧。