我对C ++项目工作,我通过亚历克斯·奥特的去指导CEDET和关于StackOverflow的标签其他线程,但我仍然感到困惑与这些不同的标签系统的Emacs接口,如何方便自动完成,在仰视的定义,源导航代码库或DOC-串的预览。
有什么区别(在功能方面如)之间etags
, ebrowse
, exuberant ctags
, cscope
, GNU Global
和GTags
? 我需要什么做在Emacs使用它们?
我是否需要语义/参议员(CEDET)如果我想使用标签浏览/自动完成的符号?
什么是语义带来的表上的这些不同的标签公用事业顶部? 它是如何使用这些工具界面吗?
这是一个很好的问题,因为我最近读到这里,所以我会尽力解释更详细的区别:
1点:
etags
和ctags
都生成索引源文件,使这些项目是通过文本编辑器或其他实用程序快速,轻松地找到位于语言对象(又名标记/标签)的文件。 的标签表示的语言对象对于其索引条目是可用的(或者,可替代地,该对象创建的索引条目)。 通过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-TAB或CMI,看着语义自动的为你完成。 对于那些语义是不是默认启用的语言,你可以在下面一行将它添加到您选择的主要方式挂钩:
(add-to-list 'completion-at-point-functions 'semantic-completion-at-point-function)
第3点。
语义带来真正的代码意识(它目前支持的几种语言),并关闭IDE和Emacs的差距。 它并没有真正与像工具接口etags
和cscope
,但并不意味着你不能同时使用它们。
希望我的解释是否合理,将是对你有用。
PS我不是很熟悉global
和ebrowse
,但如果我没有记错,他们利用的ETag的。
我会尝试一些解释增加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种语言。
祝好运!
标签文件包含定义
一个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带有两个程序生成标签文件,叫做etags
和ctags
。 Emacs的ctags
只是etags
使用相同的CLI界面,通用CTAGS。 为了避免混淆,许多发行版重命名这些程序(例如ctags.emacs24
在Debian)。
也有语言的特定工具生成代码文件,如jsctags
和hasktags
。
其他文件格式
ebrowse
是随Emacs的C程序。 它索引C / C ++代码,并生成BROWSE
文件。 ebrowse.el提供了常用的查找定义和完成。 您也可以打开BROWSE
直接在Emacs文件,以获取定义的代码库中的类/功能的概述。
GNU全球都有自己的数据库格式,它由一个的GTAGS
, GRTAGS
和GPATH
文件。 可以生成与这些文件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图。
[答案从更新shigio的]
我会尝试一些说明添加到问题的第1部分。
它是什么?
- ETag的生成
TAGS
文件,该文件是为Emacs标记文件格式 。 你可以用与ETag时文件etags.el
这是Emacs的一部分。 -
Ctags
是任何可以产生一个通用术语tags
的文件,这是六本机的标签文件格式。 通用C标签 (又名UCtags
,以前旺盛Ctags的),也可以使用生成ETag时-e
选项。 - cscope的是所有功能于一身的源代码的浏览工具,C(与C ++和Java较小的支持),具有自己的标签的数据库(
cscope.in.out
, cscope.out
, cscope.po.out
)和TUI 。 Cscope的支持是内置的Vim的; 您可以使用使用cscope从Emacs的xcscope.el包 。 也有基于Cscope的的GUI 。 - 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
。
祝好运!
我还没有实际检查,但根据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