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

Ame*_*ina 99 emacs cscope cedet gnu-global

我从事C++项目,我在StackOverflow中浏览了Alex Ott的CEDET指南和其他关于标签的线程,但我仍然对Emacs如何与这些不同的标签系统进行交互以促进自动完成,查找定义,源代码导航感到困惑.代码库或doc-strings的预览.

  1. 有什么区别(在功能方面如)之间 etags,ebrowse,exuberant ctags,cscope,GNU GlobalGTags?在Emacs中使用它们需要做什么?

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

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

Boz*_*sov 70

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

第1点:

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

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

把它们加起来:

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

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

  • 转到符号声明
  • 显示符号的所有引用的可选列表
  • 搜索任何全局定义
  • 函数调用的函数
  • 调用函数的函数
  • 搜索文本字符串
  • 搜索正则表达式模式
  • 找到一个文件
  • 查找包括文件在内的所有文件

在这一点上,任何人都应该不会感到惊讶,当我处理C/C++项目时,我会大量使用cscope和关注ctags.在处理其他语言时,情况显然会逆转.

第2点.

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

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

(add-to-list 'completion-at-point-functions 'semantic-completion-at-point-function)
Run Code Online (Sandbox Code Playgroud)

第3点.

语义带来了真正的代码感知(对于它目前支持的少数几种语言)并缩小了IDE和Emacs之间的差距.它并不真正与像etags和的工具接口cscope,但并不意味着你不能一起使用它们.

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

PS我不是很熟悉,globalebrowse,但如果我没有记错,他们利用的ETag的.

  • 我不相信GNU Global使用etags,顺便说一句.IIRC维护并查询"正确的"数据库(而不是扫描平面文本文件),这对于查询和(尤其)更新标签具有许多性能优势. (4认同)

小智 42

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

它是什么?

  • Etags是生成'TAGS'文件的命令,该文件是Emacs的标记文件.您可以将该文件与etags.el一起使用,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
Run Code Online (Sandbox Code Playgroud)

用法:

$ export GTAGSCONF=/usr/local/share/gtags/gtags.conf
$ export GTAGSLABEL=ctags
$ gtags                     # invokes Exuberant Ctags internally
$ emacs -f gtags-mode       # load gtags.el
Run Code Online (Sandbox Code Playgroud)

(但是,您不能通过此方法处理引用,因为ctags不会处理引用.)

您也可以使用cscope作为GNU GLOBAL的客户端.GLOBAL包中包含一个名为'gtags-cscope'的命令,它是cscope的一个端口,也就是说它是cscope本身,除了它使用GLOBAL作为搜索引擎而不是cscope的一个.

$ gtags-cscope          # this is GLOBAL version of cscope
Run Code Online (Sandbox Code Playgroud)

通过这些组合,您可以将cscope用于41种语言.

祝好运!


Wil*_*hes 9

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
Run Code Online (Sandbox Code Playgroud)

这使Emacs能够找到定义.基本导航内置有find-tag,但etags-select在有多个匹配时提供更好的UI.

您还可以使用TAGS文件来完成代码.例如,公司的etags后端使用TAGS文件.

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

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

Emacs附带两个生成TAGS文件的程序,名为etagsctags.Emacs的ctags仅仅是etags用相同的CLI界面,通用CTAGS.为避免混淆,许多发行版重命名这些程序(例如ctags.emacs24在Debian上).

还有用于生成TAGS文件的语言特定工具,例如jsctagshasktags.

其他文件格式

ebrowse是Emacs附带的C程序.它索引C/C++代码并生成一个BROWSE文件.ebrowse.el提供了通常的查找定义和完成.您还可以BROWSE直接在Emacs中打开文件,以获得定义代码库的类/函数的概述.

GNU全球都有自己的数据库格式,它由一个的GTAGS,GRTAGSGPATH文件.您可以使用gtags解析C/C++代码的命令生成这些文件.对于其他语言,GNU Global可以读取通用ctags生成的文件.

GNU Global还提供了一个CLI界面,用于询问更复杂的问题,例如"这个符号在哪里提到?".它附带了一个Emacs包gtags.el,但ggtags.el也很受欢迎,可以访问GNU Global数据库.

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图.


Tom*_*che 6

[来自shigio的更新答案]

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

它是什么?

  1. Etags生成一个TAGS文件,它是Emacs标记文件格式.您可以使用Etags文件,etags.el该文件是Emacs的一部分.
  2. Ctags是任何可以生成tags文件的通用术语,它是Vi的本机标记文件格式.Universal Ctags(又名UCtags,以前的Exuberant Ctags)也可以选择生成Etags -e.
  3. cscope的是所有功能于一身的源代码的浏览工具,C(与C++和Java较小的支持),具有自己的标签数据库(cscope.in.out,cscope.out,cscope.po.out)和TUI.Cscope支持内置于Vim; 您可以使用xcscope.el包从Emacs使用Cscope .还有基于Cscope的GUI.
  4. GNU GLOBAL(aka Gtags)是另一个源代码标记系统(具有显着差异 - 参见下一节),因为它还生成标记文件.

对照

  • Ctags和Etags仅处理定义(例如,变量和函数).Cscope和Gtags也对待参考文献.
  • Ctags和Etags标记文件是平的.Cscope和Gtags标签文件是功能更强大的键值数据库,它允许(例如)增量更新.
  • Cscope和Gtags有类似grep的搜索引擎.
  • Ctags内置了对更多语言和数据格式的支持:请参阅Universal Ctags解析器的当前存储库列表.UCtags还记录了如何开发自己的解析器.
  • Cscope和Gtags是编辑独立的.
  • Gtags不提供自己的用户界面,但目前(2016年10月)可以使用命令行(CLI),Emacs和亲戚,Vi和亲戚,less(寻呼机),Doxygen和任何Web浏览器.
  • Gtags gtags.el通过GLOBAL包提供,但也有许多其他的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
Run Code Online (Sandbox Code Playgroud)

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

你也可以使用Cscope作为Gtags的客户端:gtags-cscope.

祝好运!