Learn Vim 第十六章:标签

2026-05-08

Eric Wong

本文翻译自 iggredible/Learn-Vim,部分内容有增改。

快速转到任意定义处,是文本编辑中一个非常有用的特性。在本章中,您将学习如何使用 Vim 标签来做到这一点。

标签概述

假设有人给了您一个新的代码库:

one = One.new
one.donut

One?donut?跟随有One 和 donut定义的源代码,是帮助您理解的一个有效方法。您可以使用fzf 或 grep来搜索它们,但使用标签将更快。

把标签想象成地址簿,它存储的不是”姓名-地址”对,而是”定义-地址”对。

在普通模式下,您可以使用Ctrl-]跳转到定义。

标签生成器

现代 Vim 不自带标签生成器,您需要额外下载它。推荐使用 Universal ctags。

生成一个基本的标签文件:

ctags -R .

R 选项告诉 ctags 从当前位置 (.) 递归扫描文件。稍后,您应该在当前文件夹看到一个tags 文件。

解剖标签文件

来看看donut 标签项:

donut	one.rb	/^  def donut$/;"	f	class:One

上面的标签项由四个部分组成:一个tagname、一个tagfile、一个tagaddress,以及标签选项。

  • donut 是 tagname。
  • one.rb 是 tagfile。
  • /^ def donut$/ 是 tagaddress。
  • f class:One 是标签选项,它告诉 Vim,donut 是一种函数 (f),并且是 One 类的一部分。

标签文件

如果运行 :set tags?,您可能会看见 tags=./tags,tags。Vim 会在当前文件所在路径和当前目录中查找标签文件。

要添加标签文件位置:

:set tags+=path/to/my/tags/file

为大型项目生成标签

如果要排除 node_modules 后执行 ctags:

ctags -R --exclude=node_modules .

可以多次使用 exclude 选项:

ctags -R --exclude=.git --exclude=vendor --exclude=node_modules --exclude=db --exclude=log .

标签导航

Ctrl-] 跳转到光标下的定义。还有命令行模式::tag my-tag。

您还可以使用 <Tab> 来自动补全参数:

:tag d<Tab>

标签优先级

如果有重复的标签项,Vim 会检查关键词的优先级。顺序是:

  1. 当前文件中完全匹配的静态标签。
  2. 当前文件中完全匹配的全局标签。
  3. 其他文件中完全匹配的全局标签。
  4. 其他文件中完全匹配的静态标签。
  5. 当前文件中不区分大小写匹配的静态标签。
  6. 当前文件中不区分大小写匹配的全局标签。
  7. 其他文件中区分大小写匹配的全局标签。
  8. 当前文件中不区分大小写匹配的静态标签。

选择性跳转标签

使用 :tselect 选择要跳转到哪个标签:

:tselect pancake

:tjump 方法仅在有多个匹配项时才提示标签列表:

:tjump pancake

tjump 在普通模式下有一个快捷键:g Ctrl-]。

标签的自动补全

在插入模式中输入Ctrl-x Ctrl-],Vim 将使用标签文件来自动补全。

标签堆栈

Vim 维持着一个标签堆栈。使用 :tags 可以看到这个堆栈。要”弹出”堆栈,运行:pop,或按下 Ctrl-t。

自动生成标签

在保存时生成标签

:autocmd BufWritePost *.rb silent !ctags -R .
  • autocmd 是 Vim 的自动命令方法。
  • BufWritePost 是保存缓冲区时的一个事件。
  • .rb 是 ruby 文件的一种文件模式。
  • silent 避免每次触发时提示。
  • !ctags -R . 是要执行的命令。

使用插件

推荐使用 vim-gutentags,它的使用方法很简单,装上就可以直接使用。

聪明地学习标签

只要配置得当,标签是非常有用的。假设在一个新的代码库中,您想要搞清楚 functionFood 干了什么,您可以通过跳转到它的定义来搞懂它们。在那儿可以看到,它又调用了 functionBreakfast。继续跟踪,发现还调用了 functionPancake。进一步可以知道,这段代码和早餐吃煎饼有关。

现在您已经知道如何使用标签,通过 :h tags 可以学习更多有关标签的知识。

版权声明:本文为原创文章,遵循 署名-非商业性使用-禁止演绎 4.0 国际 (CC BY-NC-ND 4.0)版权协议,转载请附上原文出处链接和本声明。

分享到:

评论