如何在C ++中获得智能的自动完成功能?


43

如果Emacs没有自动完成功能,则无法与其他IDE竞争。自动完成功能使我成为一名更高效的程序员。我知道自动完成模式扩展名,但是它不适用于C ++。

自动完成

如何实现C ++的智能高效自动补全功能?


这个问题最初是由Malabarba在Area 51提案中提出的: 如何在C ++中获得智能自动完成功能?


1
在这个问题上扩大一点会很好。它具有很大的潜在价值,但现在的问题仅仅是标题。
马拉巴巴

具有讽刺意味的模式似乎是此时的路要走。
塞夫基

Answers:


45

免责声明:我是讽刺模式的作者

公司讽刺截图

如果您只想智能自动完成功能,我可以推荐使用讽刺模式company-irony

  • 具有讽刺意味的模式是易于安装感谢MELPA
  • 完成是非常准确性能相当不错感谢libclang
  • 与company-irony一起使用时,您将拥有一个异步完成后端,如果完成需要一些时间,该后端将不会妨碍您
  • company-irony 支持重载函数,如果已安装Yasnippet,则将函数参数作为占位符插入以进行填充
  • 如果您的项目使用Doxygen,则完成候选者的简要文档将显示在迷你缓冲区中(请参见屏幕截图)
  • 在类似Unix的系统(Linux,OS X)上安装反讽模式服务器应该很容易。另一方面,Windows需要一些调整,但是在Wiki中有记录。

尚未被引用的另一个工具是emacs-ycmd


2
非常感谢!希望我早点找到irony-mode
Luke

@GuillaumePapin感谢您撰写讽刺文章!您是否有任何可用的计时基准?我注意到,clang_codeCompleteAt使用已解析的TU(但未保存的更改)进行呼叫需要3-5秒。是irony-mode比这更快吗?
Pradhan

1
具有讽刺意味的是使用libclang / clang_codeCompleteAt,因此您将获得比这更好的时间。3-5秒可能视上下文而定(例如,在全局范围内完成比在其他范围内花费更多的时间)。您可以看一下我最近所做的一些时间安排:github.com/Sarcasm/irony-mode/issues/131#issuecomment-60008803
Guillaume Papin

相关内容,供以后的读者阅读:github.com/Sarcasm/irony-mode/issues/140
Sean Allred

讽刺模式和emacs-ycmd的作用如何比较?它们是彼此的替代品吗?两者都使用有意义吗?
Praxeolitic

23

检查我的指南。它列出了几种在C / C ++中自动完成的方法。

这些选项是:

  • 使用讽刺。高度推荐,因为它使用Clang且与其他解决方案相比易于设置。

  • 使用Emacs的内置解析器。这是从Emacs解析器Semantic中获得的最好的自动完成功能,但是在大型项目(如Linux内核)上会很慢。

  • company-mode与一起使用软件包company-clang。为系统包含路径提供良好的代码完成功能,因为它可以自动从Clang获取路径,但必须对本地项目进行一些配置

  • company-mode与一起使用company-gtags。它使用从GNU Global生成的标签数据库作为完成。您可以使用它为您的项目在本地提供完整的代码。它并不是完全智能,因为它会将生成的数据库中的所有内容都扔给您。

  • rtags通过提供用于实时分析的服务器来进一步扩展。但是,与纯Elisp解决方案相比,设置起来很复杂。


我不同意设置rtags比单纯的emacs lisp解决方案更为复杂。纯粹的emacs lisp解决方案通常不考虑cmake / build文件,并且几乎找不到任何标头。相比之下,Rtags很容易设置。作为一个项目,它还只是一个年轻的对象,测试覆盖面还不够好。
baol 2016年

Tuhdo指南的不错补充:syamajala.github.io/c-ide.html
维克托

9

我在RTags + Company上取得了巨大的成功。

RTags需要rdm运行一个单独的守护程序,该守护程序使用clang进行代码完成,代码导航和重构。rdm还可以用作符号数据库,这意味着自动完成比仅直接调用的任何解决方案都快得多clang_codeCompleteAt

RDM需要编译标志信息为您的项目可以是一个麻烦,但如果从照做RTags页面和符号链接gcc-rtags-wrapper.shgccg++ccc++RDM自动获取与上重新编译新编译标志更新。


我只是从讽刺模式切换到了rtags。具有讽刺意味的模式不断出现,并在大约15分钟后停止工作。到目前为止,Rtags看起来还不错,并且与yasnippet的集成更加清晰。
nenchev '16

6

解决方案1:公司模式+叮当声

唯一的问题是您需要告诉公司模式在哪里搜索项目的c / c ++头文件。

如果使用cmake,则可以让https://github.com/redguardtoo/cpputils-cmake为您进行设置(提示:我是cpputils-cmake的作者)。

要么

解决方案2:公司模式+ GNU全球

无需多说,您需要使用gnu global cli工具构建标签,如其他人所述。


1

我一直在使用cmake-ide配置rtags,flycheck,讽刺和公司clang。

现在,您可以同时配置构建系统最喜欢的静态分析emacs插件!

编辑:请注意,公司clang提供自动完成功能,这是您要查找的功能。cmake-ide还可以配置flycheck和rtags,从而增加了更多类似IDE的功能。


1
请解释这如何回答如何获得C ++自动补全的问题。
提请

@Drew company-clang提供了补全
AnimatedRNG

请输入答案。谢谢。
提请

0

MX语义模式

www.gnu.org/software/emacs/manual/html_node/semantic/Using-Semantic.html#Using-Semantic

&&

标签表

找 。名称“ *。[chCH]” -print | etags-

www.gnu.org/software/emacs/manual/html_node/emacs/Tags.html

etags,ctags-为Emacs,vi生成标记文件

manpages.debian.org/cgi-bin/man.cgi?query=etags&apropos=0&sektion=0&manpath=Debian+8+jessie&format=html&locale=en

CMi(或M-TAB)即时完成。如果启用了语义模式,则尝试使用语义解析器数据。如果语义模式被禁用或失败,请尝试使用所选标​​签表完成操作(请参见标签)

http://www.gnu.org/software/emacs/manual/html_node/emacs/Symbol-Completion.html#index-C_002dM_002di

M- (find-tag)提示标签名称&&跳转到定义

http://www.gnu.org/software/emacs/manual/html_node/emacs/Find-Tag.html#index-M_002d_002e

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.