我在C ++项目上工作,我在AlexOtt的guide to CEDET和其他关于StackOverflow中标签的线程中进行了讨论,但我仍然对Emacs如何与这些不同的标签系统进行交互以促进自动完成感到困惑,定义,源代码库的导航或doc-strings的预览。
etags
,ebrowse
,exuberant ctags
,cscope
,GNU Global
和{{}之间的区别(例如在功能方面) 3}}?在 Emacs 中使用它们需要做什么?
如果我想使用标签导航/自动完成符号,是否需要语义/参议员(CEDET)?
语义在这些不同的标记实用程序之上带来了什么?它如何与这些工具连接?
答案 0 :(得分:64)
这是我最近在这里阅读的一个很好的问题,所以我会尝试更详细地解释这些差异:
第1点:
etags
和ctags
都生成源文件中找到的语言对象的索引(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之间的差距。它并不真正与etags
和cscope
等工具相关联,但并不意味着您不能将它们一起使用。
希望我的解释有意义,对你有用。
P.S。我对global
和ebrowse
并不熟悉,但如果记忆为我服务,他们就会使用etags。
答案 1 :(得分:40)
我会尝试在1中添加一些解释。
这是什么?
<强>比较强>
<强>组合强>
您可以使用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
文件包含定义函数和类的位置的列表。它通常放在项目的根目录中,如下所示:
^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。
ctags
(以前称为'universal ctags'或'exuberant ctags')可以生成TAGS文件并支持最广泛的语言。它在github上得到了积极的维护。
Emacs附带两个生成TAGS文件的程序,名为etags
和ctags
。 Emacs'ctags
只是etags
,具有与通用ctags相同的CLI界面。为避免混淆,许多发行版重命名这些程序(例如Debian上的ctags.emacs24
)。
还有用于生成TAGS文件的语言专用工具,例如jsctags
和hasktags
。
ebrowse
是Emacs附带的C程序。它索引C / C ++代码并生成BROWSE
文件。 ebrowse.el提供了通常的查找定义和完成。您也可以直接在Emacs中打开BROWSE
文件,以获得定义代码库的类/函数的概述。
GNU Global有自己的数据库格式,包含GTAGS
,GRTAGS
和GPATH
文件。您可以使用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文件的子集。
Semantic是一个内置的Emacs包,包含一个C / C ++解析器,因此它也可以找到定义。它还可以从TAGS文件,csope数据库和其他来源导入数据。 CEDET还包括使用此数据的IDE样式功能,例如,生成类层次结构的UML图。
答案 3 :(得分:5)
[答案更新自shigio&#39;
我会尝试在问题的第1部分添加一些解释。
这是什么?
TAGS
文件,即tag file format for Emacs。您可以将Etags文件与etags.el
一起使用,该文件是Emacs的一部分。Ctags
是可以生成tags
文件的任何通用术语,该文件是Vi的本机标记文件格式。 Universal Ctags(又名UCtags
,以前是Exuberant Ctags)也可以使用-e
选项生成Etags。cscope.in.out
,cscope.out
,{ {1}})和TUI。 Cscope支持内置于Vim;您可以使用xcscope.el package从Emacs使用Cscope。还有Cscope-based GUIs。cscope.po.out
)是另一个源代码标记系统(具有显着差异 - 请参阅下一节),因为它还会生成标记文件。<强>比较强>
Gtags
的搜索引擎。grep
(寻呼机),Doxygen,和任何网络浏览器。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将用作项目范围的搜索作为备份。