2013-03-07 40 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存儲庫中)。