标签 (Tag) 是一种占位符。标签在理解和编辑 C 代码时非常有用。标签是一组指向 C 文件中每个函数的书签。标签在从函数调用处跳转到函数定义,然后再跳回时非常有用。
看下面的例子。
假设您正在编辑函数 foo(),并且遇到了函数 bar()。现在,为了了解 bar() 的作用,可以使用标签 (Tags)。您可以跳转到 bar() 的定义,然后再跳回来。如果需要,您可以跳转到 bar() 中调用的另一个函数,然后再跳回来。
要使用标签 (Tags),首先必须在所有源文件上运行程序 ctags。这将创建一个名为 tags 的文件。此文件包含指向所有函数定义的指针,VIM 使用它来将您带到函数定义。
用于来回跳转的实际按键是 CTRL-] 和 CTRL-T。在 foo() 中调用 bar() 的位置按下 CTRL-],光标将跳转到 bar() 的开头。只需按下 CTRL-T,就可以从 bar() 跳回到 foo()。
ctags 可以通过以下方式调用
$ ctags options file(s) |
要从当前目录中所有 *.c 文件创建 tags 文件,只需输入
$ ctags *.c |
如果源代码树在不同的子目录中包含 C 文件,则可以在源代码树的根目录中使用 -R 选项调用 ctags,这将创建一个包含指向源代码树中所有函数的标签 (Tags) 的 tags 文件。例如。
$ ctags -R *.c |
ctags 还有许多其他选项可以使用。这些选项在 ctags 的 man 手册中进行了解释。
标记 (Marks) 就像标签 (Tags) 一样是占位符。但是,标记 (marks) 可以设置在文件中的任何位置,而不仅限于函数、枚举等。此外,标记 (marks) 必须由用户手动设置。
设置标记 (mark) 后,没有明显的指示。标记 (mark) 只是 VIM 记住的文件中的一个位置。考虑以下代码
假设您正在编辑 x++; 这一行,并且在编辑其他行后想要返回到该行。您可以使用按键 m' 在该行设置一个标记 (mark),稍后通过按 '' 返回到同一行。
VIM 允许您设置多个标记 (marks)。这些标记 (marks) 存储在寄存器 a-z、A-Z 和 1-0 中。要设置一个标记 (mark) 并将其存储在寄存器(例如 j)中,只需按 mj。要返回到标记 (mark),必须按 'j。
多个标记 (marks) 在代码段中来回跳转时非常有用。以相同的示例为例,您可能希望在 x++; 处设置一个标记 (mark),在 y=x; 处设置另一个标记 (mark),并在它们之间跳转,或者跳转到任何其他位置,然后再跳回来。
标记 (Marks) 可以跨文件。要使用此类标记 (marks),必须使用大写寄存器,即 A-Z。小写寄存器仅在文件内使用,不跨文件。也就是说,如果您在文件 foo.c 中的寄存器 "a" 中设置一个标记 (mark),然后移动到另一个文件并按 'a,光标将不会跳回到先前的位置。如果您想要一个可以将您带到不同文件的标记 (mark),则需要使用大写寄存器。例如,使用 mA 代替 ma。我将在后面的章节中讨论编辑多个文件。
考虑以下代码片段。
由于某种原因,您忘记了 y 和 z 是什么,并且想要快速跳转到它们的声明。一种方法是向后搜索 y 或 z。VIM 提供了一个更简单、更快捷的解决方案。gd 按键代表“跳转到声明 (Goto Declaration)”。将光标放在 “y” 上,如果您按 gd,光标将带您到声明处:- struct Y y;。
类似的按键是 gD。这会将您带到光标下变量的全局声明。因此,如果想要跳转到 x 的声明,只需按 gD,光标将移动到 x 的声明处。