Emacs的标签:etags,ebrowse,cscope,GNU Global和旺盛的ctags之间的关系

时间:2012-10-16 19:59:19

标签: emacs cscope cedet gnu-global

我在C ++项目上工作,我在AlexOtt的guide to CEDET和其他关于StackOverflow中标签的线程中进行了讨论,但我仍然对Emacs如何与这些不同的标签系统进行交互以促进自动完成感到困惑,定义,源代码库的导航或doc-strings的预览。

  1. etagsebrowseexuberant ctagscscopeGNU Global和{{}之间的区别(例如在功能方面) 3}}?在 Emacs 中使用它们需要做什么?

  2. 如果我想使用标签导航/自动完成符号,是否需要语义/参议员(CEDET)?

  3. 语义在这些不同的标记实用程序之上带来了什么?它如何与这些工具连接?

5 个答案:

答案 0 :(得分:64)

这是我最近在这里阅读的一个很好的问题,所以我会尝试更详细地解释这些差异:

第1点:

etagsctags都生成源文件中找到的语言对象的索引(a.k.a. tag / TAGS)文件,允许文本编辑器或其他实用程序快速轻松地找到这些项目。标记表示索引条目可用的语言对象(或者,也就是为该对象创建的索引条目)。由ctags生成的标签在元数据方面更丰富,但Emacs无论如何都无法解释其他数据,因此您应该或多或少地考虑它们(ctags的主要优势是它支持更多语言)。标签文件的主要用途是查找类/方法/函数/常量/等声明/定义。

cscope是更强大的野兽(至少就C / C ++和Java而言)。虽然它可以或多或少地运行相同的原理(生成有用的元数据文件),但它允许你做一些更有趣的事情,比如查找对符号的所有引用,查看调用函数的位置等等(你也可以找到定义) 。

总结一下:

ctags允许您导航到符号声明/定义(有些人称之为单向查找)。 ctags是一种适用于多种语言的通用工具。

另一方面(如项目页面所述)cscope允许您:

  • 转到符号声明
  • 显示符号所有引用的可选列表
  • 搜索任何全球定义
  • 函数调用的函数
  • 调用函数的函数
  • 搜索文字字符串
  • 搜索正则表达式
  • 查找文件
  • 查找包含文件的所有文件

现在任何人都不应该感到惊讶,当我处理C / C ++项目时,我大量使用cscope并且对ctags非常关注。处理其他语言时,情况显然会逆转。

第2点。

要拥有智能自动完成功能,您需要一个真正的source code parser(如语义),否则您将不知道应用程序中的对象类型(例如)以及可以在它们上调用的方法。您可以根据许多不同的来源进行自动完成,但为了获得最佳结果,您最终需要一个解析器。语法高亮也是如此 - 目前Emacs主要模式中的语法高亮仅仅基于正则表达式,而且非常脆弱且容易出错。希望在Emacs 23.2中包含语义(之前它曾经是一个外部包),我们将开始看到它的更多用途(比如使用它来分析缓冲区源代码以正确地突出显示它)

因为Emacs 24.1语义可以从Emacs完成框架中使用。测试它的最简单方法是打开一个C源代码文件并键入 M-TAB C-M-i 并观察语义自动完成。对于默认情况下未启用语义的语言,您可以将以下行添加到您选择的主模式挂钩中:

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

第3点。

语义带来了真正的代码感知(对于它目前支持的少数几种语言)并缩小了IDE和Emacs之间的差距。它并不真正与etagscscope等工具相关联,但并不意味着您不能将它们一起使用。

希望我的解释有意义,对你有用。

P.S。我对globalebrowse并不熟悉,但如果记忆为我服务,他们就会使用etags。

答案 1 :(得分:40)

我会尝试在1中添加一些解释。

这是什么?

  • Etags是生成'TAGS'文件的命令,该文件是Emacs的标记文件。您可以将该文件与etags.el一起使用,该文件是emacs包的一部分。
  • Ctags是生成'tags'文件的命令,该文件是vi的标记文件。现在,Exuberant Ctags可以通过-e选项生成'TAGS'文件,并支持41种编程语言。
  • Cscope是C语言的一体化源代码浏览工具。它有自己的精细CUI(字符用户界面)和标签数据库(cscope.in.out,cscope.out,cscope.po.out)。您可以使用xcscope.el来使用Emacs中的cscope,它是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的插件解析器,结合Exuberant Ctags的丰富语言支持和GNU GLOBAL的数据库工具。

请尝试以下操作:(分别需要GLOBAL-6.0,Exuberant Ctags-5.5或更高版本)

构建GNU GLOBAL:

$ ./configure --with-exuberant-ctags=/usr/local/bin/ctags
$ sudo make install

用法:

$ export GTAGSCONF=/usr/local/share/gtags/gtags.conf
$ export GTAGSLABEL=ctags
$ gtags                     # invokes Exuberant 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种语言。

祝你好运!

答案 2 :(得分:8)

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在多个匹配时提供更好的用户界面。

您还可以使用TAGS文件完成代码。例如,company's etags backend uses TAGS files

TAGS文件可以通过不同的工具构建

ctags(以前称为'universal ctags'或'exuberant ctags')可以生成TAGS文件并支持最广泛的语言。它在github上得到了积极的维护。

Emacs附带两个生成TAGS文件的程序,名为etagsctags。 Emacs'ctags只是etags,具有与通用ctags相同的CLI界面。为避免混淆,许多发行版重命名这些程序(例如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 Global数据库。

Cscope在精神上与GNU Global类似:它将C / C ++解析为自己的数据库格式。它还可以回答诸如“查找此功能的所有呼叫者/被叫者”之类的问题。

另见this HN discussion comparing global and cscope

客户端/服务器项目

rtags使用持久性服务器解析和索引C / C ++。它使用clang解析器,因此它可以很好地处理C ++。它附带一个Emacs包来查询服务器。

google-gtags是一个大型TAGS文件存储在服务器上的项目。当您查询服务器时,它将提供与您的搜索相关的TAGS文件的子集。

语义(CEDET)

Semantic是一个内置的Emacs包,包含一个C / C ++解析器,因此它也可以找到定义。它还可以从TAGS文件,csope数据库和其他来源导入数据。 CEDET还包括使用此数据的IDE样式功能,例如,生成类层次结构的UML图。

答案 3 :(得分:5)

[答案更新自shigio&#39;

我会尝试在问题的第1部分添加一些解释。

这是什么?

  1. Etags生成一个TAGS文件,即tag file format for Emacs。您可以将Etags文件与etags.el一起使用,该文件是Emacs的一部分。
  2. Ctags是可以生成tags文件的任何通用术语,该文件是Vi的本机标记文件格式。 Universal Ctags(又名UCtags,以前是Exuberant Ctags)也可以使用-e选项生成Etags。
  3. Cscope是C的一体化源代码浏览工具(对C ++和Java的支持较少),具有自己的标记数据库(cscope.in.outcscope.out,{ {1}})和TUI。 Cscope支持内置于Vim;您可以使用xcscope.el package从Emacs使用Cscope。还有Cscope-based GUIs
  4. GNU GLOBAL(又名cscope.po.out)是另一个源代码标记系统(具有显着差异 - 请参阅下一节),因为它还会生成标记文件。
  5. <强>比较

    • Ctags和Etags仅处理定义(例如,变量和函数)。 Cscope和Gtags也对待参考文献。
    • Ctags和Etags标记文件为flat。 Cscope和Gtags标记文件功能更强大key-value databases,允许(例如)增量更新。
    • Cscope和Gtags有一个类似Gtags的搜索引擎。
    • Ctags内置了对更多语言和数据格式的支持:请参阅当前存储库list of Universal Ctags parsers。 UCtags也有documented how to develop your own parser
    • Cscope和Gtags是编辑独立的。
    • Gtags不提供自己的用户界面,但目前(2016年10月)可以使用命令行(CLI),Emacs和亲戚,Vi和亲戚,grep(寻呼机),Doxygen,和任何网络浏览器。
    • Gtags通过GLOBAL包提供less,但也有许多其他的elisp扩展,包括xgtags.el,ggtags.el,anything-gtags.el,helm-gtags.el。

    <强>组合

    你可以结合使用Universal Ctags&#39; Gtags&#39;提供丰富的语言支持。使用Ctags作为GLOBAL plug-in parser

    的数据库工具和众多扩展
    gtags.el

    再次注意,如果你使用Ctags作为你的Gtags的解析器,你将失去处理Gtags否则将提供的引用(例如,变量使用,函数调用)的能力。从本质上讲,你可以权衡Gtags&#39; Ctags&#39;的参考跟踪更强大的内置语言支持。

    您也可以将Cscope用作Gtags的客户端:gtags-cscope

    祝你好运!

答案 4 :(得分:3)

我实际上没有检查过,但根据CEDET手册(http://www.randomsample.de/cedetdocs/common/cedet/CScope.html):

语义可以使用CScope作为数据库搜索的后端。要启用它,请使用:

 (semanticdb-enable-cscope-databases)

这样可以将cscope用于所有C和C ++缓冲区。

当预先存在的语义数据库搜索可能没有解析所有文件时,CScope将用作项目范围的搜索作为备份。