是否有vim的自动补全插件?我在这里有什么选择?
目前,我正在使用AutoComplPop,但是它与我使用的snipMate集成度很差,并且在Ruby文件上运行缓慢(甚至少于100行)。
我见过其他几个插件,但是至少一年以上了,它们就死了。那么,有什么想法吗?
是否有vim的自动补全插件?我在这里有什么选择?
目前,我正在使用AutoComplPop,但是它与我使用的snipMate集成度很差,并且在Ruby文件上运行缓慢(甚至少于100行)。
我见过其他几个插件,但是至少一年以上了,它们就死了。那么,有什么想法吗?
Answers:
这是一个古老的问题,但是我不时地带着一丝淡淡的希望回到这个问题上,以为有一天我会找到合适的插件组合,使我在Vim中实现完美的自动完成。搜索工作仍在继续,但这是我几年来所做的全部研究。
首先,您必须了解Vim是文本编辑器,而不是代码编辑器。代码编辑器IDES是Jetbrains工具套件,Visual Studio Code,Eclipse等工具。
Vim 根本无法准确地“自动完成”代码。自动补全功能需要对您的源代码进行自省并分析AST。考虑到Vim在2016年发布Vim 8之前无法执行异步操作,因此尝试在Vim插件中运行任何类型的代码自省软件将是一场噩梦。Vim生态系统的发展史无济于事。而所有尝试做到这一点的人(例如Tern For Vim)的确是噩梦。
文本编辑器可以做的最好的事情就是摘录并完成它所知道的相同单词/行/等。如果要自动完成代码,则应使用代码编辑器,而不是文本编辑器。
这些是您的选择,我已经尝试了所有这些选择:
两个有用的快捷键是Ctrl- n,这将自动完成只对当前缓冲区基于一个字已打开(无码反省),以及Ctrl- xCtrl- l这将自动补全行代码,如果你想复制一个。你可能知道Ctrl- - xCtrl,f这将自动完成文件名,包括路径,相对于当前:pwd
。该模式完成插件可轻度有用的,如果你不与搜索/\v
。
内置由- ,- (这是Vim作者每次要您输入的内容)触发的Vim“ Omnicompletion ” ,以及一堆特定于语言的插件(如果存在)。您可以在一个文件中查看您选择的文件中是否已经有Vim设置的Omnicompletion。CtrlxCtrlo:echo &omnifunc
AutoComplPop用于在键入时自动打开上面的Omnicompletion菜单。
SuperTab可让您按下Tab以触发Vim的内置完成。
NeoComplCache,它是关键字补全(未指定与Vim内置补全的区别),复杂的.vimrc
设置以及用于代码段补全的NeoSnippet。
的怪物组合exuberant-ctags
以及DoctorJS
(一个Mozilla项目已经死了一年),TagBar和一个本土的啄从标记文件提取完成。
UltiSnips沿着UltiSnips-片段,其是不同的比上述代码段。
Tern for Vim,这是一个很有前途的库,它可以进行实际的代码自省以获取正确的自动完成功能。但是,它是越野车,非常慢,内存泄漏会导致Vim崩溃,并且可能是废弃软件。
YouCompleteMe,一种模糊的按需输入完成功能,可在后台运行服务器,以及用于代码段完成的本地功能。
Eclim-一种在后台运行Eclipse服务器并告诉Vim即时自动检查的自动完成功能的崇高尝试。它和Tern一样好用。
最后,Closetag或delimitMate或autoclose或自制的香蕉图,用于在键入时自动关闭标签和括号。
此列表中的几乎每个插件都将与此列表中的几乎所有其他插件冲突。
YouCompleteMe似乎是该包的领导者,但是我一直无法使它与标签完成一起正常工作,并且它的代码自检完成功能尚未得到证明。
我个人认为,Vim自动完成世界的当前状态不佳。对于小型项目,使用上述解决方案之一可能会很好。如果您使用的是简单的API,则大部分时候都可以使用,无需代码自省即可。如果您处理的是大型项目,或者在编程时需要类型安全的好处,那么成熟的IDE(Eclipse,Visual Studio和WebStorm)将比Vim更适合您。
当然,IDE的缺点是您将不再拥有Vim的功能。我没有使用具有可接受的Vim模式的单个IDE。
Vim对于未类型化的类似C的语言有中等程度的语言偏见,否则期望用户将任何特定于语言的功能作为插件添加。不幸的是,这导致了自动完成生态系统的分裂。有些选择是不错的选择,但没有完美的选择,很少有多数党领袖/最佳实践。
这是一个不错的方法:YouCompleteMe
键入时,使下拉菜单自动显示的YouCompleteMe,它支持模糊选择,因此,如果您有一个名为的标识符,partition_finder
并且ptf
在编辑C ++文件时键入了类似的内容,则下拉建议列表将同时包含printf
和partition_finder
因为它们包含相同的字母以相同的顺序。如果您有一个名为的变量myBrain
,则可以键入brn
并提示您。YouCompleteMe还根据先前的使用频率对建议进行优先级排序。
我将snipmate + snipmate片段与neocomplcache一起使用
let g:neocomplcache_snippets_dir='~/.vim/bundle/snipmate-snippets/snippets'
你可以看到我的vimrc
我正在尝试使用带有neosnippet的 necomplecache,因为它们都是由同一个人创作的,因此我认为它会具有更好的集成
我相信vim有一个内置的称为OmniComplete。在插入模式下使用ctrl+x,ctrl+o
。
否则,您可以使用从插入模式完成关键字补全ctrl+n
。调用它时,它将为您提供一个下拉菜单,显示您正在编辑的文件中以及从打开的其他文件中找到的单词的可能匹配项。继续点击ctrl+n
以循环浏览选项。当您输入想要的单词时,只需像平常一样继续输入即可。
如果找不到所需的单词,ctrl+n
则最终将其从列表中循环出来,您可以继续输入,也可以先击打ESC
然后bcw
再b
确认有问题的单词的开头,然后c
将w
ord附加到所需的单词上。
<c-x><c-o>
仅适用于已明确告知vim支持的功能。默认情况下,我认为它只能做一些次要的事情像CSS
partition_finder
和I型类似ptf
,同时编辑一个C ++文件,在下拉菜单中会建议双方printf
和partition_finder
因为它们包含相同顺序的相同字母。如果我有一个名为的变量myBrain
,我可以输入brn
,它将出现。YouCompleteMe还根据先前的使用频率对建议进行优先级排序。在此处查看:valloric.github.io/YouCompleteMe
我从原始的AutoComplPop 分叉了一个新的插件SimpleAutoComplPop。虽然,我不熟悉ruby或snipMate,但您可以尝试一下,很高兴得到一些反馈:)
let g:acp_behaviorSnipmateLength=-1
请参阅:help autocomplpop
)添加到.vimrc中,您是否添加了它?