一个标签页容纳一或多个窗口。标签页间很容易切换,这种方式使你可以拥有多个窗口集
合,每个集合做不同的工作。
通常你会在 Vim 窗口顶部看到一组标签的列表,每个标签页一个。用鼠标点击标签可以
跳转到对应的标签页。下面还介绍在其它标签页间移动的方式。
多数命令只能用于当前标签页,其中包括 CTRL-W 命令、 :windo 、 :all 和
:ball (除非用 :tab 修饰符)。
下面会列出那些能意识到有其它标签页存在的命令。
标签页也是临时编辑某个缓冲区而不用修改当前窗口布局的好方法。只要打开新标签页,
做你想做的事,然后关闭该标签页就可以了。
打 开 新 标 签 页:
启动 Vim 时用 "vim -p filename ..." 为每个文件参数打开一个新标签页 (标签页个数
不能超过 '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 # " 关闭最近访问的标签页
: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] 转到最后一个标签页。
g<Tab> CTRL-W_g<Tab> <C-Tab>
g<Tab>
转到最近访问的标签页。
其它命令:
:tabs
:tabs 列出标签页和它们包含的窗口。
当前窗口显示 ">"。
修改过的缓冲区显示 "+"。
例如:
Tab page 1
+ tabpage.txt
ex_docmd.c
Tab page 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 标签页行提供弹出菜单。用右键点击可以访问。它包含的项目有:
Close 关闭鼠标指针所在的标签页。如果鼠标指针不在任何标签上,
关闭当前标签页。
New Tab 打开新标签页并编辑空缓冲区。该标签页出现在鼠标指针的左
侧。
Open Tab... 类似于 "New Tab",但同时提供文件选择器以选择要编辑的文
件。
每个标签页对比较模式进行分别的处理。你可以在一个标签页上比较若干文件。而在另一
个标签页上比较不同的文件。
局部于标签页的变量以 "t:" 开头。 tabpage-variable
目前只有一个局部于标签页的选项: 'cmdheight'。
tabnew-autocmd
TabLeave 和 TabEnter 自动命令事件可以在标签页切换时执行任务。准确的顺序取决于
你做的事情。建立新标签页相当于先建立工作于同一缓冲区的新窗口,再在其上编辑别的
缓冲区。所以,":tabnew" 依次激活:
WinLeave 离开当前窗口
TabLeave 离开当前标签页
WinEnter 进入新标签页的窗口
TabEnter 进入新标签页
BufLeave 离开当前缓冲区
BufEnter 进入新的空白缓冲区
而切换到另一个标签页的相应顺序是:
BufLeave
WinLeave
TabLeave
TabEnter
WinEnter
BufEnter
'tabline' 选项指定标签页行的外观。只有没有 GUI 标签页行时才使用该选项。
用 'showtabline' 选项可以指定何时显示标签页行: 从不、多于一个标签页才显示、总
是。
标签页行的高亮用 TabLine、TabLineSel 和 TabLineFill 分别指定。 hl-TabLine
hl-TabLineSel hl-TabLineFill
包含修改过的窗口的标签页会显示 "+"。同时也显示该标签页里包含的窗口数。所以,
"3+" 意味着有三个窗口,其中一个有修改过的缓冲区。
'tabline' 选项允许你定义自己喜欢的标签页标签显示方式。实现并不简单,所以这里给
出一个例子。
基本知识见 'statusline' 选项。'tabline' 选项可以使用相同的项目。此外,还可用
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' 选项可以查看可用的空间。
如果显示 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: