Vim的终极自动补全插件:NeoComplCache

Vim、Emacs配置和使用
回复
vfate_linux
帖子: 290
注册时间: 2010-09-22 22:44

Vim的终极自动补全插件:NeoComplCache

#1

帖子 vfate_linux » 2011-07-04 10:50

http://www.vim.org/scripts/script.php?script_id=2620


特点:

1、使用缓存,自动补全时效率高;
2、生成的关键词列表准确;
3、支持下划线分割的关键词,如apple_boy_cat,就可以只输入a_b_c,然后补全;
4、支持驼峰格式匹配关键词,如AppleBoyCat,就可以只输入ABC,然后补全;
5、既可以像AutoComplPop那样在Vim中输入的同时自动弹出补全列表,又可以自定义快捷键手动触发;
6、支持从文件名和目录名中匹配补全条件;
7、对于程序源文件,支持从语言API中匹配补全条件;
上次由 vfate_linux 在 2011-07-04 10:52,总共编辑 1 次。
vfate_linux
帖子: 290
注册时间: 2010-09-22 22:44

Re: Vim的终极自动补全插件:NeoComplCache

#2

帖子 vfate_linux » 2011-07-04 10:50

版權所有:晴耕雨讀@【牧碼志】,如需轉載,請注明出處。
原文地址:
http://sinolog.it/?p=1399

关于自动补全,最初用的是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键选择列表中的选项了。
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: Vim的终极自动补全插件:NeoComplCache

#3

帖子 fanhe » 2011-07-04 19:53

有vim的弹出菜单的patch之前, 自动弹出补全菜单都是浮云
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: Vim的终极自动补全插件:NeoComplCache

#4

帖子 自由建客 » 2011-07-04 20:19

fanhe, 什么意思?
头像
acer4740
帖子: 1405
注册时间: 2010-09-13 19:04
来自: 0xFF00EE

Re: Vim的终极自动补全插件:NeoComplCache

#5

帖子 acer4740 » 2011-07-04 22:40

这类插件没有过几个不知道哪个好
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: Vim的终极自动补全插件:NeoComplCache

#6

帖子 fanhe » 2011-07-05 14:54

自由建客 写了:fanhe, 什么意思?
现在 vim 弹出菜单无论如何都会修改文本的
如果需要实现仅仅弹出菜单, 不选择,不修改, 需要在弹出菜单后多做一个 <C-p> 操作
但是这是脚本级别的动作, 非源码级, 结果就是画面闪烁, 光标抖动
总之, 非常不爽!
我正忙, 迟早改掉这个东东
头像
hbxtght
帖子: 191
注册时间: 2011-01-17 22:23

Re: Vim的终极自动补全插件:NeoComplCache

#7

帖子 hbxtght » 2011-09-29 11:23

fanhe 写了:
自由建客 写了:fanhe, 什么意思?
现在 vim 弹出菜单无论如何都会修改文本的
如果需要实现仅仅弹出菜单, 不选择,不修改, 需要在弹出菜单后多做一个 <C-p> 操作
但是这是脚本级别的动作, 非源码级, 结果就是画面闪烁, 光标抖动
总之, 非常不爽!
我正忙, 迟早改掉这个东东
顶你
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”
头像
Crazier
帖子: 1051
注册时间: 2007-09-23 17:06
联系:

Re: Vim的终极自动补全插件:NeoComplCache

#8

帖子 Crazier » 2011-10-10 18:48

fanhe 写了:
自由建客 写了:fanhe, 什么意思?
现在 vim 弹出菜单无论如何都会修改文本的
如果需要实现仅仅弹出菜单, 不选择,不修改, 需要在弹出菜单后多做一个 <C-p> 操作
但是这是脚本级别的动作, 非源码级, 结果就是画面闪烁, 光标抖动
总之, 非常不爽!
我正忙, 迟早改掉这个东东
求你赶紧闲下来吧,盼呀!!
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: Vim的终极自动补全插件:NeoComplCache

#9

帖子 lilydjwg » 2011-10-13 11:05

fanhe 写了:
自由建客 写了:fanhe, 什么意思?
现在 vim 弹出菜单无论如何都会修改文本的
如果需要实现仅仅弹出菜单, 不选择,不修改, 需要在弹出菜单后多做一个 <C-p> 操作
但是这是脚本级别的动作, 非源码级, 结果就是画面闪烁, 光标抖动
总之, 非常不爽!
我正忙, 迟早改掉这个东东
为什么我测试的 omnifunc 补全插件都是只显示菜单没有修改文本呢?
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: Vim的终极自动补全插件:NeoComplCache

#10

帖子 fanhe » 2011-10-14 1:56

lilydjwg 写了:
fanhe 写了:
自由建客 写了:fanhe, 什么意思?
现在 vim 弹出菜单无论如何都会修改文本的
如果需要实现仅仅弹出菜单, 不选择,不修改, 需要在弹出菜单后多做一个 <C-p> 操作
但是这是脚本级别的动作, 非源码级, 结果就是画面闪烁, 光标抖动
总之, 非常不爽!
我正忙, 迟早改掉这个东东
为什么我测试的 omnifunc 补全插件都是只显示菜单没有修改文本呢?
+longest,且所有条目没有相同前缀,表现的效果是一样的,但是也会显示文件已经修改

如下,光标放到最后,set completeopt+=longest,然后 <C-x><C-n>

代码: 全选

time
tim
timer
tim
你看下这个插件的源码就知道了,用的是这样的序列 <C-x><C-u><C-p>

我想做两个选项,一个是只弹出菜单,不修改文本不选择,一个是弹出菜单也不修改文本,且选择了第一个条目

这位同学有兴趣 hack 源码不,帮忙hack 下吧,用源码级实现,我最近研究 pyclewn
还有,考虑下加个类似 charadd 的自动命令,也就是输入了字符,现在这个插件用 cursormovei 自动命令实在是不怎么好
想在打字的时候自动弹出补全菜单,要么用 cursormovei 要么把所有键map 一遍,实在蛋疼

btw,这个插件用了 cache,确实速度是不错,想当初的 autopopup,各种晃动
回复