2010-08-19 55 views
6

我正在處理一個大型的C++項目。我在過去的六個月裏一直在使用emacs。 我嘗試配置CEDET,以便能夠輕鬆導航,但我發現一些問題。Emacs源代碼導航功能

1.-有時語義不會找到某些符號,有時他不會...我不清楚哪些文件是語義索引。 我曾嘗試使用EDE(以下本文http://alexott.net/en/writings/emacs-devenv/EmacsCedet.html的說明),但我已經發現了一些問題,也...

  • 我有同一項目的多個版本(發行版),每一個在其自己的夾。我如何告訴emacs我正在使用哪個項目?
  • 我該如何告訴ede在哪裏尋找我的頭文件?我可以只指定一個根目錄,而語義將搜索所有子目錄中的頭文件嗎?

2.-我前段時間在和vim + cscope一起工作,我記得有一種方法可以在符號棧(Ctrl-t)中回溯。在emacs中有這樣的東西嗎?

P.D.>一些數據使問題更清楚。

我有同一個項目的多個版本。 每個人都有自己的根目錄。 每個項目都有一個子目錄內的多個模塊。 每個模塊中都有頭文件。

/home/user/ 
      | 
      \Release-001 
      |   | 
      |   \makefile 
      |   \ Module-001 
      |   |   | 
      |   |   \makefile 
      |   |   \subdir-001 
      |   |   |   \header-001.h 
      |   |   |   \header-002.h 
      |   |   \subdir-002 
      |   |   |   \header-003.h 
      |   \ Module-002 
      |   |   | 
      |   |   \makefile 
      |   |   \subdir-003 
      |   |   |   \header-004.h 
      |   |   |   \header-005.h 
      |   |   \subdir-004 
      |   |   |   \header-006.h 
      | 
      \Release-002 
      |   | 
      |   \makefile 
      |   \ Module-001 
      |   |   | 
      |   |   \makefile 
      |   |   \subdir-001 
      |   |   |   \header-001.h 
      |   |   |   \header-002.h 
      |   |   \subdir-002 
      |   |   |   \header-003.h 
      |   \ Module-002 
      |   |   | 
      |   |   \makefile 
      |   |   \subdir-003 
      |   |   |   \header-004.h 
      |   |   |   \header-005.h 
      |   |   \subdir-004 
      |   |   |   \header-006.h 

這是我的.emacs

;; Cedet load commands 
(add-to-list 'load-path "~/emacs-dir/cedet/cedet") 
(load-file "~/emacs-dir/cedet/cedet/common/cedet.el") 

;; EDE: activating mode. 
(global-ede-mode t) 

;; Projects definition 
(ede-cpp-root-project "Release-001" 
        :name "Release-001" 
        :file "~/Release-001/makefile" 
        :include-path '("/" 
            ) 
        :system-include-path '("~/exp/include") 
        :spp-table '(("SUSE9" . "") 
           ) 
) 
(ede-cpp-root-project "Release-002" 
        :name "Release-002" 
        :file "~/Release-002/makefile" 
        :include-path '("/" 
            ) 
        :system-include-path '("~/exp/include") 
        :spp-table '(("SUSE9" . "") 
           ) 
) 

只是爲了讓你知道...我使用Emacs的(-nw)家用機版工作有關EDE的配置,我有。

+0

您遇到過EDE有哪些問題? – 2010-08-19 09:20:48

+0

我編輯了這個問題來添加一些新的信息。 感謝您的關注。 – thamurath 2010-08-19 10:30:14

回答

2

您的配置基本上是正確的,除了:項目的include-path。

如果給定的源文件中說:

#include "Module-001/subdir-002/header-003.h" 

那麼確定。如果包括說:

#include "subdir-002/header-003.h" 

那麼你:包括路徑應該有

:include-path '("/Module-001") 

至於哪些東西做語義索引,它會索引你當前的文件,並且包含它可以找到的所有東西。使用語義修飾模式查看EDE爲您找到了哪些標題,以確定您的配置是否準確。

它還會將所編輯的同一目錄中的所有文件編入索引,但只在空閒時間編制索引,所以如果您不讓Emacs閒置,那麼它將無法解決它。

如果您使用Bozidar建議的CScope,則可以加快索引操作的速度。然後,您可以在EDE和語義數據庫中啓用CScope支持。但是,最近在語義庫中包含了CScope支持,因此您需要CEDET的CVS版本。這將確保整個事情被索引。

要向後導航,請調查semantic-mru-bookmark-mode的幫助。這通過您的文件在指定位置的基礎上追蹤您的進度,這非常方便且始終有效。

+0

感謝您的回答。 問題是頭文件遍佈整個項目。每個模塊都有子文件夾,標題在這個子文件夾內,因此指定標題所在的所有路徑將是一個地獄。 - 有什麼方法可以讓Semmantic在根路徑下的所有子目錄中查找標題? - 閱讀EDE文檔,我發現「不要將路徑指定爲列表,還可以提供函數,它將執行搜索項目中的包含文件。」不幸的是,我不知道elisp。任何地方,我可以找到一個例子? 謝謝! – thamurath 2010-08-20 07:00:12

+1

包含路徑的目的是通過關注路徑來更快地查找路徑。如果沒有好處,那麼最好的辦法就是使用CScope。一旦啓用了CScope作爲EDE查找功能(請參閱變量ede-locate-setup-options),就好像將所有文件的所有內容都作爲包含路徑一樣。有可能有一些警告,但我沒有嘗試過這個伎倆自己知道肯定。 – Eric 2010-08-22 01:26:08

0

我曾經在使用C++項目時使用過Emacs Code Browser,我發現它非常令人滿意 - 除了優秀的文件和代碼結構導航之外,您還可以獲得出色的VCS集成(根據當前文件狀態該項目)。與ECB一起,我使用cscope來處理Emacs,因爲您在vim中提到過,您可能也想在Emacs中使用它。

或者,如果你想要一個更簡單的解決方案,你可以看看Emacs Nav。它也支持一些花哨的東西,並且對語義和速度條沒有依賴性 - 您只需使用etags/ctags爲您的項目編制索引。