emacs - Emacs : Relationship between etags, ebrowse、cscope、GNU Global 和 exuberant ctags 的标签

标签 emacs cscope cedet gnu-global

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

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

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

  3. 除了这些不同的标签实用程序之外,语义还带来了什么?它如何与这些工具交互?

最佳答案

这是一个很好的问题,因为我最近在这里读到过,所以我将尝试更详细地解释其中的差异:

第 1 点:

etagsctags 都生成源文件中找到的语言对象的索引(也称为标签/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-TABC-M-i 并观察语义自动为您完成。对于默认情况下未启用语义的语言,您可以将以下行添加到您选择的主要模式 Hook 中:

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

第 3 点。

语义带来了真正的代码感知(对于它当前支持的少数语言)并缩小了 IDE 和 Emacs 之间的差距。它并没有真正与 etagscscope 等工具交互,但这并不意味着您不能将它们一起使用。

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

附注我不太熟悉 globalebrowse,但如果我没记错的话,他们使用了 etag。

关于emacs - Emacs : Relationship between etags, ebrowse、cscope、GNU Global 和 exuberant ctags 的标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12922526/

相关文章:

Emacs CEDET 语义标签折叠

emacs - 如何在 Emacs 中设置截断行的宽度

emacs - Emacs 是否有允许插入一些文本的只读或查看模式?

ctags错误 "format error in tags file"

c++ - ctags 最佳实践

linux - 打印 Cscope 符号链接(symbolic link)的绝对路径

c++ - Emacs CEDET Semantic 没有自动完成 `this` 关键字。 (C++)

android - Java代码缩进错误

emacs - 使用Emacs从像 `#f2d3aa`这样的颜色字符串中弹出颜色