2013-03-07 70 views
20

我是Emacs的新手。我不得不努力搜索如何使用Emacs与大型C++项目一起使用,特别是索引代码和自动完成函数名称并表现类似于Eclipse的行为。我一直在使用Vim一段时间,我用ctags来索引我的项目中的代码,而Vim用来尝试使用选项的下拉菜单自动完成我的代码。我现在正在尝试与Emacs一样。但是,在我的搜索过程中,结果指向CEDET和自动完成以及其他第三方插件。Emacs作为大型C++项目的IDE

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

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

+0

您可能想查看GNU global plus xgtags.el和clang based auto-complete。语义也可以同时使用。 – Arne 2013-03-07 22:30:25

+0

检查铿锵C++自动完成:http://root42.blogspot.hu/2012/07/nice-c-autocomplete-configuration-for.html – Tom 2013-03-08 07:11:07

+0

我目前正在开发['clang-tags'](https:/ /github.com/ffevotte/clang-tags),这是一个基于clang的索引工具。它仍处于开发的早期阶段,但您可能会发现它是可用的。如果你确实尝试过,我会很高兴在github上获得一些反馈。 – Francesco 2013-03-08 07:29:04

回答

16

我成功使用CEDET并自动完成。基本上,自动完成是下拉框提供商,它从各种各样的东西中获取资源,最有趣的是CEDET(也来自我推荐的etags和Gnu Global)。

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

亚历克斯奥特的emacs的配置有:https://github.com/alexott/emacs-configs - 这是一个有用的资源。

请注意,您需要从bzr获取CEDET,并正确安装/配置自动完成。我强烈建议el-get安装自动完成功能(以及其他一些功能)。您需要为EDE设置通用项目,以使自动完成功能适用于不属于结构化EDE项目的随机C/C++文件。

您将不得不花费一些时间来配置emacs,但是它可以带来回报。一旦设置正确,该工具的生产效率非常高。

+0

+1“该工具一旦正确设置后效率惊人” – 2014-07-28 16:34:08

+0

由于C++解析器不是非常准确,而且速度很慢,所以我可能不得不注意到我不再使用CEDET。我现在使用基于libclang的反讽模式来完成,并使用gtags进行导航。 – 2014-07-28 16:50:41

5

这取决于您在IDE中查找的内容。我一直在使用Emacs做一个相当大的C++项目。当然,您需要配置emacs以使其能够在更大程度上与任何其他IDE一起工作。

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

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

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

当然,你需要推出自己的bulid。 CEDET对项目有一定的支持,但我没有对它进行测试。然而,Emacs可以很好地与make等命令行构建工具集成。错误将打印在缓冲区中,您可以在Emacs中轻松地跳到正确的行。

GDB还集成了Emacs M-x gdb,然后只记得gdb-many-windows命令。

10

索引

您可能需要使用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-tagM-。):发现的定义(gtags可让您在所有可能的定义之间进行选择,如果只有一种可能性,则可以直接跳转)
  • gtags-pop-stackM- *):返回到前面的位置
  • 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存储库中)。