WINDOWS

*windows.txt*   For Vim version 6.4.  最后更新: 2005年3月21日


                  VIM  参 考 手 册    作者: Bram Moolenaar
                                      译者: Dasn
                                      VCD主页: http://vimcdoc.sf.net


使用多个窗口和缓冲区进行编辑                            *windows* *buffers*

本章我们看一下操作多个窗口和缓冲区的命令。另外有些命令在操作多个窗口的时候不同
于单个窗口,这些命令也会在本章被介绍。

一些基本的内容在用户手册的第 7、8 两个章节里 |usr_07.txt| |usr_08.txt|
已经介绍过了。

1.  简介                                        |windows-intro|
2.  启动 Vim                                    |windows-starting|
3.  打开和关闭一个窗口                          |opening-window|
4.  把光标移动到另一个窗口                      |window-move-cursor|
5.  窗口的移动                                  |window-moving|
6.  改变窗口的大小                              |window-resize|
7.  参数和缓冲区的列表命令                      |buffer-list|
8.  在所有的缓冲区和窗口里执行命令              |list-repeat|
9.  当前光标处的标记和文件名                    |window-tag|
10. 预览窗口                                    |preview-window|
11. 使用隐藏的缓冲区                            |buffer-hidden|
12. 特殊类型的缓冲区                            |special-buffers|

{Vi 没有这些命令}
{如果在编译时没有加入 |+windows|,则不能使用多个窗口}
{如果在编译时没有加入 |+vertsplit|,则不能垂直分割窗口}


1. 简介 *windows-intro*

"窗口"被用来查看缓冲区里的内容。你可以用多个窗口观察同一个缓冲区,也可以用 多个窗口观察不同的缓冲区。 "缓冲区"是一块内存区域,里面存储着正在编辑的文件。如果没有把缓冲区里的文件存 盘,那么原始文件不会被更改。 缓冲区的状态可以是下述三种情况之一: *active-buffer* 激活: 缓冲区的内容显示在一个窗口里。如果该缓冲区是针对某一个文件创建的,那 么该文件已经被读入缓冲区。如果缓冲区被更改过,其内容便会与原文件不同。 *hidden-buffer* 隐藏: 缓冲区的内容不被显示。如果该缓冲区是针对某一个文件创建的,那么该文件 已经被读入缓冲区。其实它与激活状态一样,只是你看不见它。 *inactive-buffer* 非激活: 缓冲区的内容不被显示,也不包含任何数据。文件一旦被装入,与该缓冲区相 关的选项会被记住。这些选项可以包括 |viminfo| 文件里的一些标记,但是 这种缓冲区不能包含文本。 用一个表来说明: 状态 在窗口显示 文件装载 用 ":buffers" 命令 显示 激活 yes yes 'a' 隐藏 no yes 'h' 非激活 no no ' ' 备注: 所有的 CTRL-W 命令都可以用 |:wincmd| 执行,当我们不能在正常模式下输入命 令,或者输入不方便时可以试一下。

2. 启动 Vim *windows-starting*

在默认情况下,与 Vi 类似, Vim 启动后只打开一个窗口。 参数 "-o" 和 "-O" 可以让 Vim 为参数列表里的每一个文件打开一个窗口。参数 "-o" 水平分割窗口;参数 "-O" 垂直分割窗口。如果 "-o" 和 "-O" 都用了,那么最后一个参 数决定分割的方向。例如,下面的例子打开三个水平分割的窗口: vim -o file1 file2 file3 参数 "-oN" ,这里的 N 是一个十进制数,用这个参数可以打开 N 个水平分割的窗口。 如果文件名的个数多于窗口数目,则只打开 N 个窗口,这样有一些文件就得不到窗口来 显示。如果指定的窗口数多于文件的个数,那么后面的几个窗口会编辑空的缓冲区。同样, "-ON" 打开 N 个垂直分割的窗口,相应的规则与 "-oN" 相同。 如果你打开了很多的文件,每个窗口都会便得很小。你可能需要设置 'winheight' 和 'winwidth' 选项来创建一个适合工作的环境。 Buf/Win Enter/Leave 等自动命令 |autocommand| 不会在打开窗口或读取文件时运行, 只有在真正进入缓冲后才会执行。 *status-line* 状态栏用来分割窗口。选项 'laststatus' 用来设置在什么时候最后一个窗口可以有状态 栏: 'laststatus' = 0 不要状态栏 'laststatus' = 1 窗口数多于一个的时候 'laststatus' = 2 总是显示状态栏 你可以通过设置 'statusline' 选项来改变状态栏的内容。 通常状态栏用反色显示。你可以通过修改 'highlight' 选项中的 's' 字符来改变。例如, "sb" 设置为粗体字。如果没有启用状态栏加亮 ("sn"), 那么字符 '^' 表示当前窗口, 字符 '=' 表示其它窗口。如果支持鼠标,并且已经通过设置 'mouse' 选项使之启动,那 么你可以用鼠标拖动状态栏以改变窗口的大小。 备注: 如果你想让状态栏以反色显示,但是没有效果。查看一下 'highlight' 选项是否包 含了 "si"。在 3.0 版本里,这意味着反转(invert)状态栏,但是现在应该使用 "sr", 反转(reverse)状态栏,因为 "si" 现在表示斜体(italic)!如果你的终端不支持斜 体,那么状态栏还是会以反色显示;这种问题只会出现在支持斜体字的 termcap 终端上。

3. 打开和关闭一个窗口 *opening-window* *E36*

CTRL-W s *CTRL-W_s* CTRL-W S *CTRL-W_S* CTRL-W CTRL-S *CTRL-W_CTRL-S* :[N]sp[lit] [++opt] [+cmd] *:sp* *:split* 把当前窗口分割成两个,结果是两个窗口显示同一个文件。新打开的窗 口高度为 N(默认值是当前窗口高度的一半)。减少当前窗口的高度, 空出地方给新的窗口(如果你设置了 'equalalways' 选项,并且 'eadirection' 没有设置为 "hor" 的话,其它窗口也被影响)。 备注: CTRL-S 不是在所有的终端都能使用,并且可能导致不能继续输 入,遇到这种情况,用 CTRL-Q 继续。参见 |++opt| 和 |+cmd|。 CTRL-W CTRL-V *CTRL-W_CTRL-V* CTRL-W v *CTRL-W_v* :[N]vs[plit] [++opt] [+cmd] [file] *:vs* *:vsplit* 与 |:split| 类似,但垂直分割窗口。如果打开了 'equalalways' 选 项,并且选项 'eadirection' 没有设置为 "ver" ,窗口会被均匀地 水平铺开,除非你指定了窗口的宽度。 备注: 在其它地方 CTRL-QCTRL-V,但是在这里不是! CTRL-W n *CTRL-W_n* CTRL-W CTRL_N *CTRL-W_CTRL-N* :[N]new [++opt] [+cmd] *:new* 创建一个新窗口并且开始编辑一个空文件。新窗口的高度为 N (默认 值为现存高度的一半)。减少当前窗口的高度,为新窗口留出空间(如 果你打开了 'equalalways' 选项,并且 'eadirection' 没有设置为 "hor",其它窗口也会被影响)。 参见:|++opt| and |+cmd|。 如果设置了 'fileformats' 选项,那么新缓冲区会使用该值;如果 'fileformats' 为空,那么使用当前缓冲区的 'fileformat' 值。这个 值可以被 |++opt| 参数覆盖。 自动命令以如下顺序被执行: 1. 在当前窗口执行 WinLeave 2. 在新窗口里执行 WinEnter 3. 在当前缓冲区执行 BufLeave 4. 在新缓冲区执行 BufEnter 这跟先执行 ":split" ,再执行一个 ":e" 命令的效果差不多。 :[N]vne[w] [++opt] [+cmd] [file] *:vne* *:vnew* 与 |:new| 命令相似,但是它垂直分割窗口,如果打开了 'equalalways' 选项,并且选项 'eadirection' 没有设置为 "ver" , 窗口会被均匀地水平铺开,除非你指定了窗口的宽度。 :[N]new [++opt] [+cmd] {file} :[N]sp[lit] [++opt] [+cmd] {file} *:split_f* 创建一个新的窗口,并且开始编辑文件 {file}。 如果使用了 [+cmd] 参数,文件加载完毕后会执行命令 |+cmd| 。 也参见:|++opt|。 新窗口的高度为 N (默认值为现存高度的一半)。减少当前窗口的高 度,为新窗口留出空间(如果你打开了 'equalalways' 选项,其它 窗口也会被影响)。 :[N]sv[iew] [++opt] [+cmd] {file} *:sv* *:sview* *splitview* 与 ":split" 命令相同,但是会给缓冲区设置 'readonly' 。 :[N]sf[ind] [++opt] [+cmd] {file} *:sf* *:sfind* *splitfind* 与 ":split" 命令相同,但是会在 'path' 里寻找 {file}。如果找不 到,就不会分割窗口。 CTRL-W CTRL-^ *CTRL-W_CTRL-^* *CTRL-W_^* CTRL-W ^ 执行 ":split #" 命令,把窗口分成两个,并且编辑备选文件。如果 指定了计数器,就变成了 ":split #N",分割窗口,并且编辑缓冲区 N 。 注意 'splitbelow' 和 'splitright' 选项会影响新窗口的位置。 *:vert* *:vertical* :vert[ical] {cmd} 执行 {cmd} 。如果包含一个分割窗口的命令,那么将垂直分割窗口。 :lefta[bove] {cmd} *:lefta* *:leftabove* :abo[veleft] {cmd} *:abo* *:aboveleft* 执行 {cmd} 。如果包含一个分割窗口的命令,那么将从当前窗口的左 (垂直分割)或者上方(水平分割)分割窗口,而忽略 'splitbelow' 和 'splitright' 的设置。 :rightb[elow] {cmd} *:rightb* *:rightbelow* :bel[owright] {cmd} *:bel* *:belowright* 执行 {cmd} 。 如果包含一个分割窗口的命令,那么将从当前窗口的右 (垂直分割)或者下方(水平分割)分割窗口,而忽略 'splitbelow' 和 'splitright' 的设置。 *:topleft* *E442* :to[pleft] {cmd} 执行 {cmd} 。如果包含一个分割窗口的命令,那么该窗口出现在顶部, 并且占据最大宽度。当垂直分割窗口时,窗口出现在最左边,并且占据 最大高度。 *:botright* :bo[tright] {cmd} 执行 {cmd} 。如果包含一个分割窗口的命令,那么该窗口出现在底部, 并且占据最大宽度。当垂直分割窗口时,窗口出现在最右边,并且占据 最大高度。 这些修饰符可以结合使用来打开一个垂直分割的并且占据最大高度的窗口: :vertical topleft edit tags 在 Vim 窗口最左边打开一个垂直分割的、最大高度的窗口,用来编辑 tags 文件。 关闭一个窗口


CTRL-W q                                                *CTRL-W_q*
CTRL-W CTRL-Q                                           *CTRL-W_CTRL-Q*
:q[uit]         退出当前窗口。如果退出的是最后一个窗口(不包括帮助窗口),就会
                退出 Vim 。
                如果设置了 'hidden' 并且只有此一个窗口监视当前缓冲区,那么该缓
                冲区被隐藏。
                如果没有设置 'hidden',并且只有当前这一个窗口监视该缓冲区,而
                且缓冲区被修改了,那么该命令不会成功。
                (注意CTRL-Q 不是在所有的终端下都好用)

:q[uit]!        退出当前窗口。如果这是缓冲区的最后一个窗口,那么对于此缓冲区的
                改动将全部丢失。如果退出的是最后一个窗口(不包括帮助窗口),就
                会退出 Vim 。缓冲区里的全部内容将丢失。即使设置了 'hidden' 选项
                也是如此。

CTRL-W c                                        *CTRL-W_c* *:clo* *:close*
:clo[se][!]     关闭当前窗口。如果设置了 'hidden' ,或者改动了缓冲区但是命令里
                用了[!],缓冲区会被隐藏。(除非还有一个窗口在编辑该缓冲区)。
                该命令在下述情况下会失败:                      *E444*
                - 只剩下最后一个窗口的时候。
                - 当 'hidden' 没有设置, 也没有用 [!] ,并且缓冲区也已经被修改,
                  而且也没有其它窗口监视该缓冲区的时候。对缓冲区的改动既不写入
                  文件,也不会丢失,所以这是个"安全"的命令。

CTRL-W CTRL-C                                           *CTRL-W_CTRL-C*
                你可能想用 CTRL-W CTRL-C 关闭当前窗口,但是这不行,因为 CTRL-C
                会撤消整个命令。

                                                        *:hide*
:hid[e]         退出当前窗口,除非这是屏幕上的最后一个窗口。缓冲区被隐藏起来(
                除非还有另一个窗口正在编辑它,或者 'bufhidden' 设置为 "unload"
                或 "delete")。 'hidden' 的值和这个命令没有一点关系。
                对缓冲区的改动既不写入文件,也不会丢失,所以这是个"安全"的命
                令。

:hid[e] {cmd}   执行 {cmd} 并设置 'hidden' 选项。{cmd} 执行完毕后,先前的
                'hidden' 选项会被恢复。
                例如:
                    :hide edit Makefile
                这条命令编辑 "Makefile" 文件,并且如果当前缓冲区有改动的话,隐
                藏之。

CTRL-W o                                                *CTRL-W_o* *E445*
CTRL-W CTRL-O                                   *CTRL-W_CTRL-O* *:on* *:only*
:on[ly][!]      使当前窗口成为屏幕上唯一的窗口。其它窗口都关闭。
                如果设置了 'hidden' 选项,被关闭窗口里的所有缓冲区变成隐藏。
                如果没有设置 'hidden' ,但是设置了 'autowrite' 选项,那么已经
                更改的缓冲区被写入文件。否则,那些包含被修改过的缓冲区的窗口不
                能被关闭,除非使用 [!] 强制关闭。于是缓冲区转入隐藏状态,对缓
                冲区的改动也不会丢失。


4. 把光标移动到另一个窗口 *window-move-cursor*

CTRL-W <Down> *CTRL-W_<Down>* CTRL-W CTRL-J *CTRL-W_CTRL-J* *CTRL-W_j* CTRL-W j 把光标向下移动 N 个窗口。用光标的位置在两个窗口之间做出选择。 CTRL-W <Up> *CTRL-W_<Up>* CTRL-W CTRL-K *CTRL-W_CTRL-K* *CTRL-W_k* CTRL-W k 把光标向上移动 N 个窗口。用光标的位置在两个窗口之间做出选择。 CTRL-W <Left> *CTRL-W_<Left>* CTRL-W CTRL-H *CTRL-W_CTRL-H* CTRL-W <BS> *CTRL-W_<BS>* *CTRL-W_h* CTRL-W h 把光标向左移动 N 个窗口。用光标的位置在两个窗口之间做出选择。 CTRL-W <Right> *CTRL-W_<Right>* CTRL-W CTRL-L *CTRL-W_CTRL-L* *CTRL-W_l* CTRL-W l 把光标向左移动 N 个窗口。 用光标的位置在两个窗口之间做出选择。 CTRL-W w *CTRL-W_w* *CTRL-W_CTRL-W* CTRL-W CTRL-W 如果没有添加计数器,则将光标移动到当前窗口的右/下方的窗口。如 果右下方没有窗口,就移动到左上角的窗口。要是添加了计数器,就移 动到第 N 个窗口(从左上方到右下方依次计数)。窗口号码可以通过 |bufwinnr()| 和 |winnr()| 来获得。 *CTRL-W_W* CTRL-W W 如果没有添加计数器,则将光标移动到当前窗口的左/上方的窗口。如 果左上方没有窗口,就移动到右下角的窗口。要是添加了计数器,就移 动到第 N 个窗口(从左上方到右下方依次计数)。 CTRL-W t *CTRL-W_t* *CTRL-W_CTRL-T* CTRL-W CTRL-T 把光标移动到左上角的窗口。 CTRL-W b *CTRL-W_b* *CTRL-W_CTRL-B* CTRL-W CTRL-B 把光标移动到右下角的窗口。 CTRL-W p *CTRL-W_p* *CTRL-W_CTRL-P* CTRL-W CTRL-P 移动到前一个 (previous)(上次访问的)窗口。 *CTRL-W_P* *E441* CTRL-W P 移动到前一个窗口。如果没有前一个窗口就会出错。 {如果编译时没有加入 |+quickfix| 则不可用} 在"可视"模式(Visual)下,如果窗口编辑的是同一个缓冲区,则光标所选择的区域会 被保留;如果不是同一个缓冲区,则终止"可视"模式。 *:winc* *:wincmd* 这些命令也可以用 ":wincmd" 来执行: :[count]winc[md] {arg}CTRL-W [count] {arg} 相同。例如: :wincmd j 把光标移动到当前窗口下面的窗口。 这个命令在普通模式不可用的时候(比如在 |CursorHold| 自动命 令执行的时候),或者在启用普通模式不方便时,特别好用。 计数器也可以是一个窗口号码。例如: :exe nr . "wincmd w" 这会切换到窗口 "nr"。

5. 窗口的移动 *window-moving*

CTRL-W r *CTRL-W_r* *CTRL-W_CTRL-R* *E443* CTRL-W CTRL-R 向右下方向移动窗口。第一个窗口变成第二个,第二个变成第三个…… 最后一个变成第一个。光标保留在相同窗口里。 本操作只能移动同行或同列的窗口。 *CTRL-W_R* CTRL-W R 向左上方向移动窗口。第一个窗口变成第二个,第二个变成第三个…… 最后一个变成第一个。光标保留在相同窗口里。 本操作只能移动同行或同列的窗口。 CTRL-W x *CTRL-W_x* *CTRL-W_CTRL-X* CTRL-W CTRL-X 若没有计数器:交换当前窗口与下一个窗口。如果没有下一个窗口,则 与前一个窗口交换。 若有计数器:交换当前窗口与第 N 个窗口(第一个窗口为 1 )。 光标被放置在另一个窗口里。 如果既有垂直分割又有水平分割,那么只能与当前窗口同行或者同列的 窗口进行交换。 下面的几个命令可以被用来改变窗口的布局。例如,CTRL-W K 可以把两个垂直分割的窗 口变成水平分割的窗口。CTRL-W H 则正好相反。 *CTRL-W_K* CTRL-W K 把当前窗口放到最顶端,并且是最大宽度。这很像在关闭当前窗口之后, 再用 ":topleft split" 打开一个新的窗口,不过新窗口只包含当前窗 口的内容。 *CTRL-W_J* CTRL-W J 把当前窗口放到最底部,并且是最大宽度。这很像在关闭当前窗口之后, 再用 ":botright split" 打开一个新的窗口,不过新窗口只包含当前 窗口的内容。 *CTRL-W_H* CTRL-W H 把当前窗口放到最左边,并且是最大高度。这很像在关闭当前窗口之后, 再用 ":vert topleft split" 打开一个新的窗口,不过新窗口只包含 当前窗口的内容。 {如果编译时没有加入 +vertsplit 属性则不可用} *CTRL-W_L* CTRL-W L 把当前窗口放到最右边,并且是最大高度。这很像在关闭当前窗口之后, 再用 ":vert botright split" 打开一个新的窗口,不过新窗口只包含 当前窗口的内容。 {如果编译时没有加入 +vertsplit 属性则不可用}

6. 改变窗口的大小 *window-resize*

*CTRL-W_=* CTRL-W = 使得(几乎)所有窗口等宽、等高,但是对当前窗口使用 'winheight' 和 'winwidth' 来设置。 :res[ize] -N *:res* *:resize* *CTRL-W_-* CTRL-W - 使得当前窗口高度减 N (默认值是 1)。 如果在 'vertical' 之后使用,则使得宽度减 N 。 :res[ize] +N *CTRL-W_+* CTRL-W + 使得当前窗口高度加 N (默认值是 1)。 如果在 'vertical' 之后使用,则使得宽度加 N 。 :res[ize] [N] CTRL-W CTRL-_ *CTRL-W_CTRL-_* *CTRL-W__* CTRL-W _ 设置当前窗口的高度为 N (默认值为可能的最大值)。 z{nr}<CR> 设置当前窗口的高度为 {nr}*CTRL-W_<* CTRL-W < 使得当前窗口宽度减 N (默认值是 1)。 *CTRL-W_>* CTRL-W > 使得当前窗口宽度加 N (默认值是 1)。 :vertical res[ize] [N] *:vertical-resize* *CTRL-W_bar* CTRL-W | 设置当前窗口的宽度为 N (默认值为可能的最大值)。 你也可以用鼠标上下拖动水平分割栏来改变窗口的高度,或者左右拖动垂直分割栏来改变 窗口宽度。这些功能只有在支持鼠标的版本里,并且设置了 'mouse' 选项才可以用。 选项 'winheight' ('wh') 用来设置当前窗口的最小高度。每当其它窗口变为当前窗口的 时候,这一选项就会生效。如果设置为 0 ,则禁用。把 'winheight' 设一个很大的值, 例如,'9999',就使得当前窗口永远占据尽可能大的空间。尽量设置成一个编辑时比较 舒服的值,比如说, '10' 就是一个合理的值。 同样,'winwidth' ('wiw') 选项设定了当前窗口的最小宽度。 如果设置了 'equalalways' ('ea') 选项,在分割或者关闭窗口之后,所有窗口都会变为 相同大小。如果你没有设置这个选项,分割窗口时只会减少当前窗口的大小,而其它窗口 保持不变。当关闭窗口时,多出来的行会被上面的窗口占用。 选项 'eadirection' 用来限制 'equalalways' 的作用方向。默认值是 "both" ,两个方 向都改变。当设置为 "ver" 时,只限制所有窗口的高度必须相同,这样你可以自己调节 窗口的宽度。同样,"hor" 使得窗口的宽度都相等。 选项 'cmdheight' ('ch') 用来设置命令行的高度。如果你对 |hit-enter| 的提示信息 感到厌烦,可以将它设置为 2 或 3 。 如果只有一个窗口,那么改变该窗口大小的同时也会改变命令行的高度。如果有多个窗口, 那么改变当前窗口的大小也会改变它下面的窗口(有时是上面的窗口)的高度。 一个窗口的最小高度和最小宽度可以用 'winminheight' 和 'winminwidth' 设定。这是 硬性值,一旦设定,窗口的高度(或宽度)将不能小于该值。

7. 参数和缓冲区的列表命令 *buffer-list*

参数列表 缓冲区列表 含义 1. :[N]argument [N] 11. :[N]buffer [N] 切换至第 N 号参数/缓冲区 2. :[N]next [file ..] 12. :[N]bnext [N] 切换至向后数第 N 个参数/缓冲区 3. :[N]Next [N] 13. :[N]bNext [N] 切换至向前数第 N 个参数/缓冲区 4. :[N]previous [N] 14. :[N]bprevious [N] 切换至向前数第 N 个参数/缓冲区 5. :rewind / :first 15. :brewind / :bfirst 切换至第一个参数/缓冲区 6. :last 16. :blast 切换至最后一个参数/缓冲区 7. :all 17. :ball 编辑所有的参数/缓冲区 18. :unhide 编辑所有已载入的缓冲区 19. :[N]bmod [N] 切换至第 N 个已修改的缓冲区 分割 & 参数列表 分割 & 缓冲区列表 含义 21. :[N]sargument [N] 31. :[N]sbuffer [N] 分割 + 切换至第 N 号参数/缓冲区 22. :[N]snext [file ..] 32. :[N]sbnext [N] 分割 + 切换至向后数第 N 个参数/缓冲区 23. :[N]sNext [N] 33. :[N]sbNext [N] 分割 + 切换至向前数第 N 个参数/缓冲区 24. :[N]sprevious [N] 34. :[N]sbprevious [N] 分割 + 切换至向前数第 N 个参数/缓冲区 25. :srewind / :sfirst 35. :sbrewind / :sbfirst 分割 + 切换至第一个参数/缓冲区 26. :slast 36. :sblast 分割 + 切换至最后一个参数/缓冲区 27. :sall 37: :sball 编辑所有的参数/缓冲区 38. :sunhide 编辑所有已载入的缓冲区 39. :[N]sbmod [N] 分割 + 切换至第 N 个已修改的缓冲区 40. :args 显示参数列表 41. :buffers 显示缓冲区列表 上述命令中的 [N] 的含义取决于你使用的命令: [N] 在命令 ?2,?3,和 ?4 中是向前/向后的个数。 [N] 在命令 1 和 21 中是参数号码,默认值是当前参数。 [N] 在命令 11 和 31 中是缓冲区号码,默认值是当前缓冲区。 [N] 在命令 19 和 39 中计数器。 备注: ":next" 是一个例外,因为它必须以文件名列表为参数,这是为了和 Vi 兼容。 参数列表和多窗口


每一个窗口所编辑的文件可能位于参数列表的不同位置。记住!当 ":e file" 一个文件
时,你在参数列表中的位置没有变化,但你并不是在编辑处于那个位置的文件。为了说明
这一点,文件消息(和标题栏,如果有的话)会显示 "(file (N) of M)","(N)" 是当前
文件在列表中的位置,"M" 是列表中文件的数量。

所有参数列表中的条目都被加载到缓冲区列表中,这样你也可以用缓冲区列表的命令进行
操作,比如 ":bnext" 。

:[N]al[l][!] [N]                                *:al* *:all* *:sal* *:sall*
:[N]sal[l][!] [N]
                重新整理屏幕,为每一个参数打开一个窗口。其它窗口统统关闭。如果
                使用了计数器,则其数值为窗口数目的最大值。
                如果设置了 'hidden',所有要关闭的窗口变为隐藏。
                如果没有设置 'hidden',但是设置了 'autowrite' ,那么所有改动
                的缓冲区被写入文件。否则,包含更改过的缓冲区的窗口不会被删除,
                除非你用 [!] 使它们隐藏。更改过的缓冲区永远不会被丢弃,所以改
                动不会丢失。
                [N] 是最大可以打开的窗口数。'winheight' 也限制打开的窗口数。
                (如果前加了 |:vertical| 的话 'winwidth')。
                Buf/Win Enter/Leave 自动命令不会被这里的新窗口执行,只有在它
                们真正进入时才会执行。

:[N]sa[rgument][!] [++opt] [+cmd] [N]                   *:sa* *:sargument*
                这是 ":split | argument [N]" 命令的简写。分割窗口并切换至第 N
                号参数。但是如果该参数不存在,窗口也不会分割。参见 |++opt| 和
                |+cmd| 。

:[N]sn[ext][!] [++opt] [+cmd] [file ..]                 *:sn* *:snext*
                这是 ":split | [N]next" 命令的简写。 分割窗口并切换到向后数第
                N 个参数。 但是如果该参数不存在,窗口也不会分割。参见 |++opt|
                和 |+cmd| 。

:[N]spr[evious][!] [++opt] [+cmd] [N]                   *:spr* *:sprevious*
:[N]sN[ext][!] [++opt] [+cmd] [N]                       *:sN* *:sNext*
                这是 ":split | [N]Next" 命令的简写。 分割窗口并切换到向前数第
                N 个参数。 但是如果该参数不存在,窗口也不会分割。参见 |++opt|
                和 |+cmd| 。

                                                *:sre* *:srewind*
:sre[wind][!] [++opt] [+cmd]
                这是 ":split | rewind" 命令的简写。分割窗口并切换到第一个参数。
                但是如果没有参数列表,窗口不会分割。参见 |++opt| 和 |+cmd| 。

                                                *:sfir* *:sfirst*
:sfir[st [++opt] [+cmd]
                与 ":srewind" 相同。

                                                *:sla* *:slast*
:sla[st][!] [++opt] [+cmd]
                这是 ":split | rewind" 命令的简写。分割窗口并切换到最后一个参
                数。 但是如果没有参数列表,窗口不会分割。参见 |++opt| 和
                |+cmd| 。
                                                *:dr* *:drop*
:dr[op] {file} ..
                在一个窗口内编辑第一个 {file}。
                - 如果该文件已经被打开,切换至该文件所在窗口。
                - 如果该文件尚未被打开,在当前窗口内打开该文件。如果当前窗口
                   无法被放弃 |abandon|,窗口会先被分割。
                参数列表 |argument-list| 会被象使用 |:next| 命令一样被设定。
                此命令的目的在于:允许 debugger 之类的程序里让 Vim 编辑另一个文件。
                {只有在编译时加入 +gui 才可用}


8. 在所有的缓冲区和窗口里执行命令 *list-repeat*

*:windo* :windo[!] {cmd} 在每一个窗口里执行 {cmd} 。 这就像是: CTRL-W t :{cmd} CTRL-W w :{cmd} etc. 等等…… 如果在一个窗口里检测到错误,余下的窗口没有被访问到。最后 一个窗口(或者出错的那个窗口)会变为当前窗口。 {cmd} 可以包含 '|' 来连接多个命令。 {cmd} 不能打开或关闭窗口,也不能重新装载它们。 {Vi 不可用} {若编译时没有加入 |+listcmds| 则不可用} 也参见 |:argdo| 和 |:bufdo|. *:bufdo* :bufdo[!] {cmd} 在每一个缓冲区里执行 {cmd}。 就像是: :bfirst :{cmd} :bnext :{cmd} 等等…… 如果当前文件不能被丢弃 |abandon|,并且没有使用[!],命令 会失败。 当在一个缓冲区里检测到错误,剩下的缓冲区不会被访问。 没有在列表里出现的缓冲区被略过。 最后一个缓冲区(或者出错的那个缓冲区)将变为当前缓冲区。 {cmd} 可以包含 '|' 来连接多个命令。 {cmd} 不能删除或添加缓冲区。 备注: 当这个命令正在执行的时候,自动命令的语法事件可以 通过 'eventignore' 禁止。这样会加快编辑缓冲区的速度。 {Vi 不可用} {若编译时没有加入 |+listcmds| 则不可用} 参见 |:argdo| 和 |:windo| 。 例子: :windo set nolist nofoldcolumn | normal zn 这个命令会复位 'list' 选项并在所有的窗口里关闭折叠功能。 :bufdo set fileencoding= | update 此命令在每个缓冲区里复位 'fileencoding' 选项的值,并将改动的缓冲区存盘。结果是所 有的缓冲区用 'encoding' 编码(如果执行顺利的话)。

9. 当前光标处的标签和文件名 *window-tag*

*:sta* *:stag* :sta[g][!] [tagname] 执行 ":tag[!] [tagname]" 并且分割窗口打开新的标记。参见 |:tag|。 CTRL-W ] *CTRL-W_]* *CTRL-W_CTRL-]* CTRL-W CTRL-] 把当前窗口一分为二,把光标所位置的标识符当作标记,并跳转至标记 所指向的地方。新窗口(上面的窗口)的高度为 N。 *CTRL-W_g]* CTRL-W g ] 把当前窗口一分为二,把光标所位置的标识符当作标记,并在新窗口( 上面的窗口)里执行 ":tselect" 。新窗口的高度为 N 。 *CTRL-W_g_CTRL-]* CTRL-W g CTRL-] 把当前窗口一分为二,把光标所位置的标识符当作标记,并在新窗口( 上面的窗口)里执行 ":tjump" 。新窗口的高度为 N 。 CTRL-W f *CTRL-W_f* *CTRL-W_CTRL-F* CTRL-W CTRL-F 把当前窗口一分为二。编辑光标下的文件名。 类似 ":split ]f",但是找不到文件或者文件不存在时,不会分割窗口。 此操作在 'path' 变量所定义的目录和当前文件所在的目录里寻找文件。 如果是一个类似 "type://machine/path" 的超链接,那么只使用 "/path"。 如果指定了计数器 N ,那么编辑第 N 个匹配的文件。 {如果 |+file_in_path| 在编译时被禁用,则不可用} 参见 |CTRL-W_CTRL-I|:为包含文件打开一个窗口(该文件包含当前光标下的关键字)。

10. 预览窗口 *preview-window*

预览窗口是预览其它文件的特殊窗口。它通常是一个用来查看包含文件或者函数定义的小 窗口。 {若编译时未加入 |+quickfix| 属性,则不可用} 只能有一个预览窗口,可以用如下命令之一创建。选项 'previewheight' 可以用来指定 预览窗口的高度;选项 'previewwindow' 会在预览窗口内被设定以便区分。 'winfixheight' 选项也被设定用来保持该窗口的高度不受其它窗口的影响。 *:pta* *:ptag* :pta[g][!] [tagname] 执行 ":tag[!] [tagname]" 并且在预览窗口里显示标签所指向的内容。 不改变当前缓冲区和光标的位置。如果预览窗口已经打开,则会被再 次使用(类似于帮助窗口)。如果是打开一个新的预览窗口,那么其高 度由 'previewheight' 决定。也参见 |:tag| 。参考下面的例子。 |CursorHold-example| 与 |:tag| 有细小的差别: 当 [tagname] 与当前显示的标记相同时, 该命令不会重置"标记匹配列表"的当前位置。这使得在执行完 |:ptnext| 后,|CursorHold-example| 仍可以运行。 CTRL-W z *CTRL-W_z* CTRL-W CTRL-Z *CTRL-W_CTRL-Z* *:pc* *:pclose* :pc[lose][!] 关闭当前打开的预览窗口。如果设置了 'hidden' ,或者更改了缓冲区 并且使用了 [!],则缓冲区变为隐藏(除非还有其它窗口正在编辑该 缓冲区)。如果预览窗口的缓冲区不能关闭,此命令失败。也参见 |:close|. *:pp* *:ppop* :[count]pp[op][!] 在预览窗口执行 ":[count]pop[!]" 。参见 |:pop| 和 |:ptag| 。 {Vi 没有此功能} CTRL-W } *CTRL-W_}* 使用当前光标所处位置的标识符作为标签,执行 :ptag 。生成预览窗 口(如果需要的话),窗口的高度为 N,如果没指定高度,就使用 'previewheight' 的值。 CTRL-W g } *CTRL-W_g}* 使用当前光标所处位置的标识符作为标签,执行 :ptjump 。生成预览 窗口(如果需要的话),窗口的高度为 N,如果没指定高度,就使用 'previewheight' 的值。 *:ped* *:pedit* :ped[it][!] [++opt] [+cmd] {file} 在预览窗口里编辑文件 {file} 。预览窗口就像是用 |:ptag| 命令打 开的。当前窗口和光标的位置都不改变。一个有用的例子: :pedit +/fputc /usr/include/stdio.h *:ps* *:psearch* :[range]ps[earch][!] [count] [/]pattern[/] 与 |:ijump| 命令很像,只是找到匹配的在预览窗口显示。预览窗口用 |:ptag| 打开。 当前窗口和光标的位置都不改变。有用的例子: :psearch popen 这很像 |:ptag| 命令,你可以用它自动显示光标所在单词的相关信息。 这个命令虽然不如 |:ptag| 强大,但是你可以不使用标记文件,而且 它也可以找到一些系统的头文件。例如: :au! CursorHold *.[ch] nested exe "silent! psearch " . expand("<cword>") 警告:可能会很慢。 例子 *CursorHold-example* :au! CursorHold *.[ch] nested exe "silent! ptag " . expand("<cword>") 这条命令以当前光标位置处的关键字为参数,执行 ":ptag" 命令。'updatetime' 指定了 光标停留的时间;"nested" 使得自动命令得以执行,这样可以在预览窗口里启用语法加 亮。"silent!" 屏蔽了在找不到标签时产生的错误信息。也参见 |CursorHold| 。要禁用 此功能: :au! CursorHold 另一个比较好用的功能是加亮已经找到的标签,这样可以避免对光标处没有定义的单词执 行 ":ptag",和一些别的东西: :au! CursorHold *.[ch] nested call PreviewWord() :func PreviewWord() : if &previewwindow " 不要在预览窗口里执行 : return : endif : let w = expand("<cword>") " 在当前光标位置抓词 : if w =~ '\a' " 如果该单词包括一个字母 : : " 在显示下一个标签之前,删除所有现存的语法加亮 : silent! wincmd P " 跳转至预览窗口 : if &previewwindow " 如果确实转到了预览窗口…… : match none " 删除语法加亮 : wincmd p " 回到原来的窗口 : endif : : " 试着显示当前光标处匹配的标签 : try : exe "ptag " . w : catch : return : endtry : : silent! wincmd P " 跳转至预览窗口 : if &previewwindow " 如果确实转到了预览窗口…… : if has("folding") : silent! .foldopen " 展开折叠的行 : endif : call search("$", "b") " 到前一行的行尾 : let w = substitute(w, '\\', '\\\\', "") : call search('\<\V' . w . '\>') " 把光标放置匹配的单词上 : " 在此位置对匹配的单词加亮 : hi previewWord term=bold ctermbg=green guibg=green : exe 'match previewWord "\%' . line(".") . 'l\%' . col(".") . 'c\k*"' : wincmd p " 返回原来的窗口 : endif : endif :endfun

11. 使用隐藏的缓冲区 *buffer-hidden*

隐藏的缓冲区已经载入内存,但是不会显示在窗口里。这使得 Vim 每次从一个文件切换 到另一个文件时,不必频繁地读写磁盘。 {若编译时没加入 |+listcmds| ,则不可用} *:buffer-!* 如果设置了 'hidden' ('hid'),那么被丢弃的缓冲区会记忆你在 ":edit", ":next", ":tag",等命令之后进行的所有操作。虽然有时没有设置 'hidden',但是有一些作用于 缓冲区列表的命令还是会把当前窗口变为隐藏。这种情况发生在:当 'autowrite' 选项 是关闭的或者缓冲区不可保存时,你试图用 '!' 强制删除一个修改过的缓冲区窗口。 你可以用任何编辑命令使隐藏的缓冲区不再隐藏。或者用 ":bdelete" 命令将其删除。 'hidden' 是全局选项, 它作用于所有的缓冲区。'bufhidden' 选项可以作用于指定的缓 冲区,该选项可以是下面的值: <empty> 使用 'hidden' 的值。 hide 隐藏该缓冲区,也适合于 'hidden' 没有设置的情况。 unload 不隐藏,而是卸载该缓冲区,也适合于设置了 'hidden' 的情 况。 delete 删除该缓冲区。 *hidden-quit* 如果存在一个隐含的,并且被修改过的缓冲区,若此时退出 Vim 会得到一条错误信息, 并且 Vim 会把该缓冲区变为当前的缓冲区。你可以决定是保存(":wq")还是退出( ":q!")。注意:可能不止一个隐藏的并且已被修改的缓冲区! 缓冲区也可能是非列表的(unlisted),这意味着此缓冲区存在,但是从缓冲区列表中看 不到。|unlisted-buffer| :files[!] *:files* :buffers[!] *:buffers* *:ls* :ls[!] 显示所有缓冲区。例如: 1 #h "/test/text" line 1 2u "asdf" line 0 3 %l+ "version.c" line 1 如果使用了 [!],将显示所有的缓冲区,包括非列表的缓冲区。( "unlisted" "非列表"这一术语有点儿别扭……)。 每一个缓冲区都有唯一的号码与之对应。这个号码是不会改变的,所以 你可以一直使用 ":buffer N" 或 "N CTRL-^" (N 是缓冲区号码)来 选择特定的缓冲区。 标识符号(同一列上的符号不可能同时出现): u 非列表缓冲区(只有使用 [!] 才能看到)|unlisted-buffer| % 当前窗口里的缓冲区 # 用 ":e #" 或 CTRL-^ 可切换到该缓冲区 a 激活的缓冲区:已载入内存并且可见 h 隐藏的缓冲区:已载入内存但是没有窗口显示它 |hidden-buffer| - 不可更改的缓冲区,选项 'modifiable' 被关闭。 = 只读缓冲区 + 被更改的缓冲区 x 一个有读错误的缓冲 *:bad* *:badd* :bad[d] [+lnum] {fname} 在缓冲区列表里添加一个文件名 {fname} ,但是不把该文件载入内存。 如果指定了 "lnum" ,那么第一次进入缓冲区时,光标会停留在那一行。 注意 + 后面的其它命令将被忽略。 :[N]bd[elete][!] *:bd* *:bdel* *:bdelete* *E516* :bd[elete][!] [N] 卸载缓冲区 [N] (默认:当前窗口)并且从缓冲区列表里删除该缓冲 区。如果缓冲区被改动过,那么该命令将失败,除非使用[!] ,但是这 样所有的改动都会丢失。文件和 Vim 失去联系。打开该文件的所有窗 口都会关闭。如果缓冲区 [N] 是当前的缓冲区,那么 Vim 会显示另一 个缓冲区来替代它。Vim 会选择列表中距离最近的一个装入缓冲区。 实际上,该缓冲区没有被完全从缓冲区列表 |unlisted-buffer| 里删除。该缓冲区中选项的值、变量、映射和缩写被清空。 :bdelete[!] {bufname} *E93* *E94* 类似 ":bdelete[!] [N]",但是使用名字指定缓冲区。 注意 如果缓冲区名字是数字的,不能用该命令引用;用号码代替。如 果名字里含有空格,在空格前插入反斜杠。 :bdelete[!] N1 N2 ... 对缓冲区 N1,N2,…… 执行 ":bdelete[!]"。 参数可以是名字或号码(但是名字里不能含有数字)。 如果名字里含有空格,在空格前插入反斜杠。 :N,Mbdelete[!] 对 N 号到 M 号(包含 N 和 M |inclusive|)缓冲区执行 ":bdelete[!]" :[N]bw[ipeout][!] *:bw* *:bwipe* *:bwipeout* *E517* :bw[ipeout][!] {bufname} :N,Mbw[ipeout][!] :bw[ipeout][!] N1 N2 ... 类似 ":bdelete",真正删除缓冲区。所有标记失效,选项丢失,等等。 除非你确切地知道自己正在做什么,否则不要使用这个命令。 :[N]bun[load][!] *:bun* *:bunload* *E515* :bun[load][!] [N] 卸载缓冲区 [N] (默认:当前缓冲区)。原来占用的内存将被释放该 缓冲区还保留在缓冲区列表里如果缓冲区被改动过,那么该命令将失败, 除非使用[!] ,但是这样所有的改动都会丢失。如果缓冲区 [N] 是当 前的缓冲区,那么 Vim 会显示另一个缓冲区来替代它。Vim 会选择列 表中距离最近的一个装入缓冲区。 :bunload[!] {bufname} 类似 ":bunload[!] [N]", 但是使用名字指定缓冲区。 注意 如果缓冲区名字是数字的,不能用该命令引用;用号码代替。如 果名字里含有空格,在空格前插入反斜杠。 :N,Mbunload[!] 对 N 号到 M 号(包含 N 和 M |inclusive|)缓冲区执行 ":bunload[!]" :bunload[!] N1 N2 ... 对缓冲区 N1,N2,…… 执行 ":bunload[!]" 。 参数可以是名字或号码(但是名字里不能含有数字)。 如果名字里含有空格,在空格前插入反斜杠。 :[N]b[uffer][!] [N] *:b* *:bu* *:buf* *:buffer* *E86* 编辑列表中的缓冲区 [N],如果没指定 [N] ,就编辑当前的缓冲区。 对于 [!] 参见 |:buffer-!|。这个命令同样可以编辑不在列表里的缓 冲区,而无需设置 'buflisted' 。 :[N]b[uffer][!] {filename} 编辑列表中的缓冲区 {filename}。对于 [!] 参见 |:buffer-!|。这 个命令同样可以编辑不在列表里的缓冲区,而无需设置 'buflisted'。 :[N]sb[uffer] [N] *:sb* *:sbuffer* 分割窗口编辑列表中的缓冲区 [N] ,如果没指定 [N] ,就编辑当前的 缓冲区。分割窗口的时候要看 'switchbuf' 是不是设置了 "useopen" 。这个命令同样可以编辑不在列表里的缓冲区,而无需设置 'buflisted'。 :[N]sb[uffer] {filename} 分割窗口编辑列表中的缓冲区 {filename}。这个命令同样可以编辑不 在列表里的缓冲区,而无需设置 'buflisted' 。 *:bn* *:bnext* *E87* :[N]bn[ext][!] [N] 前进至后面的第 [N] 个缓冲区。 [N] 默认是 1 。如果到了缓冲区列 表的末尾,则从头循环。对于 [!] 参见 |:buffer-!| 如果你在帮助文件缓冲区里,这条命令让你跳到下一个帮助缓冲区(如 果有的话)。同样,你在一个正常(非帮助)缓冲区里,就会使你跳到 下一个正常缓冲区。这样是为了在打开帮助的时候不会影响到浏览正常 的代码或文本。下面的命令都是这样。 *:sbn* *:sbnext* :[N]sbn[ext] [N] 分割窗口前进至后面的第 [N] 个缓冲区。 如果到了缓冲区列表的末尾,则从头循环。使用 'switchbuf' :[N]bN[ext][!] [N] *:bN* *:bNext* *:bp* *:bprevious* *E88* :[N]bp[revious][!] [N] 到前面的第 [N] 个缓冲区。 [N] 默认是 1 。 如果到了缓冲区列表的顶端,则从末尾循环。对于 [!] 参见 |:buffer-!| 和 'switchbuf' 。 :[N]sbN[ext] [N] *:sbN* *:sbNext* *:sbp* *:sbprevious* :[N]sbp[revious] [N] 分割窗口并前进到前面的第 [N] 个缓冲区。 [N] 默认是 1 。 如果到了缓冲区列表的顶端,则从末尾循环。对于 [!] 参见 |:buffer-!| 和 'switchbuf' 。 *:br* *:brewind* :br[ewind][!] 前进到缓冲区列表中的第一个缓冲区。 如果列表为空,则转到第一个非列表缓冲区。对于 [!] 参见 |:buffer-!| *:bf* *:bfirst* :bf[irst 与 ":brewind" 相同。 *:sbr* *:sbrewind* :sbr[ewind] 分割窗口并前进到缓冲区列表中的第一个缓冲区。 如果列表为空,则转到第一个非列表缓冲区。对于 [!] 参见 |:buffer-!| 还需考虑 'switchbuf' 选项。 *:sbf* *:sbfirst* :sbf[irst] 与 ":sbrewind" 相同。 *:bl* *:blast* :bl[ast][!] 前进到缓冲区列表中的最后一个缓冲区。 如果列表为空,则转到最后一个非列表缓冲区。对于 [!] 参见 |:buffer-!| 还需考虑 'switchbuf' 选项。 *:sbl* *:sblast* :sbl[ast] 分割窗口并前进到缓冲区列表中的最后一个缓冲区。 如果列表为空,则转到最后一个非列表缓冲区。对于 [!] 参见 |:buffer-!| 还需考虑 'switchbuf' 选项。 :[N]bm[odified][!] [N] *:bm* *:bmodified* *E84* 前进至第 [N] 个修改过的缓冲区。 备注: 这一命令同样也能找到非 列表缓冲区。如果没有修改的缓冲区,此命令失败。 :[N]sbm[odified] [N] *:sbm* *:sbmodified* 分割窗口并前进至第 [N] 个修改过的缓冲区。 还需考虑 'switchbuf' 选项。 备注: 这个命令也能找到不在列表里的缓冲区。 :[N]unh[ide] [N] *:unh* *:unhide* *:sun* *:sunhide* :[N]sun[hide] [N] 重新排列窗口,给列表中的每一个载入的缓冲区打开一个窗口。如果设 置了计数器,则计数器指定的数目为打开窗口的最多数目。 :[N]ba[ll] [N] *:ba* *:ball* *:sba* *:sball* :[N]sba[ll] [N] 重新排列窗口,给列表中的每一个缓冲区打开一个窗口。如果设置了计 数器,则计数器指定的数目为打开窗口的最多数目。''winheight' 也 限制了打开窗口的数目(当前缀 |:vertical| 时 'winwidth' 也类似) Buf/Win Enter/Leave 不会在新窗口执行,只会在真正进入窗口时才会执行。 备注: 上面所有的命令在编辑另一个缓冲区的时候,总是保持 'readonly' 不变。这和 ":edit" 命令不同,它每次都会设置 'readonly' 。

12. 特殊类型的缓冲区 *special-buffers*

除了用来存放文本,缓冲区也可以用于其它目的。一些选项可以改变缓冲区的行为: 'bufhidden' 缓冲区不再在窗口里显示 'buftype' 缓冲区的类型 'swapfile' 缓冲区是否需要交换文件 'buflisted' 缓冲区是否在缓冲区列表中出现 有用的缓冲区类型: quickfix 用来存放错误列表。参见 |:cwindow|。该命令设置 'buftype' 的值为 "quickfix" 。你不应该修改它。'swapfile' 为关。 help 包含帮助文件。只能用 |:help| 命令创建,缓冲区的帮助标志是内置 的,不能被更改。选项 'buflisted' 在帮助缓冲区里将被重置。 directory 显示目录内容。应用于 |file-explorer| 插件。该缓冲区由以下设置 创建: :set buftype=nowrite :set bufhidden=delete :set noswapfile 缓冲区的名字就是目录的名字,并且在使用 |:cd| 命令时会作出相应 的调整。 scratch 该缓冲区包含的文本可以被随时扔掉。在关闭窗口时,它被保存下来, 并且必须被明确地删除。 设置: :set buftype=nofile :set bufhidden=hide :set noswapfile 缓冲区的名字可以用来标识缓冲区。 *unlisted-buffer* unlisted 该缓冲区不在缓冲区列表里。它不能用来编辑,但是可以显示帮助文件, 记录文件名或标记。":bdelete" 命令也会设置这个选项,这样就不会 完全地删除该缓冲区。设置: :set nobuflisted vim:tw=78:ts=8:ft=help:norl:

Generated by vim2html on 2006年 06月 24日 星期六 00:27:59 UTC