【问题标题】:Emacs as an IDE for large C++ projectsEmacs 作为大型 C++ 项目的 IDE
【发布时间】:2013-02-23 07:16:36
【问题描述】:

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

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

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

【问题讨论】:

  • 您可能想查看 GNU global plus xgtags.el 和基于 clang 的自动完成。语义也可以同时使用两者。
  • 查看c++自动补全的clang:root42.blogspot.hu/2012/07/…
  • 我目前正在开发clang-tags,一个基于clang的索引工具。它仍处于开发的早期阶段,但您可能会发现它很有用。如果你真的尝试了,我会很高兴在 github 上得到一些反馈。

标签: c++ emacs ide


【解决方案1】:

我成功使用了带有自动完成功能的 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,但它得到了回报。一旦设置正确,该工具的生产力就会惊人。

【讨论】:

  • +1 表示“一旦正确设置,该工具的生产力就会惊人”
  • 我可能不得不指出,我不再使用 CEDET,因为 C++ 解析器不是很准确,而且慢得要命。我现在使用基于 libclang 的讽刺模式来完成,并使用 gtags 来导航。
【解决方案2】:

索引

您可能想要使用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 存储库中)。

【讨论】:

    【解决方案3】:

    这取决于您在 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 命令即可。

    【讨论】:

      【解决方案4】:

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

      详情见我对this related question的回复。

      【讨论】:

        【解决方案5】:

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

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

        • 代码补全公司

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-05-31
          • 2011-08-13
          • 1970-01-01
          • 2010-09-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多