![vim 有自动完成插件吗?](https://linux22.com/image/1291556/vim%20%E6%9C%89%E8%87%AA%E5%8A%A8%E5%AE%8C%E6%88%90%E6%8F%92%E4%BB%B6%E5%90%97%EF%BC%9F.png)
是否有适用于 vim 的自动完成插件?我在这里有哪些选择?
目前我正在使用自动弹出,但是它与我使用的 snipMate 集成得不好,并且处理 Ruby 文件时速度非常慢(甚至少于 100 行)。
我见过其他几个插件,但它们至少一年多前就已经停用了。所以,有什么想法吗?
答案1
这是一个老问题,但我时不时地带着一丝希望回到这个问题上,想着有一天我会找到合适的插件组合,让我在 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”全能Ctrl“由- x,Ctrl-触发o(这是 Vim 作者希望你每次都输入的内容),以及一堆特定于语言插件(如果存在)。您可以
:echo &omnifunc
在文件中查看 Vim 是否已在您选择的文件中设置了 Omnicompletion。自动弹出用于在打字时自动打开上述 Omnicompletion 菜单。
超级标签它允许您按下Tab以触发 Vim 的内置完成功能。
NeoComplCache这是关键字补全(它与 Vim 的内置补全有何不同尚未指定),一个复杂的
.vimrc
设置,以及NeoSnippet用于完成片段。exuberant-ctags
和的怪物组合DoctorJS
(这是一个 Mozilla 项目,已经停止运行一年了),标签栏和土生土长的东西从标签文件中提取完成。超级剪钳随着UltiSnips-片段哪个是不同的比上面的片段。
Vim 的 Tern,这是一个很有前途的库,它进行实际的代码自检以获得正确的自动完成。但是它有缺陷,速度很慢,有内存泄漏,会导致 Vim 崩溃,并且可能是废弃软件。
埃克林- 一个高尚的尝试,在后台运行 Eclipse 服务器并告诉 Vim 它在运行中检查的自动完成。它的效果与 Tern 一样好。
此列表中的几乎每个插件都会与此列表中的几乎所有其他插件发生冲突。
YouCompleteMe 似乎是领导者包,但我从来没有能够让它正确地与标签完成一起工作,并且它的代码自省完成功能还没有证明其强大。
我的个人想法是 Vim 自动完成世界的现状很糟糕。对于小型项目,使用上述解决方案之一可能没问题。如果您处理的是一个简单的 API,您可以主要记住它,那么非代码自省完成可能就没问题。如果您处理的是大型项目,或者在编程时需要类型安全的好处,那么一个功能齐全的 IDE (蚀,视觉工作室,网络风暴) 会比 Vim 更适合你。
当然,IDE 的缺点是,你将不再拥有 Vim 的强大功能。我还没有使用过任何一款具有可接受的 Vim 模式的 IDE。
Vim 对无类型 C 类语言有一定程度的语言偏好,并且期望用户将任何特定于语言的功能作为插件添加。不幸的是,这导致了自动完成生态系统的分裂。有些选项不错,但没有什么是完美的,而且很少有多数派领导者/最佳实践。
答案2
这是一个很好的例子:你让我完整
YouCompleteMe 会在您输入时自动显示下拉菜单,并且它支持模糊选择,因此如果您有一个名为的标识符,partition_finder
并且在编辑 C++ 文件时输入了类似的东西ptf
,下拉建议列表将同时包含printf
和,partition_finder
因为它们包含相同的字母和相同的顺序。如果您有一个名为的变量myBrain
,您可以输入它brn
,它就会建议它。YouCompleteMe 还会根据之前的使用频率对建议进行优先排序。
答案3
我用neocomplcache使用 snipmate + snipmate 片段
let g:neocomplcache_snippets_dir='~/.vim/bundle/snipmate-snippets/snippets'
你可以看到我的vimrc
答案4
我相信 vim 有一个内置功能叫做 OmniComplete。在插入模式下使用ctrl+x,ctrl+o
。
否则,您可以使用 来从插入模式完成关键字补全ctrl+n
。当您调用它时,它会为您提供一个下拉列表,显示在您正在编辑的文件中找到的单词的可能匹配项,以及在您打开的其他文件中找到的单词的可能匹配项。继续点击ctrl+n
以循环显示选项。当您找到所需的单词时,只需继续正常输入即可。
如果您找不到想要的单词,ctrl+n
最终将循环退出列表,您可以继续输入,或者您可以点击ESC
然后bcw
返回b
到有问题的单词的开头并将单词c
更改w
为您想要的单词。