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


102

我从事C ++项目,并遍历了Alex Ott的CEDET指南以及有关StackOverflow中标签的其他主题,但是我仍然对Emacs如何与这些不同的标签系统交互以促进自动完成,查找定义,导航源感到困惑代码库或文档字符串预览。

  1. 有什么区别(在功能方面如)之间 etagsebrowseexuberant ctagscscopeGNU GlobalGTags?我需要做些什么才能在Emacs中使用它们?

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

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


2
主干来看,GTags您链接到的项目已经死了。如果有人在谈论gtags,他们可能指的是GNU Global。
Gordon Gustafson 2014年

Answers:


71

正如我最近在这里阅读的那样,这是一个很好的问题,因此我将尝试更详细地说明不同之处:

第一点:

etagsctags这两个生成索引(又名标记/标签)语言的文件中的源文件,使这些项目是通过文本编辑器或其他工具快速而轻松地定位的物体找到。标签表示一个语言对象,为其提供索引条目(或者,为该对象创建的索引条目)。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-TAB或,C-M-i然后自动完成语义的监视。对于默认情况下未启用语义的语言,可以将其以下行添加到选择的主要模式钩子中:

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

点3。

语义带来了真正的代码意识(针对当前支持的几种语言),并缩小了IDE和Emacs之间的差距。它并没有真正与像工具接口etagscscope,但并不意味着你不能同时使用它们。

希望我的解释有意义,并且对您有用。

附注:我对global和不太熟悉ebrowse,但是如果我有记忆,他们会使用etags。


1
这很棒。谢谢!您知道如何cscope在Emacs中使用吗?我xcscope.el在EmacsWiki上阅读了有关此内容的信息,但找不到该文件的链接。另外,.el您使用cscopeEmacs 获取哪个文件?
阿梅利奥·瓦兹奎兹·雷纳

1
xcscope.el位于cscope/contrib/xcscope/(位于分发包中)。那就是我用的
Bozhidar Batsov

还有一个问题:与semantic相比如何cscope?在浏览源代码方面,语义是否提供任何不提供的功能cscope?你们都用吗?
Amelio Vazquez-Reina 2012年

4
我不相信GNU Global使用etags,顺便说一句。IIRC维护并查询“适当的”数据库(而不是扫描纯文本文件),这对查询和(尤其是)更新标签均具有许多性能优势。
phils 2012年

@BozhidarBatsov当你说For languages where semantic is not enabled by default, you can add the following line to your major mode hook of choice ... <code>。该代码段的确切作用是什么?
Amelio Vazquez-Reina

45

我将尝试在1中添加一些说明。

它是什么?

  • Etags是用于生成“ TAGS”文件的命令,该文件是Emacs的标签文件。您可以将文件与emacs软件包中的etags.el一起使用。
  • Ctags是用于生成“标签”文件的命令,该文件是vi的标签文件。现在,旺盛的Ctags可以通过-e选项生成'TAGS'文件,并支持41种编程语言。
  • Cscope是用于C语言的多合一源代码浏览工具。它具有自己的优良CUI(字符用户界面)和标记数据库(cscope.in.out,cscope.out,cscope.po.out)。您可以使用xscope.el(它是cscope软件包的一部分)从Emacs中使用cscope。
  • GNU GLOBAL是一个源代码标记系统。尽管它与上述工具相似,但区别在于它们依赖于任何编辑器,并且除了命令行外没有任何用户界面。Gtags是用于为GLOBAL(GTAGS,GRTAGS,GPATH)生成标签文件的命令。您可以使用GLOBAL软件包中的gtags.el从emacs中使用GLOBAL。除此之外,还有许多elisp库(xgtags.el,ggtags.el,everything-gtags.el,helm-gtags.el等)。

比较方式

  • Ctags和etags仅处理定义。Cscope和GNU GLOBAL不仅处理定义,而且还处理参考。
  • Ctag和etag使用纯文本标签文件。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种语言。

祝好运!


1
对于使用Debian和类似Ubuntu的衍生产品的用户:GNU GLOBAL网站警告说,这些Linux发行版本附带的.deb软件包已过时,不应使用。在我的情况下,GLOBAL是在5.7.1版上,我无法使gtags.el,ggtags.el或helm-gtags.el在Emacs 24上正常工作。从头开始编译GNU GLOBAL 6.5,支持Exuberant Ctags(我用5.8)做过款待。(感谢出色的指针@shigio)。
罗布(Rob)

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

这使Emacs可以查找定义。基本导航是内置的find-tag,但是etags-select在有多个匹配项时提供了更好的UI。

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

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

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全球都有自己的数据库格式,它由一个的GTAGSGRTAGSGPATH文件。您可以使用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图。


7

[答案由shigio更新]

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

它是什么?

  1. Etags生成一个TAGS文件,该文件是Emacs标记文件格式。您可以使用Etags文件,etags.el它是Emacs的一部分。
  2. Ctags是任何可以生成tags文件的东西的通用术语,这是Vi的本机标记文件格式。Universal Ctags(又名UCtagsExuberant Ctags)也可以使用该-e选项生成Etags 。
  3. cscope的是所有功能于一身的源代码的浏览工具,C(与C ++和Java较小的支持),具有自己的标签数据库(cscope.in.outcscope.outcscope.po.out)和TUI。Cscope支持内置在Vim中。您可以使用xcscope.el软件包从Emacs使用Cscope 。也有基于Cscope的GUI
  4. GNU GLOBAL(又名GNU GLOBALGtags)是另一个源代码标记系统(有很大的不同,请参阅下一节),因为它还生成标记文件。

比较方式

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

祝好运!


我读到:“再次注意,如果您使用Ctags作为Gtags的解析器,则会失去处理Gtags否则会提供的引用(例如,变量用法,函数调用)的能力。从本质上讲,您需要权衡Gtags的引用跟踪以获取Ctags提供了更多的内置语言支持。” 对于Emacs附带的旧ctags,这是否正确?对于Universal Ctags,它仍然正确吗?另外,我阅读了“组合通用Ctag的丰富语言”,但是在--with-exuberant-ctags=...截至2019年的现在的shell片段中,有一个--with-universal-ctags选项。应该将其更改为后者吗?
bgoodr

3

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

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

 (semanticdb-enable-cscope-databases)

这将允许对所有C和C ++缓冲区使用cscope。

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


1
在Emacs 24.3.1中,使用附带的香草CEDET 2.0似乎不起作用(没有语义db-enable-cscope-databases方法)。
罗布2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.