etags

作者:Dave Thomas

您可能已经使用过超文本链接浏览 Web,通过简单的按键或鼠标点击轻松地在页面之间跳转。使用 etags,您可以同样轻松地浏览您的源代码程序和文档。在本文中,我将介绍标签文件以及生成它们的 etags 和 ctags 命令。我还将探讨 lessEmacsvi 如何使用标签文件来使您的编辑工作更轻松、更高效。

etags 和 Emacs

默认情况下,etags 接受一组源文件,并生成所有感兴趣的 全局 符号的定义索引。对于 C 和 C++ 程序,此索引包括全局函数和成员函数、类、结构体、枚举、typedef 和 #define。对于 (La)TeX 文档,它索引章节、节、小节、图、公式等。etags 还包括对汇编器、Fortran、lex、Lisp、Pascal、Sheme 和 yac 的内置支持。etags --help 将提供您的版本支持的完整语言列表。

尝试在您的一个源目录中运行 etags *.c *.h。处理完成后,您会发现它生成了一个名为 TAGS 的文件。这是一个简单的文本文件,每个解析的文件都有一个条目块。每个块包含文件中每个定义的一行,其中包含定义的文本以及找到它的行号和绝对字符位置。

您如何使用它?最简单的方法是从 Emacs 中使用。您像往常一样在源目录中开始编辑。当您遇到对您的某个函数的调用,并想查看它的定义时,将光标放在调用上,然后输入 Emacs 命令 M-. (按 esc 键,然后按句点,或者同时按住 alt 和句点)。Emacs 将在迷你缓冲区中显示函数名称。如果您按 return 确认,Emacs 将自动打开包含定义的文件,并将光标定位在其开头。假设在查看该函数时,您对使用 typedef 名称的声明感到困惑。将光标移到它上面,再次按 M-H.,typedef 就会弹出。如果您找不到您创建的 #define,请使用 M-.,然后在迷你缓冲区中键入宏名称。Emacs 会在标签表中查找它,并直接带您到那里。

有时您会有多个包含相同文本的标签,而 M-. 会将您带到错误的位置。只需一直按 C-u M-.,Emacs 就会遍历所有可能的标签匹配项。如果您像我一样手指不灵活,您可能会发现 M-0 M-. 是一种更简单的方式来为 find-tag 命令输入前缀。输入负前缀(C-u -M.)会将您带回到之前的定义。

这还不是您可以使用 TAGS 文件做的全部。想象一下,当您输入一些源代码时,您决定给您的函数起长而描述性的名称。当时这似乎是个好主意,但现在当您第 n 次键入对该函数的调用时,这种光环正在消退。同样,标签可以提供帮助。键入名称的前几个字符,然后按 M-tab。要么会出现完整的函数名称,要么会弹出一个窗口,显示可能的补全列表。(这可能不适用于 XEmacs 用户,您可能需要将 M-tab 重新绑定到 tag-complete-symbol。)

您还可以在迷你缓冲区中使用标签补全,只要命令提示输入标签 — 输入前几个字符,按 tab,Emacs 就会完成其余操作。

如果您是 XEmacs 用户,M-?i 命令会在模式行中显示函数或 typedef 的单行摘要 — 如果您忘记了调用顺序,这将非常有用!

标签也是在所有源文件中执行搜索和替换操作的好方法。tags-search 命令会提示您输入正则表达式,然后在您的 TAGS 表中的任何文件中显示第一个匹配项。您可以使用 M-, (即 meta-comma)移动到后续匹配项。tags-query-replace 在 TAGS 表中的所有文件上执行 egex-replace。您可以随时停止它(使用 escapeC-g),稍后可以使用 M-, 恢复它。

最后,tags-apropos 在一个单独的窗口中列出与您输入的正则表达式匹配的所有标签 — 这是快速扫描内容的好方法。

ctags、vi 和 less

与 etags 与 Emacs 的工作方式相同,ctags 程序生成可与 vi、view 和 less 一起使用的标签文件。命令的基本操作是相同的,但它生成一个名为 tags (小写)的文件。完成后,您可以使用 vi -tnameless -tname 直接从命令行转到 vi 或 less 中的特定函数。您甚至不必提供文件名!

如果您正在使用 vi 进行编辑,则可以使用 :tag 命令移动到标签。

保持更新

令人惊讶的是,即使您在它们引用的文件中插入和删除行,TAGStags 索引文件仍然有效。您只需要在添加或删除函数或文件时运行 etags/ctags。我发现在我的 Makefiles 中有一个 tags: 目标来执行此操作很方便

tags:
       etags $(SRC)

如果您的文件位于许多目录中,您可以通过在命令行上指定目录名称来生成一个涵盖所有文件的 tags 文件。这在 vi 和 Emacs 中效果很好,但如果您是 XEmacs 用户,则需要设置 tags-file-name 变量或 tag-table-alist。我个人觉得这很笨拙,并且倾向于每个目录坚持使用一个 TAGS 文件。

更多信息

man etagsman ctags 是显而易见的起点。您还可以在 Emacs 信息页面中找到很好的信息,并使用 Emacs ?H-a 命令。

ctags 和 etags 都包含在 Emacs 和 XEmacs 发行版中。您还可以从 Internet 获取各种其他标签程序 — archie -c ctags 将找到您附近的站点。

Dave Thomas (davet@gte.net) 是一位独立顾问,专门从事复杂的 Unix、OS/2 和 Windows 开发。他对 Linux 和 XFree 的所有工作表示永远的感谢 — 它让他可以在达拉斯的家中为佛罗里达州、新罕布什尔州、亚特兰大、多伦多...的客户系统工作。电话公司也很高兴。

加载 Disqus 评论