帮助总览 ·
快速参考 ·
命令索引 ·
函数列表 ·
选项列表 ·
用户手册 ·
参考手册 ·
一个标签页容纳一或多个窗口。标签页间可快速切换,用于维护多套窗口布局,每套窗口
处理不同任务。
Vim 窗口顶部 (即标签栏或标签页行) 通常会显示一组标签,每个标签页对应一个标签。
鼠标点击标签即可跳转到对应标签页。下面还会介绍标签页间跳转的其他方式。
绝大多数命令仅作用于当前标签页,包括 CTRL-W 命令、 :windo 、 :all 和
:ball (但可搭配 :tab 修饰符跨标签页执行)。下面会列出能处理其他标签页的命
令。
标签页也是临时编辑缓冲区而无需修改当前窗口布局的好方法。新建标签页完成工作,用
完直接关闭标签页即可。
打 开 新 标 签 页:
用 "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
tabline-menu
GUI 标签栏自带弹出菜单。可通过鼠标右键激活。其中菜单项包括:
关闭标签 关闭鼠标指针所在标签页。指针不在任何标签上则关闭当前标
签页。
新建标签 新建打开空缓冲区的标签页。新标签页出现在鼠标指针左侧。
打开标签... 类似 "新建标签",但额外弹出文件选择器,打开指定文件。
比较模式在不同标签页内分别进行。在一个标签页内可查看若干文件的差异。而在另一个
标签页内对另一组文件进行比较。
标签页局部变量使用 "t:" 前缀。 tabpage-variable
目前仅有一个标签页局部选项: 'cmdheight' 。
tabnew-autocmd
TabLeave 和 TabEnter 自动命令事件可用于在标签页切换时执行用户操作。事件触发顺
序随操作不同而变化。新建标签页时,相当于先在同一缓冲区上新建窗口,再切换到其他
缓冲区。例如, :tabnew 会依次激活:
WinLeave 离开当前窗口
TabLeave 离开当前标签页
WinEnter 进入新标签页内窗口
TabEnter 进入新标签页
BufLeave 离开当前缓冲区
BufEnter 进入新建空白缓冲区
而切换到其他标签页时,事件顺序则是:
BufLeave
WinLeave
TabLeave
TabEnter
WinEnter
BufEnter
'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' 选项获取可用空间。
标签页面板是一种垂直侧边栏,在窗口侧边显示标签页标签。示例布局:
+-----------+----------------------------------
|(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] 项定义可点击区域。
点击该区域执行指定回调函数,替代默认的标签页切换动作。
显示 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: