21

我是 Emacs 新手。我必须尝试搜索如何使用 Emacs 与大型 C++ 项目一起使用,特别是索引代码和自动完成函数名称以及行为类似于 Eclipse。我使用 Vim 已经有一段时间了,我使用 ctags 来索引项目中的代码,而 Vim 过去常常尝试使用选项下拉菜单自动完成我的代码。我现在正试图用 Emacs 实现同样的目标。但是,在我的搜索过程中,结果指向 CEDET 和自动完成以及其他 3rd 方插件。

我尝试将 ctags 与ctags -e -R .etags 一起使用,但没有成功。

我是否错过了 Emacs 实现相同行为的默认方式?实现我想要的最好和最简单的方法是什么?

4

5 回答 5

16

我成功地使用了带有自动完成功能的 CEDET。基本上,自动完成是下拉框的提供者,它的来源来自各种事物,最有趣的是来自 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,并正确安装/配置自动完成功能。我强烈建议 el-get 安装自动完成功能(以及其他一些东西)。您需要为 EDE 设置通用项目,以使自动完成功能适用于不属于结构化 EDE 项目的随机 C/C++ 文件。

您将不得不花一些时间来配置 emacs,但这是有回报的。正确设置后,该工具的生产力惊人。

于 2013-03-07T22:26:18.603 回答
11

索引

您可能想要使用GNU/global而不是 ctags:它支持 C++,并且在我看来对大型项目更有效(特别是因为您可以更新索引而不是从头开始重建它)。使用 CEDET/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存储库中)。

于 2013-03-07T22:31:11.653 回答
6

这取决于您在 IDE 中寻找什么。我一直在将 Emacs 用于一个相当大的 C++ 项目。当然,您需要将 emacs 配置为您希望它在任何其他 IDE 中更大程度地工作。

但是,CEDET 是一个开始,尽管它并不完美。

然而,Emacs 有一个非常好的自动完成模式http://cx4a.org/software/auto-complete/它不是智能感知,但它应该以某种方式与 CEDET 集成,以便为您提供非常好的自动完成。

我经常使用的另一个重要功能是ff-find-other-file轻松从头文件和实现文件跳转的功能。

然后,您当然需要滚动自己的 bulid。CEDET 对项目有一些支持,但我没有测试过。然而,Emacs 与 make 等命令行构建工具集成得很好。错误会打印在缓冲区中,您可以在 Emacs 中轻松跳转到正确的行。

GDB 也很好地与 Emacs 集成M-x gdb,然后记住gdb-many-windows 命令。

于 2013-03-07T22:21:33.190 回答
2

我建议在 CppCon 2015 上观看 Atila Neves 的闪电演讲,标题为Emacs as a C++ IDE

有关详细信息,请参阅我对此相关问题的回答。

于 2015-11-15T18:34:41.990 回答
1

请参阅https://emacs.stackexchange.com/questions/26518/sequence-of-packages-to-be-installed-to-make-emacs-an-ide-for-cc

我使用 GNU Global 和两个流行的 Emacs 插件:

  • 代码完成公司

  • 用于代码导航的 emacs-helm-gtags

于 2016-08-29T13:01:56.740 回答