tabpage

tabpage.txt 适用于 Vim 9.2 版本。 最近更新: 2026年5月 VIM 参考手册 by Bram Moolenaar 译者: Willis 多标签页窗口编辑 tab-page tabpage 本文档说明新加入的处理多标签页的命令,以及多标签页环境下行为发生变化的命令。 1. 简介 tab-page-intro 2. 命令 tab-page-commands 3. 其他项目 tab-page-other 4. 设置 'tabline' setting-tabline 5. 设置 'tabpanel' setting-tabpanel 6. 设置 'guitablabel' setting-guitablabel {仅当编译时加入 +windows 特性时才能使用多标签页} {仅当编译时加入 +tabpanel 特性时才能使用 tabpanel 功能}

1. 简介 tab-page-intro

一个标签页容纳一或多个窗口。标签页间可快速切换,用于维护多套窗口布局,每套窗口 处理不同任务。 Vim 窗口顶部 (即标签栏或标签页行) 通常会显示一组标签,每个标签页对应一个标签。 鼠标点击标签即可跳转到对应标签页。下面还会介绍标签页间跳转的其他方式。 绝大多数命令仅作用于当前标签页,包括 CTRL-W 命令、 :windo 、 :all 和 :ball (但可搭配 :tab 修饰符跨标签页执行)。下面会列出能处理其他标签页的命 令。 标签页也是临时编辑缓冲区而无需修改当前窗口布局的好方法。新建标签页完成工作,用 完直接关闭标签页即可。

2. 命令 tab-page-commands

打 开 新 标 签 页: 用 "vim -p filename ..." 启动 Vim 时,每个文件参数都会用独立标签页打开 (但最多 'tabpagemax' 个标签页)。见 -p 在非 GUI 标签栏上,鼠标双击可新建空白标签页。新标签页会被放置在点击位置左侧。 双击中的首次单击可能会先切换标签页,引发一次额外的屏幕刷新。 双击也适用于部分 GUI 版本,特别是 Win32 和 Motif。但点击必须在全部标签右侧。 GUI 标签栏可用鼠标右键打开菜单。 tabline-menu 。 相关自动命令可见 tabnew-autocmd 。 :[count]tabe[dit] :tabe :tabedit :tabnew :[count]tabnew 新建带一个空窗口的标签页。[count] 给出时,新标签页出现在第 [count] 个标签页之后,省略时新标签页出现在当前标签页之后。 :tabnew " 在当前标签页之后新建标签页 :.tabnew " 同上 :+tabnew " 在下个标签页之后新建标签页 " 备注: 比 :tabnew 靠后一个位置 :-tabnew " 在当前标签页之前新建标签页 :0tabnew " 在首个标签页之前新建标签页 :$tabnew " 在末个标签页之后新建标签页 :[count]tabe[dit] [++opt] [+cmd] {file} :[count]tabnew [++opt] [+cmd] {file} 新建标签页并编辑 {file},其余类似 :edit 。[count] 用法见上 :tabnew 。 :[count]tabf[ind] [++opt] [+cmd] {file} :tabf :tabfind 新建标签页并编辑 'path' 路径下的 {file},其余类似 :find 。 [count] 用法见上 :tabnew 。 :[count]tab {cmd} :tab 执行 {cmd},如果该命令要打开新窗口,则改用新标签页。不能用于 :diffsplit 、 :diffpatch 、 :execute 和 :normal 。 [count] 给出时,新标签页出现在第 [count] 个标签页之后,省略时 新标签页出现在当前标签页之后。 例如: :tab split " 在新标签页打开当前缓冲区 :tab help gt " 新建标签页,显示 "gt" 的帮助 :.tab help gt " 同上 :+tab help " 在下个标签页之后新建标签页显示帮助 :-tab help " 在当前标签页之前新建标签页显示帮助 :0tab help " 在首个标签页之前新建标签页显示帮助 :$tab help " 在末个标签页之后新建标签页显示帮助 CTRL-W gf 新建标签页并编辑光标所在文件名。见 CTRL-W_gf 。 CTRL-W gF 新建标签页、编辑光标所在文件名,并跳转到文件名后的行号上。见 CTRL-W_gF 。 关 闭 标 签 页: 标签页最后一个窗口被关闭时,标签页随之关闭,只有最后一个标签页时除外。 鼠标操作: 标签栏显示时,点击标签右上角 "X" 可关闭当前标签页。自定义 'tabline' 可修改标签栏显示内容。 :tabc :tabclose :tabc[lose][!] 关闭当前标签页。 以下情形会使命令失败: - 屏幕上只有一个标签页。 E784 - 'hidden' 未置位、不带 [!]、有缓冲区已修改、且该缓冲区没有其 他窗口打开。 缓冲区修改不被保存,但也不会被丢弃。所以这属于 "安全" 操作。 :tabclose " 关闭当前标签页 :tabc[lose][!] {count} 关闭第 {count} 个标签页。失败条件同上 :tabclose 。 :-tabclose " 关闭上个标签页 :+tabclose " 关闭下个标签页 :1tabclose " 关闭首个标签页 :$tabclose " 关闭末个标签页 :tabclose -2 " 关闭往前数第二个标签页 :tabclose + " 关闭下个标签页 :tabclose 3 " 关闭第三个标签页 :tabclose $ " 关闭末个标签页 :tabclose # " 关闭最近访问过的标签页 关闭标签页后,下一个标签页会成为当前标签页。'tabclose' 选项可修改切换行为。 :tabo :tabonly :tabo[nly][!] 关闭其他所有标签页,只保留当前标签页。 置位 'hidden' 选项时,所有已关闭窗口的缓冲区会被隐藏。 未置位 'hidden' 但置位 'autowrite' 选项时,已修改的缓冲区会被 保存。否则,包含已修改缓冲区的窗口不会被删除。但给出 [!] 时, 这些窗口会被隐藏。已修改的缓冲区永远不会被丢弃,所以修改内容永 远不会丢失。 :tabonly " 仅保留当前标签页,关闭其他所有标签页 :{count}tabo[nly][!] :tabo[nly][!] {count} 只保留第 {count} 个标签页,关闭其他所有标签页。 :.tabonly " 同上 :-tabonly " 仅保留上个标签页 :+tabonly " 仅保留下下标签页 :1tabonly " 仅保留首个标签页 :$tabonly " 仅保留末个标签页 :tabonly - " 仅保留上个标签页 :tabonly +2 " 仅保留往后数第二个标签页 :tabonly 1 " 仅保留首个标签页 :tabonly $ " 仅保留末个标签页 :tabonly # " 仅保留最近访问过的标签页 切 换 到 另 一 个 标 签 页: 鼠标操作: 标签栏显示时,点击标签页标签切换到对应标签页。点击空白位置切换到下个 标签页。'tabline' :tabn[ext] :tabn :tabnext gt <C-PageDown> CTRL-<PageDown> <C-PageDown> gt i_CTRL-<PageDown> i_<C-PageDown> 切换到下个标签页。到达末尾后回绕到首个标签页。 :{count}tabn[ext] :tabn[ext] {count} 切换到第 {count} 个标签页。首个标签页编号为一。 :-tabnext " 切换到上个标签页 :+tabnext " 切换到下个标签页 :+2tabnext " 切换到往后数第二个标签页 :1tabnext " 切换到首个标签页 :$tabnext " 切换到末个标签页 :tabnext $ " 同上 :tabnext # " 切换到最近访问过的标签页 :tabnext - " 切换到上个标签页 :tabnext -1 " 同上 :tabnext + " 切换到下个标签页 :tabnext +1 " 同上 {count}<C-PageDown> {count}gt 切换到第 {count} 个标签页。首个标签页编号为一。 :tabp[revious] :tabp :tabprevious gT :tabN :tabN[ext] :tabNext CTRL-<PageUp> <C-PageUp> <C-PageUp> i_CTRL-<PageUp> i_<C-PageUp> gT 切换到前一个标签页。到达开头后回绕到末个标签页。 :tabp[revious] {count} :tabN[ext] {count} {count}<C-PageUp> {count}gT 往回跳 {count} 个标签页。到达开头后回绕到末个标签页。注意 {count} 用法和 :tabnext 不同,后者用作标签页号。 :tabr[ewind] :tabfir :tabfirst :tabr :tabrewind :tabfir[st] 切换到首个标签页。 :tabl :tablast :tabl[ast] 切换到末个标签页。 <C-Tab> g<Tab> CTRL-W_g<Tab> <C-Tab> g<Tab> CTRL-W g<Tab> 切换到最近访问过的标签页。 其他命令: :tabs :tabs 列出全部标签页及每个标签页内的窗口。 当前窗口会用 ">" 标记。 已修改的缓冲区会用 "+" 标记。 示例: Tab 页 1 + tabpage.txt ex_docmd.c Tab 页 2 > main.c 重 新 排 列 标 签 页: :tabm[ove] [N] :tabm :tabmove :[N]tabm[ove] 将当前标签页移到第 N 个标签页之后。0 代表使当前标签页成为首个 标签页。N 指移动前的标签编号,例如当前是第二个标签页时, `:tabmove 1` 和 `:tabmove 2` 都不会产生变化。 N 省略时,当前标签页移动到末尾。 :.tabmove " 无效果 :-tabmove " 左移当前标签页 :+tabmove " 右移当前标签页 :0tabmove " 当前标签页移动到开头 :tabmove 0 " 同上 :tabmove " 当前标签页移动到末尾 :$tabmove " 同上 :tabmove $ " 同上 :tabmove # " 当前标签页移动到最近访问过的标签页之后 :tabm[ove] +[N] :tabm[ove] -[N] 右移 (+) 或 左移 (-) 当前标签页 N 个位置。 :tabmove - " 左移当前标签页 :tabmove -1 " 同上 :tabmove + " 右移当前标签页 :tabmove +1 " 同上 注意 可用 :Ntabmove 将标签页移到第 N 个标签页之后,也可用 :+Ntabmove 将标 签页移动 N 个位置。+N 含义参见 [range] 。 循 环 遍 历 所 有 标 签 页: :tabd :tabdo :[range]tabd[o] {cmd} 在每个标签页中执行 {cmd},[range] 给出时,只对编号落在 [range] 范围内的标签页执行。 大致相当于: :tabfirst :{cmd} :tabnext :{cmd} 等等 只作用于每个标签页的当前窗口。在某个标签页中执行命令时如果出 错,不再继续访问其余的标签页。 执行结束后,最后一个标签页 (或出错的标签页) 会成为当前标签页。 {cmd} 可用 '|' 拼接多条命令。 {cmd} 禁止新建、关闭或重排标签页。 另见 :windo 、 :argdo 、 :bufdo 、 :cdo 、 :ldo 、 :cfdo 和 :lfdo

3. 其他项目 tab-page-other

tabline-menu GUI 标签栏自带弹出菜单。可通过鼠标右键激活。其中菜单项包括: 关闭标签 关闭鼠标指针所在标签页。指针不在任何标签上则关闭当前标 签页。 新建标签 新建打开空缓冲区的标签页。新标签页出现在鼠标指针左侧。 打开标签... 类似 "新建标签",但额外弹出文件选择器,打开指定文件。 比较模式在不同标签页内分别进行。在一个标签页内可查看若干文件的差异。而在另一个 标签页内对另一组文件进行比较。 标签页局部变量使用 "t:" 前缀。 tabpage-variable 目前仅有一个标签页局部选项: 'cmdheight'。 tabnew-autocmd TabLeave 和 TabEnter 自动命令事件可用于在标签页切换时执行用户操作。事件触发顺 序随操作不同而变化。新建标签页时,相当于先在同一缓冲区上新建窗口,再切换到其他 缓冲区。例如, :tabnew 会依次激活: WinLeave 离开当前窗口 TabLeave 离开当前标签页 WinEnter 进入新标签页内窗口 TabEnter 进入新标签页 BufLeave 离开当前缓冲区 BufEnter 进入新建空白缓冲区 而切换到其他标签页时,事件顺序则是: BufLeave WinLeave TabLeave TabEnter WinEnter BufEnter

4. 设置 'tabline' setting-tabline

'tabline' 选项设置非 GUI 标签栏的外观。GUI 标签栏存在时不使用该选项。 'showtabline' 选项指定标签栏显示的时机: 永不显示、多于一个标签页时显示、总是显 示。 标签栏用 hl-TabLine 、 hl-TabLineSel 、 hl-TabLineFill 高亮组分别指定普通标 签、当前选中标签、标签栏空白区域。 包含已修改缓冲区窗口的标签页会用 "+" 标记。同时显示标签页内窗口总数。例如 "3+" 代表标签页内有三个窗口,其中至少一个缓冲区已修改。 有多个标签页存在且启用 'mouse' 时,最右侧会出现 "X" (关闭按钮)。 'tabline' 选项自定义标签栏的外观。实现并不简单,为此以下给出一例。 基础语法见 'statusline' 选项。'tabline' 和 'tabpanel' 选项使用相同项目。还可配 套使用 tabpagebuflist() 、 tabpagenr() 和 tabpagewinnr() 函数。 因为标签页数量可变,选项必须使用表达式写法,形如: :set tabline=%!MyTabLine() 然后定义 MyTabLine() 函数,以列出所有标签页的标签。一种方便的做法是分两部分实 现。一部分遍历所有标签页,定义标签显示方式。另一部分具体实现标签页的标签获 取。 function MyTabLine() let s = '' for i in range(tabpagenr('$')) " 选择高亮组 if i + 1 == tabpagenr() let s ..= '%#TabLineSel#' else let s ..= '%#TabLine#' endif " 设置标签页号 (用于鼠标点击) let s ..= '%' .. (i + 1) .. 'T' " 调用 MyTabLabel() 获取标签 let s ..= ' %{MyTabLabel(' .. (i + 1) .. ')} ' endfor " 在末个标签页后,用 TabLineFill 填充并复位标签页号 let s ..= '%#TabLineFill#%T' " 右对齐关闭按钮,用于关闭当前标签页 if tabpagenr('$') > 1 let s ..= '%=%#TabLine#%999Xclose' endif return s endfunction 现在定义 MyTabLabel() 函数,为指定标签页获取标签。 function MyTabLabel(n) let buflist = tabpagebuflist(a:n) let winnr = tabpagewinnr(a:n) return bufname(buflist[winnr - 1]) endfunction 此例只提供简化实现。效果接近缺省标签栏,但不处理修改标记 +,也不裁剪标签名。空 间不足时需要考虑智能化裁剪标签宽度。可用 'columns' 选项获取可用空间。

5. 设置 'tabpanel' tabpanel setting-tabpanel

标签页面板是一种垂直侧边栏,在窗口侧边显示标签页标签。示例布局: +-----------+---------------------------------- |(1) |text text text text text text text | ~/aaa.txt|text text text text text text text |(2) |text text text text text text text | ~/.vimrc |text text text text text text text |(3) |text text text text text text text | ~/bbb.js |text text text text text text text | ~/ccc.css|text text text text text text text | |text text text text text text text | |text text text text text text text | |text text text text text text text 标签页面板的配置使用以下选项: 'tabpanel'、'showtabpanel' 和 'tabpanelopt'。 'tabpanel' 选项类似 'statusline' 或 'tabline',而 'showtabpanel' 选项则类似 'laststatus' 或 'showtabline'。 'tabpanelopt' 选项 "columns:" 项设置标签页面板宽度: +------ 宽度对应范围 | <----+-----> +-----------+---------------------------------- |(1) |text text text text text text text | ~/aaa.txt|text text text text text text text |(2) |text text text text text text text 'tabpanelopt' 选项 "align:" 项决定标签页面板在窗口左侧还是右侧显示: +----------------------------------+----------- |text text text text text text text|(1) |text text text text text text text| ~/aaa.txt |text text text text text text text|(2) 'tabpanelopt' 选项 "vert" 项指定是否开启标签页面板和窗口显示区域之间的垂直分隔 线: +------ 垂直分隔线在此处 | v +-----------+---------------------------------- |(1) |text text text text text text text | ~/aaa.txt|text text text text text text text |(2) |text text text text text text text 垂直分隔线字符取自 'fillchars' 里的 "tpl_vert" 项。 标签页面板外观使用 hl-TabPanel hl-TabPanelSel hl-TabPanelFill 高亮组。 在 标 签 页 面 板 中 滚 动 tabpanel-scroll 标签页列表总高度超出可视区域时,在标签页面板区域滚动鼠标滚轮会上下滚动列表。滚 动步长由 'mousescroll' 选项控制。此区域内的滚轮事件由标签页面板自身处理,不触 发 <ScrollWheelUp> 或 <ScrollWheelDown> 映射。 当前标签页始终保持可见: 切换标签页 (如 gt 、 gT 、 :tabnext 等) 时,面板自动 滚动,保证当前标签页条目可见。 要开启垂直滚动条,指示当前滚动位置,可在 'tabpanelopt' 中添加 "scrollbar": :set tabpanelopt+=scrollbar 滚动条始终显示在标签页面板右侧,占一列宽度,不受 'tabpanelopt' 中 "align:" 项 影响。点击滚动条会移动滑块到对应位置,拖曳滑块可持续滚动。 hl-PmenuSbar 高亮组用于绘制滚动条轨道, hl-PmenuThumb 高亮组用于绘制拇指。 重绘时滚动偏移量保持不变。 在 标 签 页 面 板 中 点 击 鼠 标 tabpanel-mouse 鼠标左键点击标签页面板条目行,会切换到对应标签页。与标签栏不同,标签页面板中双 击不会新建空白标签页,而是等价于单击。 要更精细控制,可在 'tabpanel' 选项中通过 stl-%[FuncName] 项定义可点击区域。 点击该区域执行指定回调函数,替代默认的标签页切换动作。

6. 设置 'guitablabel' setting-guitablabel

显示 GUI 标签栏时,'guitablabel' 用于定义单个标签页的显示文本。和定义整个标签 栏显示内容的 'tabline' 不同,'guitablabel' 作用于每一个标签条目。 'guitabtooltip' 格式非常类似,用于设置同一标签的工具提示。仅当鼠标指针在标签上 悬浮时才会弹出,所以通常可以显示更长文本。但仅部分系统支持。 格式语法参考 'statusline' 选项。 "%N" 项可获取当前标签页号。选项求值期间, v:lnum 变量也被赋值为相同值。文件名 相关项目引用该标签页的当前窗口。 注意 此选项不支持语法高亮。也忽略 %T 和 %X 项。 简单示例,标签显示标签页号和缓冲区名: :set guitablabel=%N\ %f 模拟 'guitablabel' 缺省值的示例: 显示标签页里的窗口数目,有已修改缓冲区则显示 '+': function GuiTabLabel() let label = '' let bufnrlist = tabpagebuflist(v:lnum) " 标签页内有已修改缓冲区则加上 '+' for bufnr in bufnrlist if getbufvar(bufnr, "&modified") let label = '+' break endif endfor " 标签页里的窗口多于一个时,追加窗口数目 let wincount = tabpagewinnr(v:lnum, '$') if wincount > 1 let label ..= wincount endif if label != '' let label ..= ' ' endif " 追加当前窗口的缓冲区名 return label .. bufname(bufnrlist[tabpagewinnr(v:lnum) - 1]) endfunction set guitablabel=%{GuiTabLabel()} 注意 必须先定义函数,再设置选项。否则会报错,提示函数未知。 要回退到缺省标签,选项返回空串即可。 要显示标签页特定内容,可以使用标签页局部变量。 t:var vim:tw=78:ts=8:noet:ft=help:norl: