Vim: 使自动完成更智能

我使用 ctag、 taglist 等,以便在 Vim 中自动完成。然而,与 VisualStudio 智能感知或 Eclipse 自动完成相比,它是非常有限的。我想知道是否有可能把 Vim 调到:

  1. 随时显示自动完成。或-> 输入。但是只能在一些可能是变量的文本之后(例如,避免在数字之后显示自动补全)。

  2. 显示函数参数。

  3. 停止删除自动完成列表时,一些删除后的所有字符。或-> : 当我输入一个变量名时,然后按。或-> 要搜索某个成员,我经常必须删除在。或者-> ,但是这使得 Vim 隐藏了自动完成列表。除非我按 Esc 否则我想让它保持可见。

  4. 显示相关的自动完成: 当我键入一个变量并按 ^ X ^ O 时,它通常会显示 ctag 文件中的所有标记。我希望它只显示与变量相关的标记。

谢谢你的帮助。

编辑 : 有些人对这个问题投了赞成票,但似乎没有人知道答案。所以我只是想说,你不必提供一个完整的答案,部分答案的任何提到的点也将是好的。

23094 次浏览

我每天都使用 vim,而且我不知道任何现有的脚本可以做到这一点。这个操作需要理解类并跟踪变量。someObject->意味着 VIM 将知道变量 someObject是什么类,然后能够搜索该类中的方法/变量。

为 vim 编写脚本相对比较容易,尽管如您所说——还没有人回答这个问题。我投赞成票。

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

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

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

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

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

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

我不确定你是否可以定制万能药的行为来满足你的需要,但根据我的经验,我从来没有走得太远。正如@Mikhail 所说,您需要跟踪实际上意味着解释甚至在一定程度上运行代码的事情。

AutoComplePop 是你所需要的。

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

Https://github.com/shougo/neocomplcache 看起来可能是新的 autocomppop,并且在我最初的测试中表现得非常好... 现在配置 omni 补全来使用 scala ~

我最近发现了 You CompleteMe,它的行为类似于 Visual Studio 的自动完成工具:

Https://www.youtube.com/watch?v=yumyhahf0xs

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

Ad 1)
如果您喜欢 eclipse 的语义完成,可以使用 Eclim将 vim 与 eclipse 集成在一起。(警惕地为 YCM 使用另一个语义引擎)

Ad 2)
这两者很好地结合在一起,: YCM 甚至可以提供最近完成的函数的函数定义(= 参数列表) !

广告3)
反正 YCM 就是这么干的

广告4)
不太清楚,你说那个是什么意思,从来没用过 ctag!

附注: 我强烈推荐使用 UltiSnips标签(如果您还喜欢 UndoTree) ,这使得 vim 对我来说是一个完美的 IDE。