TAGS 文件包含定义
文件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。
您还可以使用 TAGS 文件来完成代码。例如,公司的 etags 后端使用 TAGS 文件。
TAGS文件可以通过不同的工具构建
ctags
(以前称为 'universal ctags' 或 'exuberant ctags')可以生成 TAGS 文件并支持最广泛的语言。它在 github 上积极维护。
Emacs 附带了两个生成 TAGS 文件的程序,分别称为etags
和ctags
. Emacsctags
与etags
通用 ctags 具有相同的 CLI 界面。为避免混淆,许多发行版重命名这些程序(例如ctags.emacs24
在 Debian 上)。
还有用于生成 TAGS 文件的特定语言工具,例如jsctags
和hasktags
.
其他文件格式
ebrowse
是 Emacs 附带的 C 程序。它索引 C/C++ 代码并生成BROWSE
文件。ebrowse.el 提供通常的查找定义和补全。您也可以BROWSE
直接在 Emacs 中打开该文件,以获取定义代码库的类/函数的概览。
GNU Global有自己的数据库格式,由GTAGS
,GRTAGS
和GPATH
文件组成。gtags
您可以使用解析 C/C++ 代码的命令生成这些文件。对于其他语言,GNU Global 可以读取由通用 ctags 生成的文件。
GNU Global 还提供了一个 CLI 界面来询问更复杂的问题,例如“这个符号在哪里提到?”。它附带一个 Emacs 包 gtags.el,但ggtags.el也很流行用于访问 GNU 全球数据库。
Cscope在精神上类似于 GNU Global:它将 C/C++ 解析为自己的数据库格式。它还可以回答诸如“查找此功能的所有调用者/被调用者”之类的问题。
另请参阅比较 global 和 cscope 的此 HN 讨论。
客户端/服务器项目
rtags使用持久服务器解析和索引 C/C++。它使用 clang 解析器,因此它可以很好地处理 C++。它附带一个 Emacs 包来查询服务器。
google-gtags是一个将大型 TAGS 文件存储在服务器上的项目。当您查询服务器时,它会提供与您的搜索相关的 TAGS 文件子集。
语义(CEDET)
Semantic 是一个内置的 Emacs 包,其中包含 C/C++ 解析器,因此它也可以找到定义。它还可以从 TAGS 文件、csope 数据库和其他来源导入数据。CEDET 还包括使用此数据的 IDE 样式功能,例如生成类层次结构的 UML 图。