vim标签系统

vim在代码间跳转的默认配置就是标签(tags)系统.

标签系统

可以通过:h tags, 查看vim官方文档.

跟标签相关的几个概念

概念 含义
标签(tag) 在标签文件里的一个标识符, 可以用来跳转, 比如一个文件名或者变量名.
标签文件(tags file) 由第三方程序生成的含有一系列标签的外部文件. 这个第三方程序通常是ctags.
标签栈(tag stack) 一系列跳转按照时间顺序形成的栈. 注意这里要跟跳转列表(jump list)区分开. 前者仅仅是标签跳转的位置列表, 后者是前者的超集, 包括所有的vim motion命令的跳转结果.
标签匹配表(Tag match list) 当标签文件里出现多个匹配的标签时, 这些标签会按照优先级组织成一张列表.
预览窗口(Preview window) 这是一个每个tab页只能有一个的特殊窗口, 通常比较小, 用来预览其他文件里的标签定义.

跟标签相关的常用命令

命令 快捷键 含义
:ta[g] {name} CTRL-] 跳转到光标所在处的关键词的定义的位置
:[count]po[p] CTRL-T 在标签栈里向更老的位置跳转
:[count]ta[g] 在标签栈里向更新的位置跳转
:tags 显示整个标签栈的内容, 标有>的是下一个tag命令要跳转的标签, 所以当前显示的内容是>行的上一行.
:ts[elect] [name] g] 不直接跳转, 而是给出匹配表让用户选择.
:tj[ump] [name] g CTRL-] 如果只有一个匹配直接跳转, 如果多个匹配, 列出列表.
:tn, :tp, :tr, :tl 在匹配表中前后跳转
:pta[g] CTRL-W } 在预览窗口里显示光标所在处关键词的定义
:pp[op] 等于:pop, 在标签栈里向更老的位置跳转, 但结果显示在预览窗口里.
:pts[elect] [name] 等于 :tselect, 但结果显示在预览窗口
:ptj[ump] CTRL-W g} 等于:tjump 但结果显示在预览窗口
:ptn, :ptp, :ptr, :ptl 在匹配表中前后跳转, 结果显示在预览窗口
:pc[lose] CTRL-W z 关闭预览窗口
:sta[g] [name] CTRL-W ] 等于:tag, 但结果在分裂(split)的窗口中显示
CTRL-W g] 等于:tselect, 但结果在分裂(split)的窗口中显示
CTRL-W g CTRL-] 等于:tjump, 但结果在分裂(split)的窗口中显示

标签文件结构

这个可以用:h ctags看vim官方文档. 这个话题很复杂, 将来有机会慢慢研究

标签生成工具

Universal CTags代替Exuberant Ctags, 后者已经停止开发多年.

插件

使用插件gutentags. 这个插件几乎让ctags的标签文件变得对用户不可见, 完全不用操心生成标签文件的事情.

参考

skywind的Vim 8 下 C/C++ 开发环境搭建

返回vim技巧总结