使用Emacs作为功能齐全的C / C ++ IDE


50

我一直在尝试使用Emacs作为C / C ++ IDE超过一年了。到目前为止,我仅取得了一点点成功,但是在此过程中遇到了一些障碍。目前,我正在尝试使用CEDET,但是我在理解如何有效使用它方面花费了一些时间。

我正在IDE中寻找的功能如下:

  1. 管理软件“项目”。我希望我的IDE对组成当前项目的所有文件有所了解,以便我可以在项目中执行诸如搜索和替换之类的功能。(如果我也能做到这一点,而又不会在源代码树上堆满很多支持文件,那将是很好的选择。为什么每个项目需要一个以上的集中项目文件?)
  2. 不管我当前正在访问哪个缓冲区,都可以从IDE中构建当前项目。我需要能够绑定将构建当前项目的密钥。
  3. 错误报告。我不想读取500多行输出来查找构建工具报告的错误。优选地,错误显示在它们自己的缓冲区中,每个错误一行。
  4. 了解项目中的符号及其定义位置。我想跳转到符号定义,无论它位于我的项目文件中还是位于系统包含文件中。
  5. 视觉调试。我想要一个局部变量的监视列表,这些列表会在我逐步执行代码时自动更新。我希望能够在代码中设置断点,看看接下来将执行哪一行代码。

我知道每个功能都是存在的,因为我已经使用EDE,Semantic,GDB等使它们同时或同时工作。问题是我无法同时使所有这些功能同时工作。 ,因为通常每个部分都必须自己配置,并且要弄清楚如何一次配置所有部分并使它们一起工作通常是一项繁重的工作。

有哪些解决方案可以将Emacs变成功能齐全的C / C ++ IDE? 您是否总是必须零碎地配置所有内容,或者是否可以一次设置所有功能?

编辑:这个问题的一个很好的答案不必完全满足所有给定的五个标准。我只是提供了清单,以便在我认为IDE是“功能齐全的”之前,更具体地了解我想看到的功能类型。CEDET很可能符合要求,但我尚未找到有关如何从头开始进行设置的逐步指南。


6
最好将这个问题分为几个部分。您可能最终会得到一些不完整的答案,其中没有任何一项得到应有的重视。
马拉巴巴2014年

2
此外,第1项可能是重复emacs.stackexchange.com/questions/448/...
Malabarba

6
@Malabarba:如果我要问五个不同的问题,那可能是重复的。这个问题的全部要点是,可能有五个不同的程序包可以实现五个不同的目标,但是将这五个目标配置为彼此完美兼容似乎几乎是不可能的。如果答案返回为“ Emacs无法充当功能齐全的IDE,因为它花费了无法配置的时间”。那就这样吧。
nispio 2014年

4
每个问题都可能是它自己的问题(可能重复),将所有问题放到一个问题中,有时由于程序包交互而导致不同的答案。
乔纳森·里奇·佩平2014年

Answers:


27

不同语言存在不同级别的“ IDE-ness”,不幸的是,如果不进行一些配置,您将永远无法获得完整的IDE功能(如果您不喜欢配置,则可能不应该使用Emacs)。CEDET的目标是成为一个完整的解决方案,满足您对受支持语言的所有需求,但是我个人从来没有使其正常运行;相反,我串联使用一些软件包来覆盖我的IDE基础。我将按顺序介绍您的要点,并提供一些针对我所知道的不同语言的解决方案:

  1. projectile是提供真实IDE体验的最接近的软件包。它为每个项目提供了大量有用的功能。您可能还需要某种窗口/工作区管理。我使用自己的解决方案wacspace,但其他好的解决方案包括Perspective工作组elscreen
  2. 不同的语言对“构建”的含义有不同的想法,但是M-x compile可以容纳几乎所有内容,并且可以轻松地通过错误进行分页(只需使用next-error)。您可以使用目录变量 set 轻松地针对每个项目进行自定义compile-command。您可以compile使用projectile-compile-projectC-c p c)来运行弹丸。
  3. M-x compile您也可以在这里进行介绍-错误通常会在*compilation*缓冲区中的每一行出现一次,并且可以通过轻松进行分页next-error
  4. 跳转到符号涉及到“理解您的代码”,这是支持在不同语言之间变化很大的地方。对于Elisp,您可以使用出色的elisp-slime-nav,然后M-.跳转到定义。以下是一些为其他语言提供类似支持的软件包:CIDER(用于Clojure);SLIME(用于普通Lisp);长袍(用于Ruby);C / C ++的语义标记clang标记(免责声明:我也从未使用过,所以我不知道它们是否运行良好)。如果所有其他方法都失败了,您还可以使用Emacs内置的TAGS工具,例如旺盛的ctags,但是使用TAGS从未获得过令人满意的结果。
  5. Emacs对调试器的支持非常分散。GDB和GUD是类似C语言的最佳选择。否则,它几乎完全基于每种语言。(我认为跨语言视觉调试确实不是一个现实的目标。)

4
作为一个旁节点,projectile可以直接与perspective创建perspective-per-project自动打开的项目开关集成在一起。
乔纳森·里希·佩平2014年

我将semantic在#4上添加注释,语义是一个很好的程序包,它可以理解您的代码,并且可以利用这些信息来做很多有用的事情。
Jordon Biondo

我从未真正使用过semantic,并且我想我还记得它对C ++的支持不完整,但是我已经将其添加到了答案中。
shosti 2014年

15

我使用本指南开始将Emacs用作C ++ IDE。它介绍了头盔弹丸,可帮助您回答许多问题。以机智,

  1. 弹丸管理项目。它在目录树中搜索Makefile,SConstruct,Git存储库,SVN存储库以及其他一些构建系统或版本控制文件,以自动了解与当前项目关联的文件。例如,C-c p h运行运行helm-projectile,该运行使用Helm在当前项目中查找文件。

  2. 弹丸可以构建您的项目。C-c p c运行projectile-compile-project它试图运行make基于可用的文件/使用SCons / CMake的。我从来不需要配置它;它一直都知道该怎么做。

  3. 这些错误会在您运行时显示在它们自己的缓冲区中,projectile-compile-project但我不确定它是否像您想要的那样漂亮。

  4. 您可以使用与程序helm-gtags连接的软件包gtags(您的系统上应有该软件包)。请注意,gtags是GNU项目,因此不太可能立即在Windows上运行。

    配置完成后,Helm会意识到项目中的符号,并且可以导航到定义并使用位置。例如,helm-gtags-dwim可以跳转到任何对变量或函数的使用,并在头文件上运行时打开该头文件。

  5. 我还没有尝试过。

列出的指南提供了有关如何入门的非常明确的配置信息。


我也偶然发现了该指南,并应用了它。恕我直言,这有点重量级,并且太多地改变了许多基本的emacs交互。我禁用了许多与头盔相关的配置,因为它们干扰了通常的快捷方式(例如,轻松地在缓冲区中打开当前目录,或通过几次击键在子子目录中打开文件)。虽然值得一看,但应该逐步而不是整体尝试。
斯特凡纳·古里科

9

由于您现在要使用功能齐全的C / C ++ IDE,因此我可能有资格。

我使用了从vc4到Visual Studio 2010的所有MS IDE,因此我完全了解您想要什么。

好消息是,Emacs可以达到Visual Studio的95%,并且可以做得更多。但您可能对“更多”部分不感兴趣。因此,我将只关注您的问题。

现在,关键是,您必须使用CMake,即使您的C ++应用程序也仅适用于Windows!故事结局。没有其他选择,我知道我在说什么。如果您不使用CMake,那么继续下去毫无意义。

对问题1的回答:您不需要设置任何内容,请安装可设置其他插件的cpputils-cmake(https://github.com/redguardtoo/cpputils-cmake)。它比Visual Studio更加方便。因此,无需按项目进行设置。对于搜索替换,我结合了bash / perl / git和percol(https://github.com/mooz/percol)的功能,这比任何IDE都要好得多。检查我的博客(http://blog.binchen.org/categories/emacs.html)和我的〜/ .bashrc(https://gist.github.com/redguardtoo/01868d7a13817c9845e8#file-bashrc)。例如,我可以搜索替换某些提交中的文件。

问题2的答案:cpputils-cmake已经设置好了,您只需要M-x compile照常设置即可。

对问题3的回答:与问题2相同。我不知道为什么这是一个问题。它的行为与VS完全相同,但键绑定更好。

问题4的答案:现在,大多数人只使用Gnu Global,它可以与cpputils-cmake结合使用。我知道真正的问题是自动检测包含所有包含的C ++标头的目录。可以使用cpputils-cmake来完成,其他一切都很容易。请man global在shell中阅读有关环境变量GTAGSLIBPATH的手册。有很多插件可提供基于Global的不错的UX进行代码导航,我建议ggtags.el

问题5的答案:可视化调试,很多人推荐M-x gdb-many-window,我尝试了一下,但是没有用。这仅仅是因为我的gdb版本已过时(提示,我使用的是OSX 10.7.3),并且我懒于升级我的OS。但是GUD很好。我在编辑器窗口中创建了一些短键来为我打印变量。所有调试的东西都是可用的。它没有表UX布局作为VS。但说实话 微软的调试器UX也不是世界上最好的。最好的用户友好调试器是DDD(http://www.gnu.org/software/ddd/)。Gud和VS都深陷这个问题。这些天来,我只是用另一个Emacs插件yasnippet插入了日志代码。需要澄清的是,我知道有关断点的所有高级技巧,这仅仅是因为我懒于应用这些技巧。在Emacs中插入日志记录代码要容易得多。

关于IDE还有很多其他事情:代码完成?使用公司模式,无需设置。实时语法检查?使用cpputils-cmake,然后(flymake-mode 1)

最好的事情是,你需要做的比VS设置少,如果你用我的设置在(https://github.com/redguardtoo/emacs.d)也设置有标题“赛尔的emacs的配置再加上C / C ++的支持”

现在,我需要强调一点,Emacs给您充分的自由。您可以选择任何开始方式。困难的方法或简单的方法。

简单的方法是复制我的设置(或github上任何人的设置,首先算星星),在5分钟内您将拥有一个功能齐全的C ++ IDE。VS在那5分钟内还没有完成启动。

困难的方法是从头开始调整设置。如果您选择困难的方式,请不要抱怨Emacs。这是你的选择。

顺便说一句,从长远来看,对Emacs Lisp的一点了解可能会有所帮助。与我在MS sh * t上浪费的时间相比,我认为对于专业的C ++开发人员而言,这是微不足道的。许多年前,MS在某些Windows更新中静默升级了VC运行时。它使我的产品在公司的机器上运行正常,但在客户的计算机上崩溃

那件事之后,我开始了解理查德·斯托曼。


1
有趣。“您必须使用CMake”->因此,您要说的是,在处理使用autoconf或个人脚本的随机免费软件包时,应该编写一个包装器CMakeLists.txt吗?
斯特凡纳·古里科

1
您可以改用GNU Global,而不是cmake解决方案那么完美。但更灵活,请参阅blog.binchen.org/posts/emacs-as-c-ide-easy-way.html
chen bin

5

对于#4,我强烈建议我使用多年的旺盛ctags和内置标签支持。另外,我最近刚改用GNU Global和ggtags包,发现它们略胜一筹。尽管它们的功能几乎相同。两者都几乎没有配置。对于其他IDE功能,我也喜欢自动完成程序包。同样,我M-x compile广泛使用并将全局密钥绑定到下一个和上一个错误。为了在“项目”中进行搜索,我通常只使用M-x find-grep。请注意,它将对下一个和上一个错误使用相同的键绑定。


4

管理软件“项目”。我希望我的IDE对组成当前项目的所有文件有所了解,以便我可以在项目中执行诸如搜索和替换之类的功能。(如果我也能做到这一点,而又不会在源代码树上堆满很多支持文件,那将是很好的选择。为什么每个项目需要一个以上的集中项目文件?)

射弹似乎是emacs中项目管理的最佳选择。它非常轻巧,您无需在项目中添加任何额外的文件。它将尝试根据某些特殊文件的存在为您自动检测项目。例如-如果您在git repo中工作,则projectile会将其视为一个项目(git跟踪的所有文件都将被视为项目的一部分),那么您将能够使用命令projectile-find-file来打开该项目中的任何文件。它还有许多其他命令,每个命令都基于项目运行。

错误报告。我不想读取500多行输出来查找构建工具报告的错误。优选地,错误显示在它们自己的缓冲区中,每个错误一行。

Flycheck支持使用clang / gcc检查语法。

了解项目中的符号及其定义位置。我想跳转到符号定义,无论它位于我的项目文件中还是位于系统包含文件中

我建议您看看rtags。它使用clang作为后端,并且可以很好地完成定义和完成。它也可以与flymake集成在一起,以使用clang显示错误和警告,因此它对#3可能也有帮助。此外,它对重构的支持有限。智能自动完成的另一种选择是反讽模式


2

Emacs当前随附的CEDET版本很难设置,但是您可以在官方网站上获得的版本更容易设置,并且可以满足您的#2和#4需求。

CEDET的EDE允许您管理例如makefile和automake项目,向其添加目标以及将文件与目标相关联。然后,您可以使用EDE命令编译项目。由于它使用Emacs的内置编译模式,因此您的#3需求也得到了满足。

CEDET的语义具有针对多种语言(包括C ++)的解析器。它可以检索文件中定义的标签,例如exuberant-ctags和GNU Global,但是它还具有准确的自动完成和跳转功能。如果您有两种称为“ foo”的方法,那么语义的跳转足够聪明,可以将您带到正确的位置。

对于#1,我个人使用了projectile,而在某些时候,我成功地将GDB用于#5。

#3的提示:如果EDE对您而言过于强大,则Emacs M-x recompile可以启动最后一个编译命令,因此您可以一次运行您的编译,然后recompile在任何缓冲区中使用。


1

对于#4,似乎是一个名为YouCompleteme的新项目,以及相应的Emacs客户端,这似乎是下一个有趣的事情。因为它使用clang,所以与标记或全局代码相比,它具有更好的代码视图。


1
感谢您的建议,但是由于我正在寻找可以很好地集成在一起的东西,因此我不确定尝试通过将Vim插件与原型Emacs客户端一起使用来尝试获得功能之一是最好的起点。
nispio 2014年

3
尝试使用github.com/abingham/emacs-ycmd代替emacs客户端(请注意,它使用github.com/Valloric/ycmd,而不是github.com/Valloric/YouCompleteMe)。它可以在公司模式下工作(在此推荐其他答案),因此可以与Emacs的其余部分很好地集成在一起。您可以从MELPA安装ycmd和company-ycmd(sprunge.us/LXGY是我的配置);并按照ycmd的构建说明进行操作。唯一的挑战是您需要将编译标志放入github.com/Valloric/ycmd/blob/master/examples/…之
Unhammer 2014年

1

我对CEDET的源代码仓库+ ECB + gtags + cscope感到很满意。就是说,在这篇文章中我将尝试许多建议。


1
您能否说明使所有这些工具协同工作所要做的事情?
nispio 2014年

4
目前,这似乎是一个错误的评论。:-)如果您愿意的话,请详细说明。
马拉巴巴

对不起,很抱歉。StackExchange App需要圆顶来适应。该解决方案回答了#4,涉及符号导航和源代码分析。CEDET当然包含语义。ECB是Emacs代码浏览器,使用CEDET列出方法并报告符号信息。Gtags和Cscope都从源库构建符号信息表(Helm也这样做),并且与Emacs集成以允许按标签或符号导航。
克莱·哈帕拉

1

如上文所述,射弹(可选带头盔)是用于项目管理的出色解决方案。

Ycmd非常适合代码完成和某些导航,它的最佳客户端是emacs-ycmd(完整披露:我编写了emacs客户端。)

对于“标签”和索引,我找到的最好的整体解决方案是代码搜索(更多披露:我也写了这个。)相当愚蠢,因为它实际上只是进行正则表达式搜索,但是速度非常快,而且通常您所需要的一切,并且可以跨多种语言正常运行。

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.