Vim之窗口高级操作

皮贝贝 发表于 2008-06-23 10:15:15

*windows.txt*   版本: Vim version 7.1.  上次修改日期: 2007 Mar 17


                  VIM REFERENCE MANUAL    


同多窗口一块儿工作.                             *windows* *buffers*

关于窗口和缓冲区的更多操作命令在这里介绍。另外,还给出了不同工作环境下多窗口
的详细说明。

更多此主题的基本操作命令请参考$vimruntime/doc文件夹下的 |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 没有提供这些命令}
{not :  编译时未指定|+windows| 选项,将无法使用这些命令}
{not : 编译时未指定|+vertsplit| 选项,将无法使用垂直方式分割窗口}

==============================================================================
1. 概述                                         *windows-intro* *window*

一个窗口是一个建立在缓冲区的视图。你可以用多个窗口显示一个缓冲区,也可以用多个
窗口显示不同的缓冲区。

一个缓冲区可以有3种状态:*active-buffer* ,*hidden-buffer* , *inactive-buffer*
具体见下表:

状态            显示在窗口      加载文件        ":buffers"命令  ~

active            是             是               'a'
hidden            否             是               'h'
inactive          否             否               ' '

Note: 所有 CTRL-W 命令与|:wincmd|具有同等执行效力。不过正常模式下的命令在
有些地方不能使用,或不方便。

VIm的主窗口可以分成许多窗口。当然VIm7中也提供了|tab-page|,每一个
|tab-page|也具有分割窗口的能力。

==============================================================================
2. 启动 Vim                                             *windows-starting*

默认情况下,Vim是一个窗口,就像vi。

Vim的参数 "-o" 和 "-O" 用来为参数列表中的每个文件打开一个窗口。
"-o" -----      把窗口水平(horizontally)分割。
"-O" -----      把窗口垂直(vertically)分割.
若"-o"与"-O"共同给出,则由最末的参数来决定窗口分割方式。
例如,我们以水平分割方式打开3个窗口: >
        vim -o file1 file2 file3


"-oN" -----     其中 N 是一个十进制数,用来打开 N 个水平方式分割的窗口。
                若文件数量大于 N , 则只有 N 个窗口打开,一些文件没有显示在
                窗口中。
                若文件数量小于 N , 则最末的几个窗口将会显示空的缓冲区。
同样的,"-ON" 打开 N 个垂直方式分割的窗口,其他限制条件同 "-oN" .


若有许多文件, 窗口会变得非常小。你可以设置 'winheight' 和 'winwidth' 选项
来创建一个舒适的工作环境。


Buf/Win Enter/Leave |autocommand|s (这些自动化命令)并不会在打开一个新窗口
查看文件时执行,它们将只会在显示键入时才会执行。
                                                        *status-line*
分割线被用来分割窗口。 'laststatus' 选项告诉我们最末的窗口何时会有分割线:
        'laststatus' = 0       总是不显示分割线
        'laststatus' = 1       多于一个窗口时显示分割线
        'laststatus' = 2       总是显示分割线

你可以通过 'statusline' 选项来更改分割线的内容。此选项可以对每个窗口定制,
这样你可以在每个窗口中显示不同的分割线。


通常分割线可以用来反转显示。 这可以在 'option' 选项里通过改变字符 's' 来实
现。  例如,"sb" 会将其设置为加宽字符。 若高亮设置中没有设置分割线 ("sn"),
当前窗口将会使用字符 '^',其他窗使用字符 '=' 。若支持鼠标,且 'mouse' 选项
启用,那么可以拖曳分割线以调整窗口大小。

Note: 若希望分割线以反色显示,但没有效果。
检查 'highlight' 选项中是否包含 "si", 在 3.0 版本中,这表示反转分割线。现在
应该是 "sr" ,因为 "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 (缺省大小是当前窗口高度的一半)。
                当前窗口降低自己高度来为新窗口腾出空间。
                Note: 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" ,窗口会按照水平方式展开,
                除非宽度被指定。
                Note: 在某些地方 CTRL-Q 等同于 CTRL-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| 和 |+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 个缓冲区。

Note  'splitbelow' 和 'splitright' 选项影响新窗口出现的位置。

                                                *:vert* *:vertical*
:vert[ical] {cmd}
                执行命令 {cmd}。若其中含有分割窗口命令,将会按垂直方式分割。
                不能工作在 |:execute| 和 |:normal|模式下。

:lefta[bove] {cmd}                              *:lefta* *:leftabove*
:abo[veleft] {cmd}                              *:abo* *:aboveleft*
                执行命令 {cmd}。若其中含有分割窗口命令,窗口会显示在当前窗口的
                左部(垂直方式)或是顶部(水平方式).
                自动调用使用 'splitbelow' 和 'splitright'工作。
                不能工作在 |:execute| 和 |:normal|模式下。

:rightb[elow] {cmd}                             *:rightb* *:rightbelow*
:bel[owright] {cmd}                             *:bel* *:belowright*
                执行命令 {cmd}。若其中含有分割窗口命令,窗口会显示在当前窗口的
                右部(垂直方式)或是底部(水平方式).
                自动调用使用 'splitbelow' 和 'splitright'工作。
                不能工作在 |:execute| 和 |:normal| 模式下。

                                                *:topleft* *E442*
:to[pleft] {cmd}
                执行命令 {cmd}。 若其中含有分割窗口命令,窗口会显示在当前窗口的
                最顶部,并将宽度设置整个Vim窗口的宽度。
                若是垂直分割,则窗口显示在最左侧,并将其高度设置为整个Vim窗口的
                高度。
                不能工作在 |:execute| 和 |:normal| 模式下。

                                                *:botright*
:bo[tright] {cmd}
                执行命令 {cmd}。 若其中含有分割窗口命令,窗口会显示在当前窗口的
                最底部,并将宽度设置整个Vim窗口的宽度。
                若是垂直分割,则窗口显示在最右侧,并将其高度设置为整个Vim窗口的
                高度。
                不能工作在 |:execute| 和 |:normal| 模式下。

这些命令修饰符可以结合使用来打开一个垂直分割且占据最大高度的窗口。如: >
        :vertical topleft edit tags
|T赩im窗口的最左侧打开一个垂直分割,全屏幕高度的窗口,编辑 "tags" 文件。


关闭窗口
----------------

CTRL-W q                                                *CTRL-W_q*
CTRL-W CTRL-Q                                           *CTRL-W_CTRL-Q*
:q[uit]         关闭当前窗口。当关闭最末一个窗口时(不包含 help
                窗口),将推出Vim关闭当前窗口。当关闭最末一个窗口时(不包含 help。
                当设置 'hidden' 时,并且当前缓冲区只对应一个窗口,则此窗口将被隐藏。
                当没有设置 'hidden' 时,并且当前缓冲区只对应一个窗口,若缓冲区被
                修改时,此命令无效。`
                
                
                
                (Note: CTRL-Q 可能不适用于所有终端)

:q[uit]!        关闭当前窗口。当关闭一个缓冲区的最末一个窗口时,此缓冲区的所有修改
                将丢失。
                当关闭最末一个窗口(不包口 help窗口)时,将推出Vim。
                缓冲区所有内容将丢失,甚至 'hidden' 被设置。

CTRL-W c                                        *CTRL-W_c* *:clo* *:close*
:clo[se][!]     关闭当前窗口。当设置 'hidden' 选项,或缓冲区被修改且使用 [!]
                , 缓冲区将变成隐藏状态( 除非有另外的窗口在编辑改缓冲区)
                当当前tab页只有一个窗口,并且还存在其他的tab页,此命令将会关
                闭当前的tab页。
                |tab-page|.
                此命令调用失败的情形:                          *E444*
                - 屏幕上只有一个窗口
                - 没有设置 'hidden' ,也没有使用 [!] ,缓冲区被修改,并且当前
                  缓冲区再没有其他的窗口。
                对缓冲区的修改没有被写入,也没有丢失,故此命令是一个 "安全" 的
                命令。

CTRL-W CTRL-C                                           *CTRL-W_CTRL-C*
                你可能想用 CTRL-W CTRL-C 来关闭当前窗口,但没有用因为 CTRL-C 
                会撤销整个命令。

                                                        *:hide*
:hid[e]         退出当前窗口,除非这是屏幕上最后一个窗口。缓冲区变为隐藏状态(
                除非存在另外的窗口正在编辑它,或 'bufhidden' 设置为 "unload"
                或 "delete")。
                若该窗口是当前tab页的最后一个时,关闭改tab页。 |tab-page|
                选项 '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   转至上一个(最后修改的)的窗口。

                                                *CTRL-W_P* *E441*
CTRL-W P        转至上一个窗口.没有上一个窗口时出错。
                {not :编译时未指定|+quickfix| 选项,将无法使用本命令}

若处于 Visual mode 下,当新窗口编辑的不是当前缓冲区,则结束 Visual mode 。
若新窗口编辑的是当前缓冲区,选择的可视区域会被保留显示,光标位置也保持不变。

                                                *:winc* *:wincmd*
这些命令也可用 ":wincmd" 来执行:

:[count]winc[md] {arg}
                效力等同 CTRL-W [count] {arg}.  如: >
                        :wincmd j
<               移动光标到当前窗口的下面一个。
                 ( CTRL-W 类命令) 有些时候在 Normal mode 中无法使用(如
                |CursorHold| 自动命令执行时),        或在 Normal mode 中不方便时
                ,这个命令就显得比较有用了。
                [count] 可以指定一个窗口号码。  如: >
                        :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"打开另外一个,不过
                新窗口中是当前窗口的内容。
                {not :编译时未指定 +vertsplit 选项,将无法使用本命令}

                                                *CTRL-W_L*
CTRL-W L        移动当前窗口到最底部,同时设其宽度为屏幕最大宽度。工作方式类似
                于关闭当前窗口,然后用":vert botright split"打开另外一个,不过
                新窗口中是当前窗口的内容。
                {not :编译时未指定 +vertsplit 选项,将无法使用本命令}

                                                *CTRL-W_T*
CTRL-W T        将当前窗口迁移到一个新tab页中。若但前tab页只有一个窗口时,会导
                致操作失败。
                若指定计数,则新的tab会先标记为此计数,随后被打开。否则标记会依
                当前tab页设置。

==============================================================================
6. 调整窗口大小                                         *window-resize*

                                                *CTRL-W_=*
CTRL-W =        设置所有窗口的高度和宽度相等,但可以设置 'winheight' 和 'winwidth' 
                来调整当前窗口。
                设置 'winfixheight' 的窗口将保持高度不变。
                设置 'winfixwidth' 的窗口将保持宽度不变。

: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 (默认:最宽可能值)。

你也可以用鼠标上下拖曳窗口的水平分割线,或左右拖曳窗口的垂直分割线,来调整窗口大小。
这仅限使用在支持鼠标的 Vim 版本中,且已经设置好 '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 个已修改的缓冲区    

  split & args list       split & buffer list      meaning ~
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 中计数器。                        

Note: ":next" 是一个例外,因为它必须以文件名列表为参数,这是为了和 Vi 兼容。


参数列表和多窗口
--------------------------------------

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

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

:[N]al[l][!] [N]                                *:al* *:所有* *:sal* *:sall*
:[N]sal[l][!] [N]
                重新整理屏幕,为每一个参数打开一个窗口。其它窗口统统关闭。如果
                使用了计数,则其数值为窗口数目的最大值。                    
                the maximum number of windows to open.
                若使用|:tab|修饰符,每个参数将会在同一个tab页内打开。
                若参数个数多于 'tabpagemax' 值,多余的将会在最末一个tab页内分割
                窗口。
                若设置了 'hidden' 选项,所有要关闭的窗口中的缓冲区将变为隐藏状
                态。
                如果没有设置 'hidden',但是设置了 'autowrite' ,那么所有改动  
                的缓冲区被写入文件。否则,包含更改过的缓冲区的窗口不会被删除,
                除非你用 [!] 使它们隐藏。更改过的缓冲区永远不会被丢弃,所以改  
                动不会丢失。                                                  
                [N] 是最大可以打开的窗口数。'winheight' 也限制打开的窗口数(如果
                之前加入 |:vertical| 的话,将使用 'winwidth' 来限制 ).
                Buf/Win Enter/Leave autocommands(这些自动化命令) 不会因为这里的
                新窗口而执行,它们只有在真正进入时才会执行。

:[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| 命令一样。
                参数列表 |argument-list| 会被象使用 |:next| 命令一样被设定。        
                此命令的目的在于:允许 debugger 之类的程序里让 Vim 编辑另一个文件。
                若使用|:tab|修饰符,每个参数将会在同一个tab页内打开。将使用最末
                一个空窗口。
                {only :编译时未指定 +gui 选项,将无法使用本功能}

==============================================================================
8. 让命令在所有缓冲区和窗口中生效                       *list-repeat*

                                                        *:windo*
:windo {cmd}            每个窗口中执行命令 {cmd}
                        工作起来像是按如下方式: >
                                CTRL-W t
                                :{cmd}
                                CTRL-W w
                                :{cmd}
                                etc.
<                       该操作仅在当前tab页中生效。
                        若该操作进行到某个窗口时发生错误,将就此停止,剩余的窗
                        口不予继续访问。
                        最末一个窗口(或操作出错的窗口)将会成为当前工作窗口。
                        {cmd} 中多个命令以 '|' 分割。
                        {cmd} 不能含打开或关闭窗口命令,或者是追加操作。
                        {not in Vi} {not : 编译时未指定 |+listcmds| 选项,将无
                        法使用本功能}
                        参考 |:tabdo|, |:argdo| 和 |:bufdo|.

                                                        *:bufdo*
:bufdo[!] {cmd}         缓冲区列表中每个缓冲区中执行命令 {cmd}
                        工作起来像是按如下方式: >
                                :bfirst
                                :{cmd}
                                :bnext
                                :{cmd}
                                etc.
<                       若当前文件不能被抛弃( |abandon|), 且没有使用 [!] 强制
                        执行,将导致本命令失败。
                        若该操作进行到某个缓冲区时发生错误,将就此停止,剩余的
                        缓冲区不予继续访问。
                        未在缓冲区列表中的缓冲区忽略该操作。
                        最末一个缓冲区(或操作出错的缓冲区)将会成为当前工作缓冲
                        区。
                        {cmd} 中多个命令以 '|' 分割。
                        {cmd} 不能对缓冲区列表做删除或增加缓冲区操作。
                        Note: 本命令执行时, the Syntax
                        autocommand event is disabled by adding it to
                        'eventignore'.  这是为提升缓冲区编辑速度考虑。
                        {not in Vi} {not : 编译时未指定|+listcmds| 选项,将无
                        法使用本命令}
                        参考 |:tabdo|, |:argdo| 和 |:windo|.

例如: >

        :windo set nolist nofoldcolumn | normal zn

|=厣? 'list'  选项,并禁止在所有窗口中打开 >

        :bufdo set fileencoding= | update

|T谒谢撼迩兄厣?'fileencoding',若缓冲区有修改,则写入。操作结果是所有缓冲
将会使用 'encoding' 的值( 若转换工作正常的话 ).

==============================================================================
9. 光标下的标记和文件名                                 *window-tag*

                                                        *:sta* *:stag*
:sta[g][!] [tagname]
                做 ":tag[!] [tagname]" 操作,并未找到的 tag 分割窗口。
                参考 |:tag|.

CTRL-W ]                                        *CTRL-W_]* *CTRL-W_CTRL-]*
CTRL-W CTRL-]   将当前窗口一分为二, 视光标下标识符为一个tag,在上方打开一个新
                窗口,并在其中跳转到相应的tag上。N 指定窗口高度。

                                                        *CTRL-W_g]*
CTRL-W g ]      将当前窗口一分为二。 视光标下标识符为一个tag,在上方打开一个新
                窗口,并在其中执行 ":tselect" 。N 指定窗口高度。

                                                        *CTRL-W_g_CTRL-]*
CTRL-W g CTRL-] 将当前窗口一分为二。 视光标下标识符为一个tag,在上方打开一个新
                窗口,并在其中执行 ":tjump" 。N 指定窗口高度。

CTRL-W f                                        *CTRL-W_f* *CTRL-W_CTRL-F*
CTRL-W CTRL-F   将当前窗口一分为二。  编辑光标下的文件。
                类似 ":split gf", 不过若文家不存在则窗口不予分割。
                文件查找将会在 'path' 变量路径下进行,也会在当前文件夹下查找。
                若文件名是类似 "type://machine/path" 的超文本链接,文件查找将
                只在 "/path" 路径下进行。
                若指定计数顺序,则
                {not :编译时未指定 |+file_in_path| 选项,将无法使用本命令}

CTRL-W F                                                *CTRL-W_F*
                将当前窗口一分为二。  编辑当前光标下的文件名,以文件名后的数字
                作为文件的行号,跳转到相应的行上。参考 |gF|来查看文件行号的更
                多细节信息。
                {not :编译时未指定 |+file_in_path| 选项,将无法使用本命令}

CTRL-W gf                                               *CTRL-W_gf*
                打开一个新的tab页,并编辑当前光标下的文件名。
                类似 "tab split" 和 "gf", 不过该文件不存在时,新tab页不予打开。
                {not :编译时未指定 |+file_in_path| 选项,将无法使用本命令}

CTRL-W gF                                               *CTRL-W_gF*
                打开一个新的tab页,编辑当前光标下的文件名,以文件名后的数字作为
                文件的行号,跳转到相应的行上。类似 "tab split" 和 "gF",不过该文
                件不存在时,新tab页不予打开。
                {not :编译时未指定 |+file_in_path| 选项,将无法使用本命令}

参考 |CTRL-W_CTRL-I|: 为包含光标下关键字的文件打开一个新窗口。

==============================================================================
10. 预览窗口                                    *preview-window*

预览窗口特指显示(预览)其他文件的窗口,它通常是显示一个包含文件或一个函数定义的
小窗口。
{not :编译时未指定|+quickfix| 选项,将无法使用本功能}

只能有一个预览窗口(对一个tab页来说),由下面的几个命令创建:选项'previewheight'
在打开预览窗口时设置高度;选项'previewwindow' 在预览窗口内设定以便区分。选项
 'winfixheight'让预览窗口在打开或关闭其他窗口时保持高度不变。

                                                *:pta* *:ptag*
:pta[g][!] [tagname]
                执行 ":tag[!] [tagname]" 并在 预览("preview")窗口中显示找到的
                tag,保持现有工作窗口和光标位置不变。若预览("preview")窗口已经
                存在,则会重复实用(就像help窗口一样).若打开了一个新的窗口,
                新窗口的高度由 'previewheight' 指定。参考 |:tag|
                参考下面的例子: |CursorHold-example|
                与 |:tag|的小小不同: 当 [tagname] 与已经打开的tag相同时,tag
                匹配的参数列表不会再重新设定.This makes the CursorHold example work after a
                |:ptnext|.

CTRL-W z                                        *CTRL-W_z*
CTRL-W CTRL-Z                                   *CTRL-W_CTRL-Z* *:pc* *:pclose*
:pc[lose][!]    关闭当前打开的任何 "Preview" 窗口.  若设置了 'hidden'选项,或
                缓冲区改变并使用 [!] 强制执行,则缓冲区会变为隐藏状态(除非有
                另外一个窗口正在对它编辑).若任何一个 "preview" 窗口无法关闭,
                则此命令失败。
                参考 |:close|.

                                                        *:pp* *:ppop*
:[count]pp[op][!]
                在新窗口中执行 ":[count]pop[!]" .  参考 |:pop| 和|:ptag|.  
                {not in Vi}

CTRL-W }                                                *CTRL-W_}*
                实用光标下的标识符作为一个tag,执行 :ptag 。N 指定新的预览窗口
                (若需要)的高度。若不指定N,高度由 'previewheight' 指定。

CTRL-W g }                                              *CTRL-W_g}*
                实用光标下的标识符作为一个tag,执行 :ptjump 。N 指定新的预览窗口
                (若需要)的高度。若不指定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|,但是你可以不必提供一个tags文件,
                而在系统头文件里找到所有匹配。例如: >
  :au! CursorHold *.[ch] nested exe "silent! psearch " . expand("<cword>")
<               警告: 这会执行很慢。

例如:                                          *CursorHold-example*  >

  :au! CursorHold *.[ch] nested exe "silent! ptag " . expand("<cword>")

|=岫怨獗晗碌墓丶种葱?":ptag" 命令, 'updatetime' 设定光标停留时间。选项
"nested"使得其他的自动命令执行,这样可以在预览窗口里进行语法加亮工作。选项
"slient" 避免tag寻找失败时的错误信息提示。参考 |CursorHold|.禁用此功能: >

  :au! CursorHold

|A硪桓龊糜玫墓δ苁羌恿烈丫业降膖ag,避免在光标下没有单词和一些其他东西时执行
"ptag": >

  :au! CursorHold *.[ch] nested call PreviewWord()
  :func PreviewWord()
  :  if &previewwindow                  " don't do this in the preview window
  :    return
  :  endif
  :  let w = expand("<cword>")          " get the word under cursor
  :  if w =~ '\a'                       " if the word contains a letter
  :
  :    " Delete any existing highlight before showing another tag
  :    silent! wincmd P                 " jump to preview window
  :    if &previewwindow                        " if we really get there...
  :      match none                     " delete existing highlight
  :      wincmd p                       " back to old window
  :    endif
  :
  :    " Try displaying a matching tag for the word under the cursor
  :    try
  :       exe "ptag " . w
  :    catch
  :      return
  :    endtry
  :
  :    silent! wincmd P                 " jump to preview window
  :    if &previewwindow                " if we really get there...
  :      if has("folding")
  :        silent! .foldopen            " don't want a closed fold
  :      endif
  :      call search("$", "b")          " to end of previous line
  :      let w = substitute(w, '\', '\\', "")
  :      call search('\<\V' . w . '\>') " position cursor on match
  :      " Add a match highlight to the word at this position
  :      hi previewWord term=bold ctermbg=green guibg=green
  :      exe 'match previewWord "\%' . line(".") . 'l\%' . col(".") . 'c\k*"'
  :      wincmd p                       " back to old window
  :    endif
  :  endif
  :endfun

关键词(Tag): 窗口 vim


收藏: QQ书签 del.icio.us 订阅: Google 抓虾

最新评论

发表评论

* 昵称

已经注册过? 请登录

新用户请先注册 以便能显示头像及追踪评论回复

Email
网址
* 评论
表情
 
 

分类小组论坛
杂谈, 娱乐、八卦, 文学、艺术, 体育, 旅游、同城, 象牙塔, 情感, 时尚、生活, 星座, 科技

请注意遵守中华人民共和国法律法规, 如威胁到本站生存, 将依法向有关部门报告, 同时本站的相关记录可能成为对您不利的证据.

相关法律法规
全国人大常委会关于维护互联网安全的决定
中华人民共和国计算机信息系统安全保护条例
中华人民共和国计算机信息网络国际联网管理暂行规定
计算机信息网络国际联网安全保护管理办法
计算机信息系统国际联网保密管理规定