Vim:使自动完成更智能


75

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

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

  2. 键入(时显示功能参数。

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

  4. 显示相关的自动完成:输入变量并按^ X ^ O时,通常会向我显示ctags文件中的所有标签。我希望它仅显示与变量相关的标签。

谢谢您的帮助。

编辑:有人对此问题投了赞成票,但似乎没有人知道答案。因此,我想提一提,您不必提供完整的答案;对上述任何问题的部分答案也将是不错的。


对问题的投票通常意味着他们认为该问题有用,清晰,简洁或有趣。如果您获得很多支持,那可能是因为很多人都想知道答案,而又不了解自己或想听到更多细节。
jmort253 2011年

1
谢谢。不幸的是,似乎没人知道答案:-(也许我们应该与Vim开发人员(或者他可能只是他一个人)进行认真考虑,因为这是Vim的主要缺点
。– Rafid

Answers:




8

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

例如,.INSERT模式下映射键以调用某种类型的完成功能,您需要执行以下操作:

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

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

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

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


5

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

为vim编写脚本相对容易,尽管就像您评论的那样-尚无人回答。由我投票。


好,让我们简化一下。可以检查何时为“。” 或'->'被写入并因此显示自动完成?
拉菲德

2

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

https://github.com/Shougo/neocomplcache看起来可能是新的autocomplpop,并且在我的初步试用期间似乎工作得很好...现在配置全向补全以与scala一起使用〜


看起来很有趣。但是,使用Vim自动完成功能的是,它不考虑上下文。例如,如果我写“。” 或变量后面的“->”,我应该只看到该变量的成员,而不是所有可能的补全。
拉菲德

这就是为什么我结束使用VsVim和ViEmu之类的插件的原因。
拉菲德

哦?我给人的印象是全能完成功能..但是我刚刚开始寻求使这种功能运行的方法。.我希望ctags和全能功能可以一起完成。我曾尝试过切换到更主流的IDE,但是当我加载它并以我的方式将所有项目扔给我时,我感到非常肮脏,哈哈...虽然可能会达到目的
neildaemond 2012年

好吧,实际上我正好相反,我的印象是它不能做到这一点,但并不能确定:-)但是,老实说,我怀疑Vim上的插件能否像Visual Studio一样提供自动完成功能,特别是如果它由Visual Assist或Resharper之类的插件提供支持,那么我认为在Visual Studio上安装Vim插件比在Vim上安装自动完成插件要好。
拉菲德


1

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

广告1)
如果您喜欢eclipse的语义完成,请使用eclim将vim与eclipse集成。(或者将另一个语义引擎用于YCM)

ad 2)
这两个可以很好地配合使用:,YCM甚至可以提供最近完成的功能的功能定义(=参数列表)!

广告3)
这正是YCM所做的

广告4)
不太确定,那是什么意思。从未使用过ctags!

PS:我强烈建议另外使用UltiSnipsTagbar(如果您喜欢UndoTree),那么vim对我来说就是一个完美的IDE。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.