[英]Tags for Emacs: Relationship between etags, ebrowse, cscope, GNU Global and exuberant ctags
我從事 C++ 項目,我瀏覽了 Alex Ott 的CEDET 指南和有關 StackOverflow 中標簽的其他線程,但我仍然對 Emacs 如何與這些不同的標簽系統交互以促進自動完成、定義查找、源代碼導航感到困惑代碼庫或文檔字符串的預覽。
etags
、 ebrowse
、 exuberant ctags
、 cscope
、 GNU Global
和GTags
之間有什么區別(例如在功能方面)? 我需要做什么才能在Emacs 中使用它們?
如果我想使用標簽來導航/自動完成符號,是否需要語義/參議員 (CEDET)?
在這些不同的標簽實用程序之上,語義為表格帶來了什么? 它如何與這些工具交互?
這是一個很好的問題,因為我最近在這里讀到過,所以我會嘗試更詳細地解釋差異:
第 1 點:
etags
和ctags
都生成在源文件中找到的語言對象的索引(又名 tag/TAGS)文件,允許文本編輯器或其他實用程序快速輕松地定位這些項目。 標簽表示索引條目可用的語言對象(或者,為該對象創建的索引條目)。 ctags 生成的標簽在元數據方面更豐富,但 Emacs 無論如何都無法解釋額外的數據,因此您應該或多或少地考慮它們( ctags
的主要優點是它支持更多語言)。 標簽文件的主要用途是查找類/方法/函數/常量/等聲明/定義。
cscope
是更強大的野獸(至少就 C/C++ 和 Java 而言)。 雖然它或多或少以相同的原理運行(生成一個有用的元數據文件),但它允許您做一些更有趣的事情,例如查找對符號的所有引用,查看調用函數的位置等(您也可以找到定義) .
把它們加起來:
ctags
one 允許您導航到符號聲明/定義(有些人稱之為單向查找)。 ctags
是一種通用工具,可用於多種語言。
另一方面(如項目頁面所述) cscope
允許您:
在這一點上,任何人都應該不會感到驚訝,當我處理 C/C++ 項目時,我大量使用cscope
並且很少關心ctags
。 在處理其他語言時,情況顯然會相反。
第 2 點。
要實現智能自動完成,您需要一個真正的源代碼解析器(如語義),否則您將不知道應用程序中對象的類型(例如)以及可以對其調用的方法。 您可以根據許多不同的來源進行自動完成,但為了獲得最佳結果,您最終需要一個解析器。 語法高亮也是如此——目前 Emacs 主要模式中的語法高亮僅基於正則表達式,非常脆弱且容易出錯。 希望在 Emacs 23.2 中包含語義(在此之前它曾經是一個外部包),我們將開始看到它的更多用途(例如使用它來分析緩沖區源代碼以正確突出顯示它)
由於 Emacs 24.1 語義可從 Emacs 完成框架中使用。 測試它的最簡單方法是打開一個 C 源代碼文件並輸入M-TAB或CMi並觀察語義自動為您完成。 對於默認情況下未啟用語義的語言,您可以將以下行添加到您選擇的主要模式掛鈎中:
(add-to-list 'completion-at-point-functions 'semantic-completion-at-point-function)
第 3 點。
語義帶來了真正的代碼意識(對於它目前支持的少數語言)並縮小了 IDE 和 Emacs 之間的差距。 它並沒有真正與etags
和cscope
等工具交互,但這並不意味着您不能將它們一起使用。
希望我的解釋有意義並且對你有用。
PS我不太熟悉global
和ebrowse
,但如果沒記錯的話,他們使用了 etags 。
我將嘗試為 1 添加一些解釋。
它是什么?
比較
組合
通過使用 ctags 作為 GLOBAL 的插件解析器,您可以結合 Universal Ctags 豐富的語言支持和 GNU GLOBAL 的數據庫功能。
嘗試以下操作:(分別需要 GLOBAL-6.5.3+ 和 Universal Ctags)
構建 GNU 全局:
$ ./configure --with-universal-ctags=/usr/local/bin/ctags
$ sudo make install
用法:
$ export GTAGSCONF=/usr/local/share/gtags/gtags.conf
$ export GTAGSLABEL=new-ctags
$ gtags # invokes Universal Ctags internally
$ emacs -f gtags-mode # load gtags.el
(但是,您不能通過這種方法處理引用,因為 ctags 不處理引用。)
您還可以將 cscope 用作 GNU GLOBAL 的客戶端。 GLOBAL 包包含一個名為“gtags-cscope”的命令,它是cscope 的一個端口,也就是說,它是cscope 本身,只是它使用GLOBAL 作為搜索引擎而不是cscope 的搜索引擎。
$ gtags-cscope # this is GLOBAL version of cscope
通過組合,您可以將 cscope 用於 41 種語言。
祝你好運!
TAGS
文件包含定義函數和類的列表。 它通常放置在項目的根目錄中,如下所示:
^L
configure,3945
as_fn_success () { as_fn_return 0; }^?as_fn_success^A180,5465
as_fn_failure () { as_fn_return 1; }^?as_fn_failure^A181,5502
as_fn_ret_success () { return 0; }^?as_fn_ret_success^A182,5539
as_fn_ret_failure () { return 1; }^?as_fn_ret_failure^A183,5574
這使 Emacs 能夠找到定義。 find-tag
內置了基本導航,但是當有多個匹配項時, etags-select
提供了更好的 UI。
您還可以使用 TAGS 文件來完成代碼。 例如, 公司的 etags 后端使用 TAGS 文件。
ctags
(以前稱為'universal ctags' 或'exuberant ctags')可以生成TAGS 文件並支持最廣泛的語言。 它在 github 上積極維護。
Emacs 附帶了兩個生成 TAGS 文件的程序,分別稱為etags
和ctags
。 Emacs 的ctags
只是具有與通用 ctags 相同的 CLI 界面的etags
。 為了避免混淆,許多發行版重命名了這些程序(例如 Debian 上的ctags.emacs24
)。
還有用於生成 TAGS 文件的語言特定工具,例如jsctags
和hasktags
。
ebrowse
是 Emacs 附帶的 C 程序。 它索引 C/C++ 代碼並生成BROWSE
文件。 ebrowse.el 提供通常的查找定義和完成。 您還可以直接在 Emacs 中打開BROWSE
文件,以獲得定義代碼庫的類/函數的概述。
GNU Global有自己的數據庫格式,它由GTAGS
、 GRTAGS
和GPATH
文件組成。 您可以使用gtags
命令生成這些文件,該命令解析 C/C++ 代碼。 對於其他語言,GNU Global 可以讀取通用 ctags 生成的文件。
GNU Global 還提供了一個 CLI 界面來詢問更復雜的問題,比如“這個符號在哪里提到?”。 它附帶一個 Emacs 包 gtags.el,但ggtags.el也很流行用於訪問 GNU 全球數據庫。
Cscope在本質上與 GNU Global 相似:它將 C/C++ 解析為自己的數據庫格式。 它還可以回答諸如“查找此功能的所有調用者/被調用者”之類的問題。
另請參閱此 HN 討論比較 global 和 cscope 。
rtags使用持久服務器解析和索引 C/C++。 它使用 clang 解析器,因此它可以很好地處理 C++。 它附帶了一個 Emacs 包來查詢服務器。
google-gtags是一個大型 TAGS 文件將存儲在服務器上的項目。 當您查詢服務器時,它會提供與您的搜索相關的 TAGS 文件的子集。
Semantic 是一個內置的 Emacs 包,它包含一個 C/C++ 解析器,因此它也可以找到定義。 它還可以從 TAGS 文件、csope 數據庫和其他來源導入數據。 CEDET 還包括使用此數據的 IDE 樣式功能,例如生成類層次結構的 UML 圖。
[從shigio更新的答案]
我將嘗試為問題的第 1 部分添加一些解釋。
它是什么?
TAGS
文件,它是Emacs的標記文件格式。 您可以將 Etags 文件與etags.el
一起使用,它是 Emacs 的一部分。Ctags
是任何可以生成tags
文件的通用術語,它是 Vi 的原生標簽文件格式。 Universal Ctags (又名UCtags
,以前的UCtags
Ctags)也可以使用-e
選項生成 Etags。cscope.in.out
、 cscope.out
、 cscope.po.out
)和TUI 。 Vim 內置了 Cscope 支持; 您可以使用xcscope.el 包從 Emacs 使用 Cscope。 還有基於 Cscope 的 GUI 。Gtags
)是另一個源代碼標記系統(有顯着差異——見下一節),因為它也生成標記文件。比較
grep
的搜索引擎。less
(尋呼機)、 Doxygen和任何網絡瀏覽器使用。gtags.el
,但也有許多其他 elisp 擴展,包括 xgtags.el、ggtags.el、anything-gtags.el、helm-gtags.el。組合
通過將 Ctags 用作GLOBAL 插件解析器,您可以將 Universal Ctags 的豐富語言支持與 Gtags 的數據庫工具和眾多擴展相結合:
# build GNU GLOBAL
./configure --with-exuberant-ctags=/usr/local/bin/ctags
sudo make install
# use it
export GTAGSCONF=/usr/local/share/gtags/gtags.conf
export GTAGSLABEL=ctags
gtags # invokes Universal Ctags internally
emacs -f gtags-mode # load gtags.el
再次注意,如果您使用 Ctags 作為 Gtags 的解析器,您將失去處理 Gtags 否則會提供的引用(例如,變量使用、函數調用)的能力。 本質上,您可以用 Gtags 的參考跟蹤來換取 Ctags 更強大的內置語言支持。
您還可以使用 Cscope 作為 Gtags 的客戶端: gtags-cscope
。
祝你好運!
我還沒有真正檢查過,但根據 CEDET 手冊( http://www.randomsample.de/cedetdocs/common/cedet/CScope.html ):
語義可以使用 CScope 作為數據庫搜索的后端。 要啟用它,請使用:
(semanticdb-enable-cscope-databases)
這將使 cscope 能夠用於所有 C 和 C++ 緩沖區。
當預先存在的語義數據庫搜索可能沒有解析所有文件時,CScope 將用於項目范圍的搜索作為備份。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.