windows

windows.txt 适用于 Vim 9.2 版本。 最近更新: 2026年10月 VIM 参考手册 by Bram Moolenaar 译者: Dasn 多窗口与多缓冲区编辑 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 {仅当编译时加入 +windows 特性才能使用多窗口功能}

1. 简介 windows-intro window

小结: 缓冲区是文件在内存中的文本。 窗口是缓冲区的视图。 标签页是一组窗口的集合。 "窗口" 是缓冲区的视图。可用多个窗口观察同一个缓冲区,也可用多个窗口观察不同的 缓冲区。 "缓冲区" 是一块内存区域,保存等待编辑的文件。在把缓冲区写回文件前,原始文件不 会被更改。 缓冲区存在三种状态: active-buffer 激活: 缓冲区在窗口中显示。有对应文件时,文件内容已读入缓冲区。但缓冲区内容 可能已被修改,而与磁盘上的文件内容不一致。 hidden-buffer 隐藏: 缓冲区未显示。有对应文件时,文件内容已读入缓冲区。其余属性同激活缓冲 区,只是不可见。 inactive-buffer 非激活: 缓冲区未显示,也不含任何文本。曾经加载过文件时,缓冲区相关选项会被保 留。包括来自 viminfo 文件的位置标记,但缓冲区无文本内容。 以表格形式说明: 状态 在窗口显示 文件加载 ":buffers" 命令显示 激活 是 是 'a' 隐藏 否 是 'h' 非激活 否 否 ' ' buffer-reuse 每个缓冲区拥有唯一编号,在同一次 Vim 会话中,编号保持不变。 bufnr() 和 bufname() 函数可用于在缓冲区名称和编号间相互转换。有一个例外: 新建空白缓冲区 且未作修改时,加载其他文件会重用该缓冲区。缓冲区编号也保持不变。 Vim 主窗口可容纳多个分割窗口。此外还有使用标签页 tab-page ,每个标签页可容纳 多个窗口。 window-ID winid windowid 每个窗口拥有唯一标识符,称为窗口 ID。在同一次 Vim 会话中,该 ID 保持不变。 win_getid() 和 win_id2tabwin() 函数可用于在窗口/标签页号和窗口 ID 间相互转 换。窗口还有窗口编号,每当有窗口打开或关闭,编号都可能发生变化,见 winnr() 。 窗口号仅在特定标签页内有效,而窗口 ID 在所有标签页中均有效。对大多数接受窗口 ID 或窗口号的函数,窗口号仅适用于当前标签页窗口,而窗口 ID 可引用任意标签页中 的窗口。

2. 启动 Vim windows-starting

Vim 启动后缺省只有一个窗口,和 Vi 一致。 -o 和 -O 参数可为参数列表里的每个文件单独打开一个窗口。 -o 会水平分割窗 口;而 -O 会垂直分割窗口。同时使用 -o 和 -O 时,以最后一个为准。下例会打 开三个水平分割窗口: vim -o file1 file2 file3 使用 "-oN" 格式 (其中 N 为十进制数值) 时,会打开 N 个水平分割窗口。如果文件数 量多于窗口数,仅打开 N 个窗口,其余文件没有对应窗口。如果窗口数多于文件数量, 则末尾多出的窗口会编辑空白缓冲区。"-ON" 使用相同限制,但采用垂直分割。 如果打开文件过多,每个窗口都会变得很小。可设置 'winheight' 和 'winwidth' 选项 保证窗口大小可用。 新建窗口或读取文件时,不触发 Buf/Win Enter/Leave 等自动命令 autocommand ,仅 当真正进入缓冲区/窗口后才会触发。 status-line 状态行用于分割窗口。选项 'laststatus' 控制最后一个窗口是否显示状态行: 'laststatus' = 0 永不显示状态行 'laststatus' = 1 存在多个窗口时显示状态行 'laststatus' = 2 总是显示状态行 可通过设置 'statusline' 和 'statuslineopt' 选项调整状态行内容与高度。二者均可 设为窗口局部选项,实现每个窗口状态行样式和高度独立。 状态行缺省用反色显示。可修改 'highlight' 选项中的 's' 字符调整高亮。例如 "sb" 代表粗体。如果状态行不启用高亮 ("sn"),则当前窗口使用 '^' 字符标识,其他窗口使 用 '=' 标识。有鼠标支持且用 'mouse' 选项开启后,可拖动状态行调整窗口大小。 备注: 如果期待状态行使用反色显示,但实际未生效。检查 'highlight' 选项是否包含 "si"。在 3.0 版本里,"si" 用于状态行反色 (invert)。但新版应改用 "sr" (reverse), 因为 "si" 现在代表斜体 (italic)!如果终端不支持斜体,状态行仍会以反色显示;因 此,此问题仅会在有斜体终端能力项的终端出现。 filler-lines 窗口中缓冲区末行之后的显示行称为填充行。缺省填充行以波浪号 (~) 字符开头。可用 'fillchars' 选项中的 "eob" 项修改此字符。该字符缺省使用 NonText ( hl-NonText ) 高亮。要修改填充字符高亮,可修改 EndOfBuffer 高亮组 ( hl-EndOfBuffer )。

3. 打开和关闭窗口 opening-window

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 行 (缺省为当前窗口高度的一半)。缩小当前窗口的 高度以腾出空间 (未显式指定高度 N、'equalalways' 选项开启、 'eadirection' 不为 "hor"、且存在其他高度大于当前窗口或新窗口的 窗口时,也会调整其他窗口的高度)。 备注: 并非所有终端都支持 CTRL-S 形式,且该按键可能阻塞输入,此 时可用 CTRL-Q 恢复。 另见 ++opt 和 +cmd 。 E242 E1159 在自动命令内分割窗口需谨慎,如果同时正在对窗口布局进行其他改 动,可能会搞乱窗口布局。 :[N]sp[lit] [++opt] [+cmd] {file} :split_f 类似 :split ,但新建窗口后会在其中开始编辑文件 {file}。 几乎等同先执行 :split ,再执行 :edit 命令,但原窗口的轮换文 件名会被设为 {file}。 [+cmd] 参数给出时,文件加载完毕后执行指定命令 +cmd 。 另见: ++opt 。 新窗口高度设为 N 行 (缺省为当前窗口高度的一半)。缩小当前窗口的 高度以腾出空间 (满足 :sp 中相应条件时,也会调整其他窗口的高 度)。 CTRL-W CTRL-V CTRL-W_CTRL-V CTRL-W v CTRL-W_v :[N]vs[plit] [++opt] [+cmd] [file] :vs :vsplit 类似 :split 但使用垂直分割。满足以下条件时,所有窗口会均匀地 水平铺开: 1. 未显式指定宽度 N, 2. 'equalalways' 选项开启, 3. 'eadirection' 不为 "ver",且 4. 存在其他宽度大于当前窗口或新窗口的窗口。 N 给出时,新窗口宽度 (尽可能) 设为 N 列。 备注: 其他场景 CTRL-Q 一般等价于 CTRL-V,但此处不成立! CTRL-W_CTRL-Q 是退出窗口命令。 CTRL-W n CTRL-W_n CTRL-W CTRL-N CTRL-W_CTRL-N :[N]new [++opt] [+cmd] :new 新建窗口并开始编辑空文件。新窗口的高度设为 N 行 (缺省为当前窗 口高度的一半)。缩小当前窗口的高度以腾出空间 (满足 :sp 中相应 条件时,也会调整其他窗口的高度)。 另见 ++opt 和 +cmd 。 'fileformats' 非空时,新缓冲区使用列表第一个格式。为空时使用当 前缓冲区的 'fileformat' 值。换行格式可用 ++opt 参数覆盖。 自动命令执行顺序如下: 1. 在当前窗口执行 WinLeave 2. 在新窗口执行 WinEnter 3. 在当前缓冲区执行 BufLeave 4. 在新缓冲区执行 BufEnter 类似先执行 :split ,再执行 :enew 。 :[N]new [++opt] [+cmd] {file} 同 :split_f ,新建窗口并且开始编辑文件 {file}。 :[N]vne[w] [++opt] [+cmd] [file] :vne :vnew 类似 :new ,但使用垂直分割。满足 :vs 中相应条件时,所有窗口 会均匀地水平铺开。 :[N]sv[iew] [++opt] [+cmd] [file] :sv :sview splitview 类似 :split ,但为新缓冲区置位 'readonly' 选项。 :[N]sf[ind] [++opt] [+cmd] {file} :sf :sfi :sfind splitfind 类似 :split ,但会像 :find 那样在 'path' 中搜索 {file}。找 不到文件时不分割窗口。 CTRL-W CTRL-^ CTRL-W_CTRL-^ CTRL-W_^ CTRL-W ^ 将当前窗口水平分割为两个,新窗口开始编辑轮换文件。[N] 给出时, 新窗口中会编辑第 N 号缓冲区。类似 `:sp #` 和 `:sp #N`,但允许 目标缓冲区为无名缓冲区。本命令行为与 CTRL-^ 一致,区别是先分 割窗口。 CTRL-W_: CTRL-W : 同 : - 进入命令行。在终端窗口中有用,该处所有 Vim 命令必须 以 CTRL-W 或 'termwinkey' 开头。 注意 'splitbelow' 和 'splitright' 选项控制新窗口出现的位置。 E36 如果空间不足,创建窗口会失败。每个窗口至少需要占用屏幕一行以及一列,有时要求更 多。相关选项可见 'winminheight' 和 'winminwidth'。 :vert :vertical :vert[ical] {cmd} 执行 {cmd}。命令包含窗口分割操作时,会使用垂直分割。使用 `vertical wincmd =` 时,仅对窗口在垂直方向均分 (即等高)。 不适用于 :execute 和 :normal 。 :hor :horizontal :hor[izontal] {cmd} 执行 {cmd}。当前仅对 `horizontal wincmd =` 有实际影响,该命令 仅对窗口在水平方向均分 (即等宽)。 :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}。命令包含窗口分割操作时,新窗口置于顶部且占满全宽。 垂直分割窗口时,窗口置于最左侧且占满全高。 不适用于 :execute 和 :normal 。 :bo :botright :bo[tright] {cmd} 执行 {cmd}。命令包含窗口分割操作时,新窗口置于底部且占满全宽。 垂直分割窗口时,窗口置于最右侧且占满全高。 不适用于 :execute 和 :normal 。 这些命令修饰符可组合使用,实现占满全高的垂直分割窗口: :vertical topleft split tags 在 Vim 窗口最左侧打开一个垂直分割、占满全高的窗口,编辑 tags 文件。 关闭窗口

:q[uit] :{count}q[uit] :count_quit CTRL-W q CTRL-W_q CTRL-W CTRL-Q CTRL-W_CTRL-Q 不带 {count} 时,退出当前窗口。 给出 {count} 时,退出编号为 {count} 的窗口。 edit-window 退出最后一个编辑窗口 (帮助或预览窗口不计入) 时,退出 Vim。 开启 'hidden' 且当前缓冲区仅有一个窗口显示时,隐藏该缓冲区。未 开启 'hidden' 且当前缓冲区仅有一个窗口显示时,如果该缓冲区已修 改,本命令会失败。 (注意: CTRL-Q 并非所有终端都可用)。 如果 [count] 大于最大窗口编号,关闭最后一个窗口: :1quit " 退出第一个窗口 :$quit " 退出最后一个窗口 :9quit " 如果窗口不足 9 个,退出最后一个窗口 :-quit " 退出上一个窗口 :+quit " 退出下一个窗口 :+2quit " 退出下下个窗口 关闭帮助窗口且其不是唯一窗口时,Vim 会尝试恢复之前的窗口布局, 见 :helpclose 。 :q[uit]! :{count}q[uit]! 不带 {count} 时,退出当前窗口。 给出 {count} 时,退出编号为 {count} 的窗口。 如果当前缓冲区仅有一个窗口显示时,放弃缓冲区的全部修改。退出最 后一个编辑窗口 (帮助窗口不计入) 时,退出 Vim。即使开启 'hidden',缓冲区内容也会丢失。 :clo[se][!] :{count}clo[se][!] CTRL-W c CTRL-W_c :clo :close 不带 {count} 时,关闭当前窗口。 给出 {count} 时,关闭编号为 {count} 的窗口。 开启 'hidden'、或缓冲区已修改且给出 [!] 时,隐藏该缓冲区 (除非 当前缓冲区还有其他窗口显示)。 当前标签页仅剩最后一个编辑窗口 ( edit-window ) 且存在其他标签 页时,则关闭该标签页 tab-page 。 在以下任一情况下,本命令会失败: E444 - 屏幕上仅有一个窗口。 - 未开启 'hidden'、不带 [!]、缓冲区已修改、且仅有一个窗口显示 该缓冲区。 对缓冲区的修改既不写入文件,也不会丢失,因此本命令属于 "安全" 命令。 CTRL-W CTRL-C CTRL-W_CTRL-C 按照惯例,可能会认为 CTRL-W CTRL-C 会关闭当前窗口,但实际并非 如此,CTRL-C 会撤销整条命令。 :hide :hid[e] :{count}hid[e] 不带 {count} 时,退出当前窗口,屏幕仅剩最后一个窗口时除外。 给出 {count} 时: 退出编号为 {count} 的窗口。 缓冲区变为隐藏 (除非还有其他窗口显示该缓冲区,或 'bufhidden' 设为 "unload"、"delete" 或 "wipe")。 当前标签页仅剩最后一个窗口时,关闭该标签页。 tab-page 本命令不受 'hidden' 值影响。对缓冲区的修改既不写入文件,也不会 丢失,因此本命令属于 "安全" 命令。 :hid[e] {cmd} 临时开启 'hidden' 选项并执行 {cmd}。命令执行完毕后,恢复 'hidden' 原值。 示例: :hide edit Makefile 编辑 "Makefile" 文件,当前缓冲区有改动时会将其隐藏。 :on[ly][!] :{count}on[ly][!] CTRL-W o CTRL-W_o E445 CTRL-W CTRL-O CTRL-W_CTRL-O :on :only 仅保留当前窗口。关闭屏幕上的其余窗口。{count} 用法参见上方 :quit 命令 :count_quit . 开启 '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] 时,移动光标到当前窗口下方或右侧窗口。如果下方或右侧 都没有窗口,跳到左上角窗口。 给出 [N] 时,移动光标到第 N 号窗口 (窗口编号从左上到右下排 序)。可通过 bufwinnr() 和 winnr() 获取窗口编号。如果 N 大 于窗口总数,跳转到最后一个窗口。 CTRL-W_W CTRL-W W 不带 [N] 时,移动光标到当前窗口上方或左侧窗口。如果上方或左侧 都没有窗口,跳到右下角窗口。 给出 [N] 时,移动光标到第 N 号窗口,同 CTRL-W w。 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 特性才有效} 在可视模式下,新窗口不显示同一缓冲区时,退出可视模式。显示同一缓冲区时,则调整 光标位置以保留原有可视选区。 :winc :wincmd 也可用 ":wincmd" 执行上述命令: :[count]winc[md] {arg} 等价于 CTRL-W [count] {arg}。示例: :wincmd j 切换到当前窗口下方窗口。 适用于无法使用普通模式 (如 CursorHold 自动命令事件)、或使用 普通模式按键不方便 (如基于浏览器的终端上,CTRL-W 热键常用于关 闭浏览器的标签页) 的场景。 根据具体命令,[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] 时: 交换当前窗口与下一个窗口。如果没有下一个窗口,则 与上一个窗口交换。 带 [N] 时: 交换当前窗口与第 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`,区 别是操作当前窗口而非新建窗口。 CTRL-W_L CTRL-W L 将当前窗口移到最右侧,占满全高。类似 `:vert botright split`, 区别是操作当前窗口而非新建窗口。 CTRL-W_T CTRL-W T 将当前窗口移动到新标签页。当前标签页仅有一个窗口时命令失败。 类似 `:tab split`,但原窗口会被关闭。 给出 [N] 时,新标签页在该编号标签页之前创建。省略时默认在当前 标签页之后创建。

6. 调整窗口大小 window-resize

CTRL-W_= CTRL-W = 将窗口调整到 (大致) 等宽等高,当前窗口仍会遵循 'winheight' 和 'winwidth'。 置位 'winfixheight' 的窗口保持高度,置位 'winfixwidth' 的窗口 保持宽度。 要仅对窗口在垂直方向均分 (即等高),用 `vertical wincmd =`。 要仅对窗口在水平方向均分 (即等宽),用 `horizontal wincmd =`。 :res[ize] -N :res :resize CTRL-W_- CTRL-W - 当前窗口高度减少 N 行 (缺省 1 行)。 使用 :vertical 前缀时,减少宽度而非高度。 :res[ize] +N CTRL-W_+ CTRL-W + 当前窗口高度增加 N 行 (缺省 1 行)。 使用 :vertical 前缀时,增加宽度而非高度。 :res[ize] [N] CTRL-W CTRL-_ CTRL-W_CTRL-_ CTRL-W__ CTRL-W _ 将当前窗口的高度设为 N 行 (缺省为最大可能高度)。 :{winnr}res[ize] [+-]N 类似上述 :resize ,但针对编号为 {winnr} 的窗口而非当前窗口。 z{nr}<CR> 将当前窗口的高度设为 {nr} 行。 CTRL-W_< CTRL-W < 当前窗口宽度减少 N 列 (缺省 1 列)。 CTRL-W_> CTRL-W > 当前窗口宽度增加 N 列 (缺省 1 列)。 :vert[ical] res[ize] [N] :vertical-resize CTRL-W_bar CTRL-W | 将当前窗口的高度设为 N 列 (缺省为最大可能宽度)。 也可用鼠标上下拖动状态行、或左右拖动垂直分隔线调整窗口大小。仅当有鼠标支持且用 'mouse' 选项开启后才有效。 'winheight' ('wh') 选项设置当前窗口最小高度。该选项在每次切换到其他窗口时生 效。设为 0 代表不设最小高度。设为极大值 (如 '9999') 会使当前窗口始终占满剩余空 间)。建议设为方便编辑的合理值,如 '10'。 对应的 'winwidth' ('wiw') 选项设置当前窗口最小宽度。 开启 'equalalways' ('ea') 选项时,分割或关闭窗口后自动将所有窗口调整为相同大 小。不开启时,分割窗口时仅缩小当前窗口,其余窗口大小保持不变。关闭窗口时,释放 出来的行数交给上方窗口。 'eadirection' 选项限制 'equalalways' 的作用方向。缺省值为 "both",两个方向都会 调整。设为 "ver" 时,仅统一高度,适合手动调整垂直分割窗口宽度且保持其不变。类 似地,设为 "hor" 时,仅统一宽度。 'cmdheight' ('ch') 选项设置命令行高度。如果长消息频繁触发按回车提示 hit-enter ,可设为 2 或 3。 仅有一个窗口时,调整窗口大小也会改变命令行高度。多窗口场景下,调整当前窗口大小 会连带改变其下面窗口的高度 (有时也影响上面窗口)。 'winminheight' 和 'winminwidth' 设置所有窗口的最小高度和最小宽度。这些是硬性限 制,窗口永远不能缩至更小。 WinScrolled 和 WinResized 自动命令 win-scrolled-resized 要监听窗口大小变化,可用 WinResized 自动命令事件。 要监听窗口文本的垂直或水平滚动,可用 WinScrolled 自动命令事件。大小变化也会 触发本事件。 例外: 'incsearch' 带来的文本滚动不触发本事件。 WinResized-event 显示更新后会触发 WinResized ,此时可能多个窗口出现大小变动。 v:event.windows 变量存放自上次该事件触发后,大小发生变化的窗口 ID 列表,示例: [1003, 1006] WinScrolled-event WinScrolled 事件在 WinResized 之后触发,也会在窗口滚动后触发。滚动可以是垂 直方向的 (窗口顶部显示的文本发生变化),也可以是水平方向的 (当 'wrap' 关闭时水 平显示位置发生变化,或首行在最左侧显示的部分发生变化)。 注意 WinScrolled 触发远多于 WinResized ,可能略微拖慢编辑。 WinScrolled 用窗口 ID 为键存储每个窗口的变动信息,"all" 键存储汇总变动。 v:event 示例 ( Vim9 语法): { all: {width: 0, height: 2, leftcol: 0, skipcol: 0, topline: 1, topfill: 0}, 1003: {width: 0, height: -1, leftcol: 0, skipcol: 0, topline: 0, topfill: 0}, 1006: {width: 0, height: 1, leftcol: 0, skipcol: 0, topline: 1, topfill: 0}, } 注意 "all" 项是各个窗口变动量绝对值的累加。 如需获取更详细变动信息,或做 "防抖" 处理 (不逐一处理每个事件,以免工作过于频 繁),可用 winlayout() 和 getwininfo() 函数。 首次定义 WinScrolled 和 WinResized 自动命令时,不会立即触发,仅在首次滚动 或调整大小后才会触发。切换标签页时也有可能触发。 这些自动命令中执行的命令不应再次修改窗口大小和引起滚动。否则事件会很快再次触 发。换而言之,事件触发前,会先记录当前窗口大小和滚动位置,然后会检查是否出现变 化,并据此触发下次事件。 E1312 在此自动命令中禁止修改窗口布局 (分割、关闭或移动窗口)。

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/12/22/32、3/13/23/33、4/14/24/34 中是往上/往下跳转的数量。 [N] 在命令 1 和 21 中是参数编号,缺省为当前参数。 [N] 在命令 11 和 31 中是缓冲区号,缺省当前缓冲区。 [N] 在命令 19 和 39 中是计数。 备注: ":next" 是特例,为兼容 Vi,该命令可接受文件名列表。 参数列表和多窗口

每个窗口独立保存参数列表的当前位置。记住执行 `:e file` 时,参数列表的位置保持 不变,但编辑的文件不再是该位置对应的文件。为标识此状态,文件信息 (以及窗口标 题,如果有的话) 会显示 "(文件 (N)/M)","(N)" 为参数列表当前位置,"M" 为参数列 表总文件数。 参数列表中的所有条目都被加入缓冲区列表,因此也可用缓冲区列表命令 (如 :bnext ) 访问参数文件。 :[N]al[l][!] [N] :al :all :sal :sall :[N]sal[l][!] [N] 重新排列屏幕,为每个参数打开一个窗口。关闭其余所有窗口。 带 :tab 修饰符时,为每个参数新建标签页。参数数量多于 'tabpagemax' 时,额外参数会在最后一个标签页内成为分割窗口。 开启 'hidden' 时,关闭窗口对应的缓冲区会转为隐藏状态。 未开启 'hidden' 但开启 'autowrite' 时,会将已修改缓冲区写入文 件。否则,如果带 [!],则已修改缓冲区会转为隐藏状态,如果不带, 则不会关闭包含已修改缓冲区的窗口。无论哪种情况,都不会放弃已修 改的缓冲区,相关修改不会丢失。 [N] 给出时,最多打开 N 个窗口。'winheight' (加上 :vertical 前缀时则为 'winwidth') 也会限制打开的窗口数量。 新建窗口时,不触发 Buf/Win Enter/Leave 等自动命令,仅当真正进 入缓冲区/窗口后才会触发。 如果自动命令在命令执行期间修改了窗口布局,会报错。 E249 :[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 | last" 的简写。分割窗口并转到末个参数。如果没有参数列 表,不分割窗口。参见 ++opt 和 +cmd 。 :dr :drop :dr[op] [++opt] [+cmd] {file} .. 在窗口中打开第一个 {file}。 - 该文件已在窗口打开时,切换至该窗口。 - 该文件尚未打开时,在当前窗口编辑该文件。如果当前缓冲区无法被 放弃 abandon ,先分割窗口。 - 不在参数列表或非全宽的窗口会尽可能被关闭。 设置参数列表 argument-list ,行为类似 :next 命令。 供调试器之类的外部程序调用 Vim 编辑其他文件。 搭配 :tab 修饰符时,为每个参数新建标签页。对于首个参数,当前 窗口为空时优先使用该窗口,而非新建标签页。 另见 ++opt 和 +cmd 。

8. 在所有缓冲区或窗口中执行命令 list-repeat

:windo :[range]windo {cmd} 在每个窗口中执行 {cmd},[range] 给出时,仅对窗口号 在 [range] 范围内的窗口执行。相当于: CTRL-W t :{cmd} CTRL-W w :{cmd} 等等…… 只在当前标签页范围内操作。 如果在某个窗口执行时检测到错误,不再继续处理后续窗口。 最后执行的窗口 (或出错窗口) 成为当前窗口。 {cmd} 内可用 '|' 拼接多个命令。 {cmd} 禁止新建、关闭或重新排列窗口。 另见 :tabdo 、 :argdo 、 :bufdo 、 :cdo 、 :ldo 、 :cfdo 和 :lfdo :bufdo :[range]bufdo[!] {cmd} 在缓冲区列表的每个缓冲区中执行 {cmd},[range] 给出时, 仅对编号在 [range] 范围内的缓冲区执行。相当于: :bfirst :{cmd} :bnext :{cmd} 等等…… 如果当前文件不能被丢弃 abandon ,且不带 [!],本命令失 败。 如果在某个缓冲区执行时检测到错误,不再继续处理后续缓冲 区。 跳过列表外缓冲区。 最后执行的缓冲区 (或出错缓冲区) 成为当前缓冲区。 {cmd} 内可用 '|' 拼接多个命令。 {cmd} 禁止删除缓冲区、或向缓冲区列表新增缓冲区。 备注: 本命令执行期间,会将 Syntax 加入 'eventignore' 临时屏蔽该自动命令事件。大幅提升批量处理缓冲区的速度。 另见 :tabdo 、 :argdo 、 :windo 、 :cdo 、 :ldo 、 :cfdo 和 :lfdo 示例: :windo set nolist foldcolumn=0 | normal! zn 在所有窗口中,复位 'list' 选项并关闭折叠。 :bufdo set fileencoding= | update 在所有缓冲区中,复位 'fileencoding',发生编码变更时写入文件。最终所有缓冲区都 会统一使用 'encoding' 编码 (前提是编码转换成功)。

9. 光标下的标签和文件名 window-tag

:sta :stag :sta[g][!] [tagname] 执行 ":tag[!] [tagname]" 并分割窗口,在新窗口中打开目标标签。 要在垂直分割窗口或新标签页中跳转标签,参见 'switchbuf'。另见 :tag 。 CTRL-W ] CTRL-W_] CTRL-W_CTRL-] CTRL-W CTRL-] 将当前窗口分割为两个,以光标下的关键字作为标签,在上方的新窗口 中跳转标签。 可视模式下,以可视选中文本作为标签。 新窗口高度设为 N 行。要在垂直分割窗口或新标签页中跳转标签,参 见 'switchbuf'。 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 然后执行 gf ,但如果文件不存在,不分割窗口。 使用 'path' 目录列表搜索文件,也会在当前文件所在目录下搜索。 文本为形如 "type://machine/path" 的超链接时,仅取 "/path" 部 分。 N 给出时,编辑第 N 个匹配文件。 CTRL-W F CTRL-W_F 将当前窗口分割为两个。编辑光标下的文件名,并跳转到文件名后方的 行号,行号解析规则见 gF 。 CTRL-W gf CTRL-W_gf 新建标签页,编辑光标下的文件名。类似 `:tab split` 然后执行 gf ,但如果文件不存在,不新建标签页。 CTRL-W gF CTRL-W_gF 新建标签页,编辑光标下的文件名,并跳转到文件名后方的行号上。类 似 `:tab split` 然后执行 gF ,但如果文件不存在,不新建标签 页。 CTRL-W gt CTRL-W_gt 切换到下一个标签页,同 gt 。 CTRL-W gT CTRL-W_gT 切换到上一个标签页,同 gT 。 另见 CTRL-W_CTRL-I : 为光标下的关键字对应的头文件打开窗口。

10. 预览窗口 preview-window

预览窗口是用于显示 (预览) 其他文件的特殊窗口。一般为小窗口,用于查看头文件或函 数定义。 {仅当编译时加入 +quickfix 特性才有效} 每个标签页仅能有一个预览窗口,可由以下命令创建。'previewheight' 选项指定预览窗 口打开时的高度;预览窗口会置位 'previewwindow' 选项用于标识。同时置位 'winfixheight' 选项,确保在打开或关闭其他窗口时,维持其自身高度不变。 preview-popup 也可设置 'previewpopup',用弹出窗口代替预览窗口。该选项设置时,优先级高于 'previewwindow' 和 'previewheight' 设置。选项为逗号分隔列表,可用值为: border 边框风格 (见 'pumborder') borderhighlight 弹窗边框字符高亮组 close 是否显示关闭按钮: "on" (缺省) 或 "off",为 "on" 时,必 须在设置 border 之后设置。 height 弹窗最大高度 highlight 弹窗高亮组 (缺省为 Pmenu) opacity 不透明度百分比 0–100 (缺省为 100,完全不透明)。 小于 100 时,背景内容会透过弹窗显示。 resize 是否显示缩放柄: "on" (缺省) 或 "off" shadow 是否显示阴影: "off" (缺省) 或 "on",使用 hl-PmenuShadow 高亮 width 弹窗最大宽度 示例: :set previewpopup=height:10,width:60 :set previewpopup=border:single,borderhighlight:PmenuBorder :set previewpopup=border:custom:─;│;─;│;┌;┐;┘;└ :set previewpopup=border:round,opacity:80 若干特性: - 文件已存在某缓冲区时,会重用该缓冲区。可在弹窗预览的同时编辑文件。 - 不会弹出 ATTENTION (注意) 对话框,因为弹窗内不能编辑文件。但后续在普通窗口打 开同一缓冲区时,可能察觉不到文件已在别处修改。此时再使用 :edit 触发 ATTENTION 提示并按 "A" 放弃修改时,预览窗口内容也会被清空 (译者注: 因为两者 共享同一缓冲区)。 :pt :ptag :pt[ag][!] [tagname] 执行 ":tag[!] [tagname]",在预览窗口展示标签,不改动当前缓冲区 和光标位置。预览窗口已存在时会被重用 (行为类似帮助窗口)。新预 览窗的高度由 'previewheight' 决定。另见 :tag 。 示例见下 CursorHold-example 。 与 :tag 有细微差别: 当 [tagname] 与当前已展示标签相同时,不 重设标签匹配表的当前位置。 下例 CursorHold-example 中,执行 :ptnext 后,自动命令仍可正常工作。 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 。 CTRL-W } CTRL-W_} 以光标下的关键字作为标签,执行 :ptag 。新建预览窗口 (如有需 要) 的高度设为 N 行。不带 N 时,默认使用 'previewheight' 值。 CTRL-W g } CTRL-W_g} 以光标下的关键字作为标签,执行 :ptjump 。新建预览窗口 (如有需 要) 的高度设为 N 行,不带 N 时,默认使用 'previewheight' 值。 :pb :pbuffer :[N]pb[uffer][!] [+cmd] [N] 在预览窗口中,编辑缓冲区列表内第 [N] 号缓冲区。不带 [N] 时,继 续编辑当前缓冲区。[!] 见 :buffer-! 。可打开未置位 'buflisted' 标志位的列表外缓冲区。编号不接受单引号记法,`:pbuffer 12'345'` 会把 12'345' 当作缓冲区名。 另见 +cmd 。 :ped :pedit :ped[it][!] [++opt] [+cmd] {file} 在预览窗口中,编辑名为 {file} 的文件。预览窗口打开方式同 :ptag 。不改动当前窗口和光标位置。实用示例: >vim :pedit +/fputc /usr/include/stdio.h < 另见 ++opt 和 +cmd 。 :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>") 当光标停留时间长达 'updatetime' 值时,此自动命令会对光标下的关键字执行 :ptag 命令。"nested" 允许执行其他自动命令,保证预览窗口语法高亮生效。"silent!" 在找 不到标签时屏幕报错信息。另见 CursorHold 。要关闭该自动命令: :au! CursorHold 以下增强版本可高亮匹配标签,如果光标下没有关键字,跳过 :ptag 的执行,以及若 干其他改进: >vim :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

隐藏缓冲区不在任何窗口中显示,但已载入内存,方便在窗口中快速切换其他缓冲区,无 需每次都重新读取或写入相应文件。 :buffer-! 开启 'hidden' ('hid') 选项时, :edit 、 :next 、 :tag 等切换编辑文件的命令会 保留被丢弃的缓冲区。遍历缓冲区列表的部分命令,即使未开启 'hidden',也可能会隐 藏当前缓冲区。具体条件是: 缓冲区已修改、给出 '!' 强制移出窗口、'autowrite' 关 闭或缓冲区无法写回, 使用任意命令重新编辑隐藏缓冲区,或执行 :bdelete 命令删除该缓冲区时,可取消其 隐藏状态。 'hidden' 为全局选项,作用于全部缓冲区。而 'bufhidden' 选项可单独为特定缓冲区设 置例外,可取值为: <空> 使用全局 'hidden' 值。 hide 隐藏该缓冲区,即使 'hidden' 未置位。 unload 不隐藏,直接卸载该缓冲区,即使 'hidden' 已置位。 delete 删除该缓冲区。 hidden-quit 存在隐藏且已修改的缓冲区时,尝试退出 Vim 会报错并切换到该缓冲区。此时可选择保 存退出 ( :wq ),或强制不保存退出 ( :q! )。注意: 可能存在多个已修改隐藏缓冲区! 缓冲区还可为列表外 (unlisted),这意味着缓冲区存在,但不在缓冲区列表内。 unlisted-buffer :files[!] [flags] :files :buffers[!] [flags] :buffers :ls :ls[!] [flags] 显示全部缓冲区。示例: 1 #h "/test/text" 第 1 行 2u "asdf" 第 0 行 3 %a + "version.c" 第 1 行 [!] 给出时,会一并列出包括列表外缓冲区的所有缓冲区 (此时,"列 表外" 这一术语多少有些不自然…)。 每个缓冲区拥有唯一编号。编号不会变更,可随时通过 ":buffer N" 或 "N CTRL-^" 跳转到编号为 N 的缓冲区。 文件名有以下一些特殊值: "[Prompt]" prompt-buffer 提示缓冲区 "[Popup]" popup-window 弹窗口缓冲区 "[Scratch]" 'buftype' 为 "nofile",或临时缓冲区 "[No Name]" 未指定文件名 对终端窗口缓冲区 terminal-window ,文件名会附带状态信息。 状态标识 (同一列上的标识互斥,不会同时出现): u 列表外缓冲区 (仅带 [!] 时才显示) unlisted-buffer % 当前窗口缓冲区 # 轮换缓冲区,可用 ":e #" 或 CTRL-^ 切换 a 激活缓冲区: 已加载内存且可见 h 隐藏缓冲区: 已加载内存但无窗口展示 hidden-buffer - 'modifiable' 关闭的缓冲区 = 只读缓冲区 R 作业运行中的终端缓冲区 F 作业已结束的终端缓冲区 ? 无作业的终端缓冲区: 可用 `:terminal NONE` 创建 + 已修改缓冲区 x 有读取错误的缓冲区 [flags] 可为以下字符的组合,用于筛选列出的缓冲区: + 已修改缓冲区 - 'modifiable' 关闭的缓冲区 = 只读缓冲区 a 激活缓冲区 u 列表外缓冲区 (优先级高于 "!") h 隐藏缓冲区 x 有读取错误的缓冲区 % 当前缓冲区 # 轮换缓冲区 R 作业运行中的终端缓冲区 F 作业已结束的终端缓冲区 ? 无作业的终端缓冲区: 可用 `:terminal NONE` 创建 t 显示最近访问时间,并按时间为缓冲区排序 标志位的组合使用 "与" 逻辑,例如: h+ 已修改的隐藏缓冲区 a+ 已修改的激活缓冲区 搭配 :filter 时,模式匹配显示的缓冲区名,例如: filter /\.vim/ ls :bad :badd :bad[d] [+lnum] {fname} 文件名 {fname} 尚未在缓冲区列表列出时,加入列表,但不加载文 件。该缓冲区此前被删除但未真正删除时,会被重新加入列表。 给出 "lnum" 时,首次进入该缓冲区时会定位光标到对应行号。注意忽 略其他以 + 开头的命令。 :balt :balt [+lnum] {fname} 类似 :badd ,但同时将当前窗口的轮换文件设为 {fname}。 :[N]bd[elete][!] :bd :bdel :bdelete E516 :bd[elete][!] [N] 卸载缓冲区 [N] (缺省: 当前缓冲区) 并从缓冲区列表移除。 如果缓冲区已修改且未带 [!],本命令会失败,带 [!] 时,丢弃所有 修改。不会改动磁盘文件。所有打开该缓冲区的窗口会被关闭。缓冲区 [N] 为当前缓冲区时,当前窗口会切换到跳跃表里最近一个已加载的缓 冲区。 此时,缓冲区并未被真正删除,它会从缓冲区列表中除名,成为列表外 缓冲区 unlisted-buffer ,缓冲区局部选项值、变量、映射和缩写被 清空。如果 [N] 为该窗口中最后一个列出缓冲区 (即不存在可切换的 其他列出缓冲区),该缓冲区不会被卸载,而是会清空。窗口保留,该 空缓冲区可被重用作新缓冲区 buffer-reuse 。保证每个窗口始终拥 有一个有效的缓冲区。 示例: :.,$-bdelete " 删除从当前缓冲区到倒数第二个缓冲区的所有 " 缓冲区 :%bdelete " 删除所有缓冲区 :bd[elete][!] {bufname} E93 E94 类似 ":bdelete[!] [N]",但按缓冲区名指定缓冲区,见 {bufname} 。 :bd[elete][!] N1 N2 ... 依次对缓冲区 N1、N2、… 执行 :bdelete[!] 。参数可为缓冲区编号 或缓冲区名 (但不能是本身为数值的缓冲区名)。缓冲区名需要包含空 格时,需要在空格前加入反斜杠转义。 :N,Mbd[elete][!] 对编号为 N 到 M (含 N 和 M) 的缓冲区执行 :bdelete[!] 。 :[N]bw[ipeout][!] :bw :bwipe :bwipeout E517 :bw[ipeout][!] {bufname} :N,Mbw[ipeout][!] :bw[ipeout][!] N1 N2 ... 类似 :bdelete ,但真正删除缓冲区。缓冲区所有相关信息全部丢 失。缓冲区中的所有位置标记失效,局部选项丢失,跳跃表和标签栈数 据也被彻底清除等。除非确定无误,尽量不要使用。示例: :.+,$bwipeout " 真正删除当前缓冲区之后的所有缓冲区 :%bwipeout " 真正删除所有缓冲区 :[N]bun[load][!] :bun :bunload E515 :bun[load][!] [N] 卸载缓冲区 [N] (缺省: 当前缓冲区)。释放缓冲区占用内存。缓冲区 仍保留在缓冲区列表中。 如果缓冲区已修改且未带 [!],本命令会失败,带 [!] 时,丢弃所有 修改。所有打开该缓冲区的窗口会被关闭。缓冲区 [N] 为当前缓冲区 时,当前窗口会切换到跳跃表里最近一个已加载的缓冲区。 :bun[load][!] {bufname} 类似 ":bunload[!] [N]",但按缓冲区名指定缓冲区。另见 {bufname} 。 :N,Mbun[load][!] 对编号为 N 到 M (含 N 和 M) 的缓冲区执行 :bunload[!] 。 :bun[load][!] N1 N2 ... 依次对缓冲区 N1、N2、… 执行 :bunload[!] 。参数可为缓冲区编号 或缓冲区名 (但不能是本身为数值的缓冲区名)。缓冲区名需要包含空 格时,需要在空格前加入反斜杠转义。 :[N]b[uffer][!] [+cmd] [N] :b :bu :buf :buffer E86 编辑第 [N] 号缓冲区,不带 [N] 时,默认编辑当前缓冲区。[!] 参见 :buffer-! 。也可用于编辑列表外缓冲区,不会因此而置位 'buflisted'。 编号不接受单引号记法,`:buf 12'345'` 会把 12'345' 当作缓冲区 名。 另见 +cmd 。 :[N]b[uffer][!] [+cmd] {bufname} {bufname} 编辑名为 {bufname} 的缓冲区。可使用部分名称,只要在缓冲区列表 中唯一即可。 注意 不接受本身为数值的缓冲区名;只能用其缓冲区编号进行访问。 以 '+' 开头的缓冲区名也是如此,'+' 会被识别为 +cmd 的开始。 缓冲区名需要包含空格时,需要在空格前加入反斜杠转义。 [!] 参见 :buffer-! 。 也可用于编辑列表外缓冲区,不会因此而置位 'buflisted'。 另见 +cmd 。 :[N]sb[uffer] [+cmd] [N] :sb :sbuffer 分割窗口并编辑第 [N] 号缓冲区,不带 [N] 时,默认编辑当前缓冲 区。分割时,遵循 'switchbuf' 的 "useopen" 设置 (译者注: 也使用 "usetab" 设置)。 也可用于编辑列表外缓冲区,不会因此而置位 'buflisted'。 另见 +cmd 。 :[N]sb[uffer] [+cmd] {bufname} 分割窗口并编辑名为 {bufname} 的缓冲区。也可用于编辑列表外缓 冲区,不会因此而置位 'buflisted'。 备注: 要分割当前缓冲区并另存副本,可改用: :w foobar | sp # 另见 +cmd 。 :[N]bn[ext][!] [+cmd] [N] :bn :bnext E87 跳转到缓冲区列表中往下第 [N] 个缓冲区。[N] 缺省为 1。到达缓冲 区列表末尾会从头循环。[!] 参见 :buffer-! 。 另见 +cmd 。 位于帮助缓冲区时,仅跳转到其后的帮助缓冲区 (如有)。同样,位于 普通 (非帮助) 缓冲区时,仅跳转到其后的普通缓冲区。确保在浏览代 码或文本缓冲区时,不会被帮助文档干扰。下面三条命令行为一致。 :sbn :sbnext :[N]sbn[ext] [+cmd] [N] 分割窗口并跳转到缓冲区列表中往下第 [N] 个缓冲区。到达缓冲区列 表末尾会从头循环。遵循 'switchbuf' 相关设置。 另见 +cmd 。 :[N]bN[ext][!] [+cmd] [N] :bN :bNext :bp :bprevious E88 :[N]bp[revious][!] [+cmd] [N] 跳转到缓冲区列表中往上第 [N] 个缓冲区。[N] 缺省为 1。到达缓冲 区列表顶端会从末尾往上循环。[!] 参见 :buffer-! 。 另见 +cmd 。 :[N]sbN[ext] [+cmd] [N] :sbN :sbNext :sbp :sbprevious :[N]sbp[revious] [+cmd] [N] 分割窗口并跳转到缓冲区列表中往上第 [N] 个缓冲区。到达缓冲区列 表的端会从末尾往上循环。遵循 'switchbuf' 的相关设置。 另见 +cmd 。 :br[ewind][!] [+cmd] :br :bre :brewind 跳转到缓冲区列表中首个缓冲区。缓冲区列表为空时,则跳转到首个列 表外缓冲区。[!] 参见 :buffer-! 。 另见 +cmd 。 :bf[irst] [+cmd] :bf :bfirst 同 :brewind 。 :sbr[ewind] [+cmd] :sbr :sbrewind 分割窗口并跳转到缓冲区列表中首个缓冲区。缓冲区列表为空时,则跳 转到首个列表外缓冲区。遵循 'switchbuf' 的相关设置。 另见 +cmd 。 :sbf[irst] [+cmd] :sbf :sbfirst 同 :sbrewind 。 :bl[ast][!] [+cmd] :bl :blast 跳转到缓冲区列表中最后一个缓冲区。缓冲区列表为空时,则跳转到最 后一个列表外缓冲区。[!] 参见 :buffer-! 。 另见 +cmd 。 :sbl[ast] [+cmd] :sbl :sblast 分割窗口并跳转到缓冲区列表中最后一个缓冲区。缓冲区列表为空时, 则跳转到最后一个列表外缓冲区。遵循 'switchbuf' 的相关设置。 另见 +cmd 。 :[N]bm[odified][!] [+cmd] [N] :bm :bmodified E84 跳转到往下第 [N] 个已修改缓冲区。备注: 同样会找到列表外缓冲 区。如果不存在已修改缓冲区,本命令会失败。 [!] 参见 :buffer-! 。 另见 +cmd 。 :[N]sbm[odified] [+cmd] [N] :sbm :sbmodified 分割窗口并跳转到往下第 [N] 个已修改缓冲区。备注: 同样会找到列 表外缓冲区。如果不存在已修改缓冲区,本命令会失败。遵循 'switchbuf' 的相关设置。 另见 +cmd 。 :[N]unh[ide] [N] :unh :unhide :sun :sunhide :[N]sun[hide] [N] 重新排列界面,为缓冲区列表中每个已加载的缓冲区打开一个窗口。 [N] 给出时,最多打开 N 个窗口。 :[N]ba[ll] [N] :ba :ball :sba :sball :[N]sba[ll] [N] 重新排列界面,为缓冲区列表中每个缓冲区打开一个窗口。[N] 给出 时,最多打开 N 个窗口。'winheight' (加上 :vertical 前缀时则 为 'winwidth') 也会限制打开的窗口数量。 新建窗口时,不触发 Buf/Win Enter/Leave 等自动命令,仅当真正进 入缓冲区/窗口后才会触发。 带 :tab 修饰符时,为每个参数新建标签页。最多打开 'tabpagemax' 个标签页。 备注: 以上所有切换缓冲区的命令,会保留 'readonly' 的原值。这和 :edit 命令不 同,后者每次读取文件时都会重新设置 'readonly' 标志位。

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

除了用于存放文本,缓冲区也可用于其他用途。可通过以下选项控制缓冲区行为: 'bufhidden' 缓冲区不再在窗口里显示时的处理方式 'buftype' 缓冲区类型 'swapfile' 缓冲区是否需要交换文件 'buflisted' 缓冲区是否出现在缓冲区列表 常用缓冲区类型: quickfix 存放错误列表或位置列表。参见 :cwindow 和 :lwindow 。相关命 令会将 'buftype' 设为 "quickfix"。请勿手动修改!'swapfile' 关 闭。 help 存放帮助文档。只能用 :help 命令创建,帮助缓冲区通过内部标志 位标识,该标志位不可更改。此类缓冲区会复位 'buflisted' 选项。 terminal 终端窗口缓冲区,见 terminal 。作业结束前,无法读写缓冲区内 容。 directory 展示目录内容。可供文件浏览插件使用。此类缓冲区创建时,会自动设 置以下选项: :setlocal buftype=nowrite :setlocal bufhidden=delete :setlocal noswapfile 缓冲区名为目录路径,执行 :cd 等命令时会自动更新。 scratch-buffer scratch 存放可随时丢弃的文本。缓冲区在窗口关闭时会保留,必须手动删除。 相关设置如下: :setlocal buftype=nofile :setlocal bufhidden=hide :setlocal noswapfile 可自定义缓冲区名,用于标识缓冲区。 unlisted-buffer unlisted 不在缓冲区列表中列出。不用于常规编辑,多用于显示帮助文件、保存 文件名或位置标记。 :bdelete 命令也会设置该属性,因而不会真正 删除缓冲区。相关设置如下: :setlocal nobuflisted vim:tw=78:ts=8:noet:ft=help:norl: