为Emacs标签的ETag之间GNU全球和旺盛的ctags关系,ebrowse,cscope的,(T

2019-08-01 13:30发布

我对C ++项目工作,我通过亚历克斯·奥特的去指导CEDET和关于StackOverflow的标签其他线程,但我仍然感到困惑与这些不同的标签系统的Emacs接口,如何方便自动完成,在仰视的定义,源导航代码库或DOC-串的预览。

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

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

  3. 什么是语义带来的表上的这些不同的标签公用事业顶部? 它是如何使用这些工具界面吗?

Answer 1:

这是一个很好的问题,因为我最近读到这里,所以我会尽力解释更详细的区别:

1点:

etagsctags都生成索引源文件,使这些项目是通过文本编辑器或其他实用程序快速,轻松地找到位于语言对象(又名标记/标签)的文件。 的标签表示的语言对象对于其索引条目是可用的(或者,可替代地,该对象创建的索引条目)。 通过CTAGS生成的标签是元数据方面更加丰富,但Emacs可以不反正解释了额外的数据,所以你应该考虑他们或多或少相同(主要利用ctags将其更多的语言支持)。 为标签文件的主要用途是查找类/方法/功能/常在/ etc声明/定义。

cscope是更强大的野兽(至少就为C / C ++和Java而言)。 虽然它或多或少相同的原理工作(产生有用的元数据的文件),它可以让你像找到一个符号的所有引用一些发烧友的东西,看到的是被调用的函数,其中,等(你可以找到定义为好) 。

把它们加起来:

ctags一个允许您导航到符号声明/定义(有些东西会叫单向查找 )。 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 ,但如果我没有记错,他们利用的ETag的。



Answer 2:

我会尝试一些解释增加1。

它是什么?

  • ETag的是产生“标签”文件,该文件是为Emacs标记文件的命令。 您可以使用etags.el的文件,该文件是emacs的软件包的一部分。
  • C标签是产生“标签”文件,该文件是为VI的标记文件的命令。 现在旺盛C标签可以生成由-e选项“标签”的文件,并支持41种编程语言。
  • Cscope的是C语言的所有功能于一身的源代码浏览工具。 它有自己的优秀CUI(字符用户界面)和标签数据库(cscope.in.out,cscope.out中,cscope.po.out)。 您可以使用xcscope.el这是cscope的软件包的一部分使用cscope从Emacs的。
  • GNU GLOBAL是源代码的标记系统。 虽然这是类似于上述工具,它从它们的不同之处的,它取决于从任何编辑器的点,它具有除了命令行用户界面。 Gtags是产生GLOBAL(GTAGS,GRTAGS,GPATH)标记文件的命令。 您可以使用gtags.el这是全球计划的一部分emacs的使用全局。 除此之外,也有它的许多elisp的图书馆(xgtags.el,ggtags.el,什么-gtags.el,掌舵,gtags.el等)。

对照

  • C标签和ETag的治疗只能定义。 Cscope的和GNU GLOBAL治疗不仅定义,但还引用。
  • C标签和使用的ETag扁平文本标记文件。 Cscope的和GNU全球使用键值广告代码数据库。
  • Cscope的和GNU全球有像搜索引擎和标记文件增量更新设施grep指令。

组合

您可以结合旺盛Ctags的丰富的语言支持,并通过CTAGS作为全球的一个插件解析器GNU全球的数据库设施。

尝试以下内容:(需要GLOBAL-6.0,旺盛C标签-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包包括一个名为“gtags-cscope的”命令,它是cscope的的端口,也就是说,它是cscope的本身,除了它使用全局作为一个搜索引擎,而不是cscope的公司之一。

$ gtags-cscope          # this is GLOBAL version of cscope

通过组合,可以使用cscope为41种语言。

祝好运!



Answer 3:

标签文件包含定义

一个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。

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

标签文件可以通过不同的工具来构建

ctags (以前称为“普遍的ctags”或“旺盛的ctags”)可以生成代码文件和支持的语言的最宽范围。 这是积极维护在GitHub上。

Emacs带有两个程序生成标签文件,叫做etagsctags 。 Emacs的ctags只是etags使用相同的CLI界面,通用CTAGS。 为了避免混淆,许多发行版重命名这些程序(例如ctags.emacs24在Debian)。

也有语言的特定工具生成代码文件,如jsctagshasktags

其他文件格式

ebrowse是随Emacs的C程序。 它索引C / C ++代码,并生成BROWSE文件。 ebrowse.el提供了常用的查找定义和完成。 您也可以打开BROWSE直接在Emacs文件,以获取定义的代码库中的类/功能的概述。

GNU全球都有自己的数据库格式,它由一个的GTAGSGRTAGSGPATH文件。 可以生成与这些文件gtags命令,该命令分析C / C ++代码。 对于其他语言,GNU全球可读取由通用的ctags生成的文件。

GNU Global还提供了一个CLI界面的要求更复杂的问题,比如“这哪里是象征提及?”。 它附带一个Emacs包gtags.el,但ggtags.el也颇受访问GNU全球数据库。

Cscope的是在精神上GNU全球类似:它解析C / C ++到它自己的数据库格式。 它也可以回答诸如“这个函式的找到所有调用者/被调用者的提问。

又见比较全球和cscope的这个HN讨论 。

客户机/服务器项目

rtags解析和索引C / C ++使用持久服务器。 它使用铛解析器,所以它处理C ++真的很好。 它附带一个Emacs包查询服务器。

谷歌-gtags是在一个大的标签文件将被存储在服务器上的一个项目。 当您查询的服务器,它会提供为您的搜索有关的标签文件的一个子集。

语义(收益率)

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



Answer 4:

[答案从更新shigio的]

我会尝试一些说明添加到问题的第1部分。

它是什么?

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

对照

  • C标签和ETag时只治疗(,例如,变量和函数)的定义。 Cscope的和Gtags也可治疗引用。
  • C标签和ETag时标记文件是平坦的 。 cscope的和Gtags标签文件是更强大的键-值数据库 ,这允许(例如)增量更新。
  • Cscope的和Gtags拥有grep样的搜索引擎。
  • C标签内置了更多的语言和数据格式支持:查看当前功能于仓库通用C标签解析器的列表 。 UCtags还记录了如何开发自己的解析器 。
  • Cscope的和Gtags是编辑独立。
  • Gtags不提供自己的用户界面,但目前可以(OCT 2016)由命令行(CLI)中使用,Emacs和亲戚,Vi和亲戚, less (寻呼机), Doxygen的 ,任何Web浏览器。
  • Gtags提供gtags.el通过全局包,但也有很多其他的elisp扩展,包括xgtags.el,ggtags.el,什么-gtags.el,掌舵,gtags.el。

组合

您可以使用C标签作为合并通用C标签数据库设施以及众多的扩展与Gtags丰富的语言支持GLOBAL插件解析器 :

# 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

再请注意,如果您使用C标签的解析器为您Gtags,你失去了治疗引用(例如,变量的使用,函数调用),这Gtags否则会带来的能力。 从本质上讲,你权衡Gtags'引用跟踪为C标签更大的内置语言支持。

您也可以使用cscope作为Gtags的客户: gtags-cscope

祝好运!



Answer 5:

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

语义可以使用cscope作为数据库检索后端。 要启用它,使用:

 (semanticdb-enable-cscope-databases)

这将使所有的C和C ++缓冲区使用cscope的。

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



文章来源: Tags for Emacs: Relationship between etags, ebrowse, cscope, GNU Global and exuberant ctags