簡體   English   中英

Emacs 的標簽:etags、ebrowse、cscope、GNU Global 和 exuberant ctags 之間的關系

[英]Tags for Emacs: Relationship between etags, ebrowse, cscope, GNU Global and exuberant ctags

我從事 C++ 項目,我瀏覽了 Alex Ott 的CEDET 指南和有關 StackOverflow 中標簽的其他線程,但我仍然對 Emacs 如何與這些不同的標簽系統交互以促進自動完成、定義查找、源代碼導航感到困惑代碼庫或文檔字符串的預覽。

  1. etagsebrowseexuberant ctagscscopeGNU GlobalGTags之間有什么區別(例如在功能方面)? 我需要做什么才能在Emacs 中使用它們?

  2. 如果我想使用標簽來導航/自動完成符號,是否需要語義/參議員 (CEDET)?

  3. 在這些不同的標簽實用程序之上,語義為表格帶來了什么? 它如何與這些工具交互?

這是一個很好的問題,因為我最近在這里讀到過,所以我會嘗試更詳細地解釋差異:

第 1 點:

etagsctags都生成在源文件中找到的語言對象的索引(又名 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-TABCMi並觀察語義自動為您完成。 對於默認情況下未啟用語義的語言,您可以將以下行添加到您選擇的主要模式掛鈎中:

(add-to-list 'completion-at-point-functions 'semantic-completion-at-point-function)

第 3 點。

語義帶來了真正的代碼意識(對於它目前支持的少數語言)並縮小了 IDE 和 Emacs 之間的差距。 它並沒有真正與etagscscope等工具交互,但這並不意味着您不能將它們一起使用。

希望我的解釋有意義並且對你有用。

PS我不太熟悉globalebrowse ,但如果沒記錯的話,他們使用了 etags 。

我將嘗試為 1 添加一些解釋。

它是什么?

  • Etags 是生成“TAGS”文件的命令,該文件是 Emacs 的標簽文件。 您可以將該文件與 emacs 包中的 etags.el 一起使用。
  • Ctags 是生成“tags”文件的命令,該文件是vi 的標簽文件。 Exuberant Ctags 的后繼者 Universal Ctags 可以通過 -e 選項生成“TAGS”文件,支持超過 41 種編程語言。
  • Cscope 是一款多合一的 C 語言源代碼瀏覽工具。 它有自己的精細 CUI(字符用戶界面)和標簽數據庫(cscope.in.out、cscope.out、cscope.po.out)。 您可以使用 emacs 中的 cscope 使用 xcscope.el,它是 cscope 包的一部分。
  • GNU GLOBAL 是一個源代碼標記系統。 雖然它與上述工具類似,但與它們的不同之處在於它依賴於任何編輯器,並且除了命令行之外沒有用戶界面。 Gtags 是為 GLOBAL(GTAGS、GRTAGS、GPATH)生成標簽文件的命令。 您可以使用 gtags.el 從 emacs 中使用 GLOBAL,它是 GLOBAL 包的一部分。 除此之外,還有許多 elisp 庫(xgtags.el、ggtags.el、anything-gtags.el、helm-gtags.el 等)。

比較

  • Ctags 和 etags 只處理定義。 Cscope 和 GNU GLOBAL 不僅處理定義,還處理引用。
  • Ctags 和 etags 使用純文本標記文件。 Cscope 和 GNU GLOBAL 使用鍵值標簽數據庫。
  • Cscope 和 GNU GLOBAL 具有類似搜索引擎的 grep 和標記文件的增量更新功能。

組合

通過使用 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 文件包含定義

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 文件

TAGS 文件可以由不同的工具構建

ctags (以前稱為'universal ctags' 或'exuberant ctags')可以生成TAGS 文件並支持最廣泛的語言。 它在 github 上積極維護。

Emacs 附帶了兩個生成 TAGS 文件的程序,分別稱為etagsctags Emacs 的ctags只是具有與通用 ctags 相同的 CLI 界面的etags 為了避免混淆,許多發行版重命名了這些程序(例如 Debian 上的ctags.emacs24 )。

還有用於生成 TAGS 文件的語言特定工具,例如jsctagshasktags

其他文件格式

ebrowse是 Emacs 附帶的 C 程序。 它索引 C/C++ 代碼並生成BROWSE文件。 ebrowse.el 提供通常的查找定義和完成。 您還可以直接在 Emacs 中打開BROWSE文件,以獲得定義代碼庫的類/函數的概述。

GNU Global有自己的數據庫格式,它由GTAGSGRTAGSGPATH文件組成。 您可以使用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 文件的子集。

語義 (CEDET)

Semantic 是一個內置的 Emacs 包,它包含一個 C/C++ 解析器,因此它也可以找到定義。 它還可以從 TAGS 文件、csope 數據庫和其他來源導入數據。 CEDET 還包括使用此數據的 IDE 樣式功能,例如生成類層次結構的 UML 圖。

[從shigio更新的答案]

我將嘗試為問題的第 1 部分添加一些解釋。

它是什么?

  1. Etags生成一個TAGS文件,它是Emacs標記文件格式 您可以將 Etags 文件與etags.el一起使用,它是 Emacs 的一部分。
  2. Ctags是任何可以生成tags文件的通用術語,它是 Vi 的原生標簽文件格式。 Universal Ctags (又名UCtags ,以前的UCtags Ctags)也可以使用-e選項生成 Etags。
  3. Cscope是一個多合一的 C 源代碼瀏覽工具(對 C++ 和 Java 的支持較少),有自己的標簽數據庫( cscope.in.outcscope.outcscope.po.out )和TUI Vim 內置了 Cscope 支持; 您可以使用xcscope.el 包從 Emacs 使用 Cscope。 還有基於 Cscope 的 GUI
  4. GNU GLOBAL (又名Gtags )是另一個源代碼標記系統(有顯着差異——見下一節),因為它也生成標記文件。

比較

  • Ctags 和Etags 只處理定義(例如,變量和函數)。 Cscope 和 Gtags 也處理引用。
  • Ctags 和 Etags 標記文件是扁平的 Cscope 和 Gtags 標記文件是更強大的鍵值數據庫,它允許(例如)增量更新。
  • Cscope 和 Gtags 有一個類似grep的搜索引擎。
  • Ctags 內置了對更多語言和數據格式的支持:請參閱通用 Ctags 解析器的當前存儲庫列表 UCtags 還記錄了如何開發您自己的解析器
  • Cscope 和 Gtags 是獨立於編輯器的。
  • Gtags 不提供自己的用戶界面,但目前(2016 年 10 月)可以從命令行 (CLI)、Emacs 和親屬、Vi 和親屬、 less (尋呼機)、 Doxygen和任何網絡瀏覽器使用。
  • Gtags 通過 GLOBAL 包提供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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM