*tabpage.txt*   For Vim version 8.0.  最近更新: 2017年8月


		  VIM 参考手册	  by Bram Moolenaar
				译者: Willis
				http://vimcdoc.sf.net


多标签页窗口编辑					*tab-page* *tabpage*

这里解释新加入的处理多标签页的命令。另外，也提供因为和多于一个标签页组合使用而
行为不同的命令的解释。

1. 简介				|tab-page-intro|
2. 命令				|tab-page-commands|
3. 其它项目			|tab-page-other|
4. 设置 'tabline'		|setting-tabline|
5. 设置 'guitablabel'		|setting-guitablabel|

{Vi 无此功能}
{仅当编译时加入 |+windows| 特性才能使用多标签页}

==============================================================================
1. 简介						*tab-page-intro*

一个标签页容纳一或多个窗口。标签页间很容易切换，这种方式使你可以拥有多个窗口集
合，每个集合做不同的工作。

通常你会在 Vim 窗口顶部看到一组标签的列表，每个标签页一个。用鼠标点击标签可以
跳转到对应的标签页。下面还介绍在其它标签页间移动的方式。

多数命令只能用于当前标签页，其中包括 |CTRL-W| 命令、|:windo|、|:all| 和
|:ball| (除非用 |:tab| 修饰符)。
下面会列出那些能意识到有其它标签页存在的命令。

标签页也是临时编辑某个缓冲区而不用修改当前窗口布局的好方法。只要打开新标签页，
做你想做的事，然后关闭该标签页就可以了。

==============================================================================
2. 命令							*tab-page-commands*

打 开 新 标 签 页:

启动 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|。
		{仅当编译时加入 |+file_in_path| 特性才有效}

:[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 $	    " 关闭末个标签页
<

							*: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 $	    " 关闭除了末页之外的所有标签页


切 换 到 另 一 个 标 签 页:

使用鼠标: 如果显示标签页行，某个标签页标签上单击可以切换到该标签页。没有标签的
地方点击则转到下一个标签页。|'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 -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} 个标签页。首个标签页则回绕到最后一个。

:tabr[ewind]			*:tabfir* *:tabfirst* *:tabr* *:tabrewind*
:tabfir[st]	转到第一个标签页。

							*:tabl* *:tablast*
:tabl[ast]	转到最后一个标签页。


其它命令:
							*: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	" 什么都不做
		    :-tabmove	" 往左移动当前标签页
		    :+tabmove	" 往右移动当前标签页
		    :0tabmove	" 移动当前标签页到标签页之首
		    :tabmove 0	" 同上
		    :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} 不能打开标签页、关闭标签页或重排标签页。
		{Vi 无此功能} {仅当编译时加入 |+listcmds| 特性才有效}
		另见 |:windo|、|:argdo|、|:bufdo|、|:cdo|、|:ldo|、|:cfdo| 和
		|:lfdo|

==============================================================================
3. 其它项目						*tab-page-other*

							*tabline-menu*
GUI 标签页行提供弹出菜单。用右键点击可以访问。它包含的项目有:
	Close		关闭鼠标指针所在的标签页。如果鼠标指针不在任何标签上，
			关闭当前标签页。
	New Tab		打开新标签页并编辑空缓冲区。该标签页出现在鼠标指针的左
			侧。
	Open Tab...	类似于 "New Tab"，但同时提供文件选择器以选择要编辑的文
			件。

每个标签页对 diff 模式进行分别的处理。你可以在一个标签页上比较若干文件。而在另
一个标签页上比较不同的文件。

局部于标签页的变量以 "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 标签页行时才使用该选项。

用 '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' 选项可以查看可用的空间。

==============================================================================
5. 设置 '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:ft=help:norl:
