Emacs作为大型C++项目的集成开发环境

22

我是一个Emacs的新手。我一直在尝试寻找如何使用Emacs来处理大型C++项目,特别是索引代码和自动补全函数名称以及类似Eclipse的行为。我曾经使用Vim一段时间,其中我使用ctags索引了我的项目中的代码,而Vim会尝试使用下拉菜单选项自动完成我的代码。现在我正在尝试在Emacs中实现同样的功能。但是,在我的搜索过程中,结果指向了CEDET、auto-complete和其他第三方插件。

我尝试使用ctags -e -R .和etags,但没有成功。

我是否错过了Emacs默认实现相同行为的方法?哪种方法最好、最容易实现我想要的功能?


你可能想要查看GNU Global加上xgtags.el和基于Clang的自动完成。Semantic也可以同时使用它们。 - Arne
请查看clang来进行C++自动补全:http://root42.blogspot.hu/2012/07/nice-c-autocomplete-configuration-for.html - Tom
我目前正在开发 clang-tags,这是一个基于clang的索引工具。它仍处于开发的早期阶段,但您可能会发现它可用。如果您尝试使用它,我将非常高兴在github上得到一些反馈。 - François Févotte
5个回答

17

我成功地使用CEDET和autocomplete。基本上,autocomplete是下拉框提供者,它从各种来源获取数据,最有趣的是从CEDET获取(但也从etags和Gnu Global获取,我也推荐使用)。

CEDET的一个很好的起点是http://alexott.net/en/writings/emacs-devenv/EmacsCedet.html

Alex Ott的emacs配置在这里:https://github.com/alexott/emacs-configs——它是一个有用的资源。

请注意,您需要从bzr获取CEDET,并正确安装/配置autocomplete。我强烈推荐使用el-get来安装autocomplete(以及其他一些东西)。您需要为EDE设置通用项目,以使自动完成功能适用于任意的C/C++文件而不是结构化的EDE项目的一部分。

您需要花时间去配置emacs,但回报非常大。一旦正确设置,该工具的生产力令人惊叹。


+1 for "工具一旦设置正确,生产力就非常惊人" - Pratik Singhal
我可能需要指出,我不再使用CEDET了,因为C++解析器不太准确,而且速度非常慢。我现在使用基于libclang的irony-mode进行代码补全,使用gtags进行导航。 - Alexandre C.

12

索引

对于大型项目,您可能希望使用GNU/global而不是ctags:它支持C ++,并且在我的意见中对更新索引更有效率(特别是因为您可以更新索引而无需从头开始重建)。而且,相比设置时间更长的CEDT / Semantic(如果您花费时间进行设置,它也是一种非常出色的工具),它仍然更加简单易用。

示例用法:

$ cd sources
$ gtags -v         # create the index
$ cd subdirectory
$ [hack hack hack]
$ global -u        # update the index (can be called from anywhere in the project)

在Emacs中,在源代码缓冲区中激活gtags-mode,以便访问gtags命令:

  • gtags-find-tag (M-.):查找源文件中指定标记的定义(如果有多个定义,则gtags可供选择,如果只有一个可能性,则直接跳转)
  • gtags-pop-stack (M-*):返回上一个位置
  • gtags-find-rtag:查找源文件中指定标记的所有用法

以下是我的gtags配置,如果找到索引,则自动激活gtags-mode

;; gtags-mode
(eval-after-load "gtags"
  '(progn
     (define-key gtags-mode-map (kbd "M-,") 'gtags-find-rtag)))
(defun ff/turn-on-gtags ()
  "Turn `gtags-mode' on if a global tags file has been generated.

This function asynchronously runs 'global -u' to update global
tags. When the command successfully returns, `gtags-mode' is
turned on."
  (interactive)
  (let ((process (start-process "global -u"
                                "*global output*"
                                "global" "-u"))
        (buffer  (current-buffer)))
    (set-process-sentinel
     process
     `(lambda (process event)
        (when (and (eq (process-status process) 'exit)
                   (eq (process-exit-status process) 0))
          (with-current-buffer ,buffer
            (message "Activating gtags-mode")
            (gtags-mode 1)))))))

(add-hook 'c-mode-common-hook 'ff/turn-on-gtags)

自动完成

我不知道有什么比auto-complete更好的工具了。即使它没有包含在Emacs中,也可以非常容易地使用包管理系统进行安装(例如在marmalademelpa仓库中)。


6
取决于您在IDE中要寻找什么。我一直在为一个相当大的C++项目使用Emacs。当然,您需要配置emacs以按照你想要的方式工作,比任何其他IDE都更加重要。
但是,CEDET是一个开始,尽管它并不完美。
然而,对于Emacs来说,有一个非常好的自动完成模式: http://cx4a.org/software/auto-complete/ 它不是Intelisense,但它应该以某种方式与CEDET集成,从而为您提供相当好的自动完成。
我经常使用的另一个重要功能是函数ff-find-other-file,以便从头文件和实现文件轻松跳转。
然后,当然您需要创建自己的构建。CEDET对项目有一些支持,但我还没有测试过。但是,Emacs很好地与命令行构建工具(如make)集成。错误信息将在一个缓冲区中打印,并且您可以轻松地在Emacs中跳转到正确的行。
GDB也很好地集成了Emacs M-x gdb,然后只需记住gdb-many-windows命令即可。

2

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接