vim 有没有自动补全插件?

naq*_*uad 12 vim autocomplete

vim 有自动补全插件吗?我在这里有哪些选择?

目前我正在使用AutoComplPop,但它与我使用的 snipMate 集成很差,并且在 Ruby 文件上速度很慢(甚至 < 100 行)。

我看过其他几个插件,但它们至少在一年多后就已经死了。那么,有什么想法吗?

And*_*Ray 17

这是一个古老的问题,但我时不时地带着一线希望回到它,以为有一天我会找到正确的插件组合,让我在 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 的“ Omnicompletion ”由Ctrl- x, Ctrl- o(这是 Vim 作者希望你每次输入的内容)以及一堆特定语言的插件(如果存在)触发。您可以:echo &omnifunc在文件中查看是否已经在您选择的文件中设置了 Vim 的 Omnicompletion。

  • AutoComplPop用于在打字时自动打开上面的 Omnicompletion 菜单。

  • SuperTab可让您按下Tab以触​​发 Vim 的内置完成功能。

  • NeoComplCache是关键字补全(未指定它与 Vim 的内置补全有何不同)、复杂的.vimrc设置和用于代码段补全的 NeoSnippet

  • exuberant-ctagsDoctorJS(一个已经死了一年的 Mozilla 项目)、TagBar一个从标签文件中提取完成的本土东西的怪物组合。

  • SnipMate,一个基本的标签补全插件,以及snippets,并自行弄清楚如何添加片段,因为它有点棘手。

  • UltiSnips沿着UltiSnips-片段,其是不同的比上述代码段。

  • Tern for Vim,一个很有前途的库,它进行实际代码自省以获得正确的自动完成。然而,它有问题,非常慢,内存泄漏会导致 Vim 崩溃,并且可能是废弃软件。

  • YouCompleteMe,一种在后台运行服务器的模糊自动完成,以及用于代码段完成的本土功能

  • Eclim - 在后台运行 Eclipse 服务器并告诉 Vim 它即时自省的自动完成的高尚尝试。它和 Tern 一样有效。

  • 最后,ClosetagdelimitMateautoclose自产的香蕉图,用于在打字时自动关闭标签和括号。

此列表中的几乎每个插件都会与此列表中的几乎所有其他插件发生冲突。

YouCompleteMe 似乎是这个的领导者,但我从来没有能够让它在标签补全中正常工作,而且它的代码自省补全功能还没有被证明是强大的。

个人的观点是 Vim 自动完成世界的当前状态很糟糕。对于小型项目,您可以使用上述解决方案之一。如果您正在处理一个简单的 API,您可以将大部分时间留在脑海中,那么非代码内省完成可能没问题。如果您正在处理一个大型项目,或者在编程时需要类型安全的好处,那么成熟的 IDE(EclipseVisual StudioWebStorm)将比 Vim 更适合您。

当然,IDE 的缺点是您将不再拥有 Vim 的强大功能。我没有使用过具有可接受 Vim 模式的单个 IDE。

Vim 对无类型的类 C 语言有适度的语言偏见,否则期望用户将任何特定于语言的功能作为插件添加。不幸的是,这导致了自动完成生态系统的分裂。有些选择是不错的,但没有什么是完美的,而且很少有多数领导者/最佳实践。


tru*_*ktr 6

这是一个不错的:YouCompleteMe

YouCompleteMe 使下拉菜单在您键入时自动出现,并且它支持模糊选择,因此如果您调用了一个标识符partition_finder并且您ptf在编辑 C++ 文件时键入了类似的内容,则下拉建议列表将包含两者printf并且partition_finder因为它们包含相同的字母以相同的顺序。如果您有一个名为 的变量myBrain,您可以键入brn它,它会给出建议。YouCompleteMe 还根据以前的使用频率对建议进行优先级排序。


Con*_*ean 1

我相信 vim 有一个名为 OmniComplete 的内置功能。在插入模式下使用ctrl+x,ctrl+o.

否则,您可以使用 来从插入模式完成关键字补全ctrl+n。当您调用它时,它会给您一个下拉列表,显示您正在编辑的文件中找到的单词以及您打开的其他文件中找到的单词的可能匹配项。继续点击ctrl+n以循环选择选项。当您找到所需的单词时,只需像平常一样继续输入即可。

如果你找不到你想要的单词,ctrl+n最终会从列表中循环出来,你可以继续输入,或者你可以点击ESC然后bcw返回b到有问题的单词的开头,并将顺序cw到你想要的单词上。