标签页

Nvim 的 :help 页面,生成源代码 使用 tree-sitter-vimdoc 解析器。


在多个标签页中使用窗口进行编辑。 tabpage
本节将解释使用多个标签页所新增的命令。此外,还将解释在与多个标签页结合使用时,行为有所不同的命令。

1. 简介 tab-page-intro

一个标签页包含一个或多个窗口。您可以轻松地在标签页之间切换,以便拥有多个窗口集合来处理不同的工作。
通常情况下,您会在 Vim 窗口的顶部看到一个标签列表,每个标签对应一个标签页。您可以使用鼠标点击标签以跳转到该标签页。还有其他方法可以切换标签页,请参见下方内容。
大多数命令仅在当前标签页中起作用。这包括 CTRL-W 命令、 :windo:all:ball(不使用 :tab 修饰符时)。对除当前标签页以外的其他标签页也起作用的命令将在下方列出。
标签也是一种很好的方式,可以临时编辑缓冲区,而不会更改当前窗口布局。打开一个新的标签页,执行您要执行的操作,然后关闭标签页。
打开新的标签页
在启动 Vim 时,"vim -p filename ..." 会将每个文件参数打开在单独的标签页中(最多 'tabpagemax')。参见 -p
在非 GUI 标签页行中双击鼠标,将打开一个新的空白标签页。它将放置在点击位置的左侧。第一次点击可能会先选中另一个标签页,从而导致额外的屏幕更新。
这在一些 GUI 版本中也适用,尤其是 Win32。但是只有在点击标签右侧时才适用。
在 GUI 标签页行中,您可以使用鼠标右键打开菜单。 tabline-menu.
有关相关的自动命令,请参见 tabnew-autocmd.
:[count]tabe[dit] :tabe :tabedit :tabnew :[count]tabnew 打开一个带有空白窗口的新标签页,位于当前标签页之后。如果指定了 [count],则新标签页将出现在标签页 [count] 之后,否则新标签页将出现在当前标签页之后。
:tabnew     " opens tabpage after the current one
:.tabnew    " as above
:+tabnew    " opens tabpage after the next tab page
            " note: it is one further than :tabnew
:-tabnew    " opens tabpage before the current
:0tabnew    " opens tabpage before the first one
:$tabnew    " opens tabpage after the last one
:[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            " opens current buffer in new tab page
:tab help gt    " opens tab page with help for "gt"
:.tab help gt   " as above
:+tab help            " opens tab page with help after the next
                " tab page
:-tab help            " opens tab page with help before the
                " current one
:0tab help            " opens tab page with help before the
                " first one
:$tab help            " opens tab page with help after the last
                " one
CTRL-W gf 打开一个新的标签页并编辑光标下的文件名。参见 CTRL-W_gf.
CTRL-W gF 打开一个新的标签页并编辑光标下的文件名,并跳转到文件名后的行号。参见 CTRL-W_gF.
关闭标签页
关闭标签页中的最后一个窗口也将关闭标签页,除非只有一个标签页。
使用鼠标:如果显示了标签页行,则可以点击右上角的“X”以关闭当前标签页。自定义的 'tabline' 可能会显示其他内容。
:tabc :tabclose :tabc[lose][!] 关闭当前标签页。当出现以下情况时,该命令将失败:
屏幕上只有一个标签页。 E784
当未设置 'hidden'、未使用 [!]、缓冲区存在更改并且此缓冲区上没有其他窗口时。缓冲区中的更改不会写入,也不会丢失,因此这是一个“安全”命令。
:tabclose   " close the current tab page
:{count}tabc[lose][!] :tabc[lose][!] {count} 关闭标签页 {count}。以与上述 :tabclose 相同的方式失败。
:-tabclose            " close the previous tab page
:+tabclose            " close the next tab page
:1tabclose            " close the first tab page
:$tabclose            " close the last tab page
:tabclose -2    " close the 2nd previous tab page
:tabclose +            " close the next tab page
:tabclose 3            " close the third tab page
:tabclose $            " close the last tab page
:tabclose #     " close the last accessed tab page
关闭标签页后,下一个标签页将成为当前标签页。可以使用 'tabclose' 选项来自定义此行为。
:tabo :tabonly :tabo[nly][!] 关闭所有其他标签页。当设置了 'hidden' 选项时,已关闭窗口中的所有缓冲区都将变为隐藏状态。当未设置 'hidden' 选项并且设置了 'autowrite' 选项时,将写入已修改的缓冲区。否则,将不会移除包含已修改缓冲区的窗口,除非指定了 [!],否则这些窗口将变为隐藏状态。但是,已修改的缓冲区永远不会被放弃,因此更改不会丢失。
:tabonly " close all tab pages except the current one
:tabo[nly][!] {count} 关闭除 {count} 之外的所有标签页。
:.tabonly            " as above
:-tabonly            " close all tab pages except the previous
                " one
:+tabonly            " close all tab pages except the next one
:1tabonly            " close all tab pages except the first one
:$tabonly            " close all tab pages except the last one
:tabonly -            " close all tab pages except the previous
                " one
:tabonly +2     " close all tab pages except the two next
                " one
:tabonly 1            " close all tab pages except the first one
:tabonly $            " close all tab pages except the last one
:tabonly #            " close all tab pages except the last
                " accessed one
切换到另一个标签页
使用鼠标:如果显示了标签页行,则可以点击标签页标签以切换到该标签页。点击没有标签的位置以转到下一个标签页。 '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}。第一个标签页的编号为 1。
:-tabnext        " go to the previous tab page
:+tabnext        " go to the next tab page
:+2tabnext        " go to the two next tab page
:1tabnext        " go to the first tab page
:$tabnext        " go to the last tab page
:tabnext $        " as above
:tabnext #        " go to the last accessed tab page
:tabnext -        " go to the previous tab page
:tabnext -1        " as above
:tabnext +        " go to the next tab page
:tabnext +1        " as above
{count}<C-PageDown> {count}gt 转到标签页 {count}。第一个标签页的编号为 1。
: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 的用法不同,在 :tabnext 中,{count} 用作标签页编号。
:tabr[ewind] :tabfir :tabfirst :tabr :tabrewind :tabfir[st] 转到第一个标签页。
:tabl :tablast :tabl[ast] 转到最后一个标签页。
<C-Tab> CTRL-<Tab> <C-Tab> g<Tab> g<Tab> CTRL-W_g<Tab> CTRL-W g<Tab> 转到上次访问的标签页。
其他命令: :tabs
:tabs 列出标签页及其包含的窗口。对当前窗口显示“>”。对已修改的缓冲区显示“+”。例如
标签页 1
+ tabpage.txt
ex_docmd.c
标签页 2
> main.c
重新排序标签页
:tabm[ove] [N] :tabm :tabmove :[N]tabm[ove] 将当前标签页移动到标签页 N 之后。使用零将当前标签页设为第一个标签页。N 在移动之前计数,因此如果第二个标签页是当前标签页,则 :tabmove 1:tabmove 2 不会产生任何影响。如果未指定 N,则该标签页将变为最后一个标签页。
:.tabmove        " do nothing
:-tabmove        " move the tab page to the left
:+tabmove        " move the tab page to the right
:0tabmove        " move the tab page to the first
:tabmove 0        " as above
:tabmove        " move the tab page to the last
:$tabmove        " as above
:tabmove $        " as above
:tabmove #        " move the tab page after the last accessed
            " tab page
:tabm[ove] +[N] :tabm[ove] -[N] 将当前标签页向右(使用 +)或向左(使用 -)移动 N 个位置。
:tabmove -        " move the tab page to the left
:tabmove -1        " as above
:tabmove +        " move the tab page to the right
:tabmove +1        " as above
请注意,虽然可以使用 :Ntabmove 将标签页移动到第 N 个标签页之后,并可以使用 :+Ntabmove 将其移动 N 个位置。有关此上下文中 +N 的含义,请参见 [range]
循环遍历标签页
:tabd :tabdo :[range]tabd[o] {cmd} 在每个标签页中执行 {cmd},或者如果指定了 [range],则仅在标签页编号在 [range] 中的标签页中执行。它类似于执行以下操作:
:tabfirst
:{cmd}
:tabnext
:{cmd}
etc.
这仅在每个标签页的当前窗口中运行。如果在一个标签页中检测到错误,则不会访问其他标签页。最后一个标签页(或发生错误的标签页)将成为当前标签页。{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 WinEnter TabEnter BufEnter
当进入新的选项卡页面 (:tabnew) 时,TabNew 在 TabEnter 之前触发,在 WinEnter 之后触发。
选项 '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('$'))
    " select the highlighting
    if i + 1 == tabpagenr()
      let s ..= '%#TabLineSel#'
    else
      let s ..= '%#TabLine#'
    endif
    " set the tab page number (for mouse clicks)
    let s ..= '%' .. (i + 1) .. 'T'
    " the label is made by MyTabLabel()
    let s ..= ' %{MyTabLabel(' .. (i + 1) .. ')} '
  endfor
  " after the last tab fill with TabLineFill and reset tab page nr
  let s ..= '%#TabLineFill#%T'
  " right-align the label to close the current tab page
  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' 不同的是,'tabline' 同时指定整个选项卡页面行,而 'guitablabel' 用于单独的标签。
'guitabtooltip' 非常相似,用于同一个标签的工具提示。 这只在鼠标指针悬停在标签上时才会出现,因此通常更长。 不过,只有在某些系统上受支持。
请参阅选项 'statusline',了解值的格式。
项目 “%N” 可用于当前选项卡页面的编号。 当评估选项时,变量 v:lnum 也会设置为该编号。 使用文件名的项目指的是选项卡页面中的当前窗口。
请注意,选项不使用语法高亮显示。 项目 %T 和 %X 也会被忽略。
一个简单的示例,将选项卡页面的编号和缓冲区的名称放在标签中
:set guitablabel=%N\ %f
一个类似于默认 'guitablabel' 的示例:显示选项卡页面中的窗口数量,如果存在修改的缓冲区,则显示“+”
function GuiTabLabel()
  let label = ''
  let bufnrlist = tabpagebuflist(v:lnum)
  " Add '+' if one of the buffers in the tab page is modified
  for bufnr in bufnrlist
    if getbufvar(bufnr, "&modified")
      let label = '+'
      break
    endif
  endfor
  " Append the number of windows in the tab page if more than one
  let wincount = tabpagewinnr(v:lnum, '$')
  if wincount > 1
    let label ..= wincount
  endif
  if label != ''
    let label ..= ' '
  endif
  " Append the buffer name
  return label .. bufname(bufnrlist[tabpagewinnr(v:lnum) - 1])
endfunction
set guitablabel=%{GuiTabLabel()}
请注意,必须在设置选项之前定义函数,否则您会收到有关函数未知的错误消息。
如果您想回退到默认标签,请返回空字符串。
如果您想为选项卡页面显示特定内容,则可能需要使用选项卡页面局部变量。 t:var
主要
命令索引
快速参考