Ame*_*ina 99 emacs cscope cedet gnu-global
我从事C++项目,我在StackOverflow中浏览了Alex Ott的CEDET指南和其他关于标签的线程,但我仍然对Emacs如何与这些不同的标签系统进行交互以促进自动完成,查找定义,源代码导航感到困惑.代码库或doc-strings的预览.
有什么区别(在功能方面如)之间 etags,ebrowse,exuberant ctags,cscope,GNU Global和GTags?在Emacs中使用它们需要做什么?
如果我想使用标签导航/自动完成符号,我是否需要语义/参议员(CEDET)?
语义在这些不同的标记实用程序之上带来了什么?它如何与这些工具接口?
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-TAB或C-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我不是很熟悉,global和ebrowse,但如果我没有记错,他们利用的ETag的.
小智 42
我会尝试在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
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种语言.
祝好运!
一个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文件.
ctags(以前称为'通用ctags'或'exuberant ctags')可以生成TAGS文件并支持最广泛的语言.它在github上积极维护.
Emacs附带两个生成TAGS文件的程序,名为etags和ctags.Emacs的ctags仅仅是etags用相同的CLI界面,通用CTAGS.为避免混淆,许多发行版重命名这些程序(例如ctags.emacs24在Debian上).
还有用于生成TAGS文件的语言特定工具,例如jsctags和hasktags.
ebrowse是Emacs附带的C程序.它索引C/C++代码并生成一个BROWSE文件.ebrowse.el提供了通常的查找定义和完成.您还可以BROWSE直接在Emacs中打开文件,以获得定义代码库的类/函数的概述.
GNU全球都有自己的数据库格式,它由一个的GTAGS,GRTAGS和GPATH文件.您可以使用gtags解析C/C++代码的命令生成这些文件.对于其他语言,GNU Global可以读取通用ctags生成的文件.
GNU Global还提供了一个CLI界面,用于询问更复杂的问题,例如"这个符号在哪里提到?".它附带了一个Emacs包gtags.el,但ggtags.el也很受欢迎,可以访问GNU Global数据库.
Cscope在精神上与GNU Global类似:它将C/C++解析为自己的数据库格式.它还可以回答诸如"查找此功能的所有呼叫者/被叫者"之类的问题.
rtags使用持久服务器解析和索引C/C++.它使用clang解析器,因此它可以很好地处理C++.它附带一个Emacs包来查询服务器.
google-gtags是一个大型TAGS文件存储在服务器上的项目.查询服务器时,它将提供与您的搜索相关的TAGS文件的子集.
Semantic是一个内置的Emacs包,包含一个C/C++解析器,因此它也可以找到定义.它还可以从TAGS文件,csope数据库和其他来源导入数据.CEDET还包括使用此数据的IDE样式功能,例如生成类层次结构的UML图.
[来自shigio的更新答案]
我将尝试在问题的第1部分添加一些解释.
它是什么?
TAGS文件,它是Emacs的标记文件格式.您可以使用Etags文件,etags.el该文件是Emacs的一部分.Ctags是任何可以生成tags文件的通用术语,它是Vi的本机标记文件格式.Universal Ctags(又名UCtags,以前的Exuberant Ctags)也可以选择生成Etags -e.cscope.in.out,cscope.out,cscope.po.out)和TUI.Cscope支持内置于Vim; 您可以使用xcscope.el包从Emacs使用Cscope .还有基于Cscope的GUI.Gtags)是另一个源代码标记系统(具有显着差异 - 参见下一节),因为它还生成标记文件.对照
grep的搜索引擎.less(寻呼机),Doxygen和任何Web浏览器.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.
祝好运!
| 归档时间: |
|
| 查看次数: |
22143 次 |
| 最近记录: |