Vim:让自动完成更智能

Posted

技术标签:

【中文标题】Vim:让自动完成更智能【英文标题】:Vim: Making Auto-Completion Smarter 【发布时间】:2011-06-02 18:35:17 【问题描述】:

我使用 ctags、taglist 等来在 Vim 中自动完成。但是,与 Visual Studio 智能感知或 Eclipse 自动完成相比,它非常有限。我想知道是否可以将 Vim 调整为:

    在任何时候显示自动完成。或 -> 被输入。但只有在一些可能是变量的文本之后(例如,避免在数字之后显示自动完成)。

    在输入 ( 时显示函数参数。

    当某些删除 .或 ->:当我输入变量名时,然后按 。或 -> 要搜索某个成员,我经常不得不删除我在 .或 ->,但这会使 Vim 隐藏自动完成列表。我想让它保持可见,除非我按 Esc。

    显示相关的自动完成:当我输入一个变量并按^X ^O 时,它通常会显示ctags 文件中的所有标签。我想让它只显示与变量相关的标签。

感谢您的帮助。

编辑:有些人为这个问题投票,但似乎没有人知道答案。所以只想提一下,您不必提供完整的答案;对上述任何一点的部分答案也很好。

【问题讨论】:

对该问题的支持通常意味着他们认为该问题有用、清晰、简洁或有趣。如果您获得很多支持,可能是因为很多人想知道答案,但不了解自己或想了解更多细节。 谢谢。不幸的是,似乎没有人知道答案 :-( 或许我们应该和 Vim 开发人员(或者他只是其中一个)认真考虑这一点,因为这是 Vim 的主要缺点。 【参考方案1】:

AutoComplPop 是您所需要的。

【讨论】:

对于 Python,它并不完美,但比默认的要好。 :) +1【参考方案2】:

对于 (1) 使用 C++ 或 C 时,clang complete 是一个非常好的选择

【讨论】:

【参考方案3】:

要让 vim 在按键被按下时触发某种行为,您需要将按键映射到函数。

例如,在 INSERT 模式下映射键 . 以调用某种类型的完成,您需要这样做:

:inoremap <expr> <buffer> . MyFunction()

然后该函数需要评估调用它的上下文并向用户提供适当的答案。

编辑:这是@honk 提到的clang complete 工作原理的基础。

我不确定您是否可以自定义omnifunc 的行为以满足您的需求,但根据我的经验,我从来没有走得太远。正如@Mikhail 所说,您需要跟踪在实践中意味着在某种程度上解释甚至运行代码的事情。

【讨论】:

【参考方案4】:

我每天都使用 vim,但我不知道有任何现有的脚本可以做到这一点。此操作需要了解类并跟踪变量。 someObject-&gt; 表示 VIM 会知道变量 someObject 是什么类,然后能够在该类中搜索方法/变量。

为 vim 编写脚本相对容易,尽管就像您评论的那样 - 还没有人回答这个问题。我投票赞成。

【讨论】:

好的,那我们来简化一下。是否可以检查何时'。或'->'被写入并相应地显示自动完成?【参考方案5】:

我很想拥有您正在寻找的相同功能,并且偶然发现了一个有前途的插件:

https://github.com/Shougo/neocomplcache 看起来它可能是新的 autocomplpop,并且在我最初的试验中似乎工作得很好......现在配置omni完成以与scala一起使用〜

【讨论】:

看起来很有趣。然而,Vim 自动补全的问题是它不考虑上下文。例如,如果我写“。”或变量后的“->”,我应该只看到该变量的成员,而不是所有可能的完成。 这就是我停止使用 VsVim 和 ViEmu 等插件的原因。 哦?我的印象是全补全功能..但我刚刚开始寻求实现这种功能..我希望以某种方式将 ctags 和全能补全结合在一起可以做到这一点。我已经尝试过切换到更主流的 IDE,但是当我加载它并将所有项目都扔到我的头上时,我觉得很脏,哈哈……不过可能就是这样吧~ 好吧,我实际上是相反的,我的印象是它不会那样做,但不确定:-) 但老实说,我怀疑 Vim 上的插件是否能够提供像 Visual Studio 这样的自动完成功能,特别是如果它由 Visual Assist 或 Resharper 等插件提供支持,所以我认为在 Visual Studio 上安装 Vim 插件比在 Vim 上安装自动完成插件更好。【参考方案6】:

我最近发现了YouCompleteMe,它的行为类似于 Visual Studio 自动完成工具。可以在这里看到一个演示:

https://www.youtube.com/watch?v=YuMyHAHF0xs

【讨论】:

【参考方案7】:

无论如何,我推荐YouCompleteMe (YCM)。它提供当前文件标识符的(模糊)匹配,以及路径补全、与外部补全引擎的集成……

广告 1) 如果你喜欢 eclipse 的语义补全,可以使用eclim 来集成 vim 和 eclipse。 (或者为 YCM 使用另一个语义引擎)

广告 2) 顺便说一句,这两者配合得很好,:YCM 甚至可以提供最近完成的函数的函数定义(= 参数列表)!

广告 3) 无论如何,这就是 YCM 所做的

广告 4) 不太确定,你说的那个是什么意思。没用过ctags!

P.S.:我强烈建议另外使用 UltiSnips 和 Tagbar(如果你喜欢 UndoTree),是什么让 vim 对我来说是一个完美的 IDE。

【讨论】:

以上是关于Vim:让自动完成更智能的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法让 PhpStorm 的自动完成“更深入”?

俄罗斯方块游戏自动机

Eclipse 中的 Code Igniter 2.1 自动完成/智能感知

Vim PHP omni完成

Vim - 自动完成 Java

在 Vim 中自动完成后如何自动删除预览窗口?