Vim中的自动补全


257

简而言之,我正在寻找Vim编辑器可以正常工作的自动完成功能。我之前曾争论过,Vim完全替代了Linux下的IDE,尽管这确实是正确的,但它缺少一个重要功能:自动完成。

我了解Ctrl+ N丰富的Ctags集成TaglistcppcompleteOmniCppComplete。las,这些都不符合我对“自动完成工作”的描述:

  • Ctrl+N(仅当您忘记了如何拼写class或时,才能很好地工作)while。那好吧。
  • Ctags给您起了基础,但有很多缺点。
  • Taglist只是一个Ctags包装器,因此继承了它的大多数缺点(尽管它对于列表声明非常有效)。
  • cppcomplete根本无法按承诺工作,并且我无法弄清楚我做错了什么,或者它是否在“正常工作”并且限制是设计使然
  • OmniCppComplete似乎与cppcomplete具有相同的问题,即自动完成无法正常工作。此外,该tags文件再次需要手动更新。

我知道这样一个事实,甚至没有完善的现代IDE也不能提供良好的C ++代码完成功能。这就是为什么到目前为止,我已经接受Vim在这一领域的不足。但是我认为基本的代码完成水平要求不高,实际上是生产使用所必需的。所以我正在寻找至少可以完成以下任务的东西。

  • 语法意识。cppcomplete承诺(但对我而言不兑现)以下内容的正确,作用域自动完成:

    variableName.abc
    variableName->abc
    typeName::abc

    实际上,其他任何东西都完全没有用。

  • 可配置性。我需要(轻松地)指定源文件的位置,并因此指定脚本从何处获取其自动完成信息。实际上,我的目录中有一个Makefile,它指定所需的包含路径。Eclipse可以解释其中的信息,为什么还没有Vim脚本?

  • 最新。更改文件中的内容后,我希望自动完成功能能够反映这一点。我想要手动触发ctags(或一些类似)。另外,更改应该是增量的,即当我只更改一个文件时,重新解析整个目录树(可能很大)是完全不可接受ctags

我忘记了什么吗?随时更新。

我对大量的配置和/或修改很满意,但是我不想从头开始编写解决方案,而且我也不擅长调试Vim脚本。

最后一点,我真的很喜欢Java和C#的相似之处,但我想这太令人希望了:ctags仅解析代码文件,Java和C#都具有庞大的预编译框架,需要对其进行索引。不幸的是,在没有IDE的情况下开发.NET甚至比C ++更像是PITA。


4
您问这个问题已有很长时间了,您终于找到了一个好问题吗?我问是因为我看不到任何可接受的答案。就我个人而言,尽管我不得不承认我诉诸于变量/函数的前缀。例如,所有这些都以sh(意味着它在我的库中)开头,然后是我班级的缩写。例如shP对于Parser类。然后,您所需要做的就是编写shP并按下CTRL + p(或CTRL + n,如果需要的话),并让类成员从上次使用到第一次使用(如果是CTRL + n,则从第一个使用到最后一个)
Shahbaz

4
@Shahbaz实际上,我坚信目前没有足够好的解决方案。clang_complete从技术上讲,它是最可靠的,但由于缺乏缓存结果和部分编译的原因,它的速度太慢了。我必须承认,我并没有尝试所有答案,因为有些答案需要复杂且费时的设置。既然clang最终允许开发人员从C ++来源构建AST(直到现在,没有可用的C ++免费解析器),我将屏住呼吸。
康拉德·鲁道夫

2
clang_complete最近尝试过吗?它现在可以libclang与缓存一起使用,因此应该更快。
Jan Larres 2011年

@Jan感谢您提供信息。当我上次尝试时,libclang支持仍然是粗略的。如果有时间,我可能应该再试一次。
康拉德·鲁道夫

(进行编辑回滚的原因:产品名称不是代码,它们不属于formatted like this。)
Konrad Rudolph 2012年

Answers:


171

试试YouCompleteMe。它通过libclang接口使用Clang,提供语义C / C ++ / Objective-C补全。这很像clang_complete,但是速度更快并且具有模糊匹配。

除了上述内容外,YCM还为C#,Python,Go,TypeScript等提供语义完成。它还为不支持语义的语言提供基于标识符的非语义完成。


69
实际上,我将接受此解决方案。最后是一个提供的插件。我已经使用了几天了。回答这个问题只用了四年时间。;-)
Konrad Rudolph

5
YouCompletMe的工作真棒!恭喜
statquant

5
太糟糕了,YouCompleteMe是无法在Windows上安装的完整PITA :(
xx

2
@DrTwox来自自述文件:“ YCM 没有对Windows的官方支持,但这并不意味着您不能在其中使用它。请参阅Windows安装指南Wiki页面。可以随意添加。”
user456584

7
这篇文章应该提到您是作者,因为这是边缘性的自我宣传(尽管我不会说它回答了这个问题,但是您仍然应该包括免责声明)。
EntangledLoops

36

还有clang_complete,它使用clang编译器为C ++项目提供代码完成。该插件的疑难解答提示还有另一个问题。

只要项目编译,该插件似乎就可以很好地工作,但是对于大型项目,该插件的速度却令人望而却步(因为它试图进行完整的编译以生成标签列表)。


clang_complete插件可以在Cygwin和Windows上很好地工作。关于大型项目,我什么也不能说,因为我没有。:)
Lumi 2012年

似乎使用libclang的clang_complete现在已缓存。这应该是公认的答案。您是否在Linux内核上尝试过clang_complete?我为内核看到的最好的索引是使用Eclipse CDT,如果clang_complete可以处理内核,则它应该能够完成任何事情。
2012年

clang_complete是我使用的最好的Vim插件。
Cromulent

1
@Cromulent啊,检查YouCompleteMe,它要好得多。
Konrad Rudolph

@KonradRudolph谢谢。我会检查一下。
Cromulent


6

我刚刚发现项目Eclim链接到另一个问题。至少对于Java集成而言,这看起来很有希望。


你测试过了吗?似乎很有趣。
帕坎

@帕坎:不。我几个月都没有使用Java,也没有多余的时间进行实验。
康拉德·鲁道夫

1
Eclim似乎是Java的一个很好的解决方案,尽管Eclipse仍然是野兽,即使在没有头的设置中也可以加载
Drupad Panchal 2011年

2
对于Java,可以使用Vrapper。我发现通常使用出色的自动补全功能就可以了。对于偶尔的大量文本编辑,我可以将Real Vim作为外部工具启动。
kizzx2 2011年


2

您正在寻找类似智能感知的东西吗?

Insevim似乎解决了这个问题。

链接到这里的截图


2
这就是我正在寻找的,是的。不幸的是,它只能在Windows上运行(我正在使用OS X)。另外,最近的一次更新似乎是在2003
Konrad Rudolph,2009年

好吧,您可以获取源代码:)如果不是那样,我唯一能想到的就是全能..或看一下:ankitjain.org/blog/2007/06/30/integrating-vim-with-monodevelop对于.NET的东西至少..
里克东京

里克,请提供您的评论作为两个单独的答案,它们非常宝贵,我想适当地兑现它们!就是说,MonoDevelop到目前为止在OS X下无法使用,我目前正在研究OmniCppComplete。
康拉德·鲁道夫

大声笑,这仅是Windows!:(ü为什么要这样对其中u有VS窗口..我正在寻找在Linux上的解决方案。
尼尔斯

尼尔斯:并不是每个人都可以使用Visual Studio,也有很多人具有他们想要在Windows环境中应用的vi技能。有一个到Linux的端口,但是当前关闭了。无论如何,您要达到什么目标?您确定不只需要默认的自动完成功能吗? linux.org/docs/ldp/howto/C-editing-with-VIM-HOWTO/...
里克东京

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.