Windows

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


使用多个窗口和缓冲区进行编辑。 缓冲区
这里解释了为使用多个窗口和缓冲区而添加的命令。此外,还解释了一些在与多个窗口组合使用时操作方式不同的命令。
用户手册第 7 章和第 8 章 usr_07.txt usr_08.txt 解释了基本原理。
总结:缓冲区是指内存中的文件文本。窗口是缓冲区的视窗。标签页是窗口的集合。
窗口是缓冲区的视窗。您可以在一个缓冲区上使用多个窗口,或者在不同的缓冲区上使用多个窗口。
缓冲区是指加载到内存中用于编辑的文件。原始文件在您将缓冲区写入文件之前保持不变。
缓冲区可以处于以下三种状态之一:
活动缓冲区
活动:缓冲区显示在窗口中。如果此缓冲区存在文件,则该文件已读入缓冲区。缓冲区可能已在之后被修改,因此与文件不同。 隐藏缓冲区
隐藏:缓冲区未显示。如果此缓冲区存在文件,则该文件已读入缓冲区。否则,它与活动缓冲区相同,只是您看不到它。 非活动缓冲区
非活动:缓冲区未显示且不包含任何内容。如果曾经加载过文件,则会记住缓冲区的选项。它可以包含来自 shada 文件的标记。但缓冲区不包含文本。
在表格中
状态 显示 加载 ":buffers"
在窗口中 显示
活动 是 是 'a' 隐藏 否 是 'h' 非活动 否 否 ' '
缓冲区重用
每个缓冲区都有一个唯一的编号,该编号在 Vim 会话中不会改变。可以使用 bufnr()bufname() 函数在缓冲区名称和缓冲区编号之间进行转换。有一个例外:如果创建了一个新的空缓冲区,并且没有修改它,那么在将另一个文件加载到该缓冲区时,将重用该缓冲区。这也意味着缓冲区编号不会改变。
主 Vim 窗口可以包含多个拆分窗口。还有标签页 标签页,每个标签页可以包含多个窗口。
可聚焦
如果窗口可聚焦,则它属于“导航堆栈”,也就是说,诸如 :windo、CTRL-W 等编辑器命令会将该窗口视为可以设置为“当前窗口”的窗口。非可聚焦窗口将被这些命令跳过(尽管可以通过 nvim_set_current_win() 明确地聚焦它)。
窗口(尤其是浮动窗口)可以拥有许多其他 api-win_config 属性,例如“隐藏”和“固定”,这些属性也会影响行为。
窗口 ID winid windowid 每个窗口都有一个唯一的标识符,称为窗口 ID。此标识符在 Vim 会话中不会改变。可以使用 win_getid()win_id2tabwin() 函数在窗口/标签页编号和标识符之间进行转换。还存在窗口编号,该编号在打开或关闭窗口时可能会改变,请参阅 winnr()。窗口编号仅在一个特定标签页中有效。窗口 ID 在所有标签页中都有效。对于大多数采用窗口 ID 或窗口编号的函数,窗口编号仅适用于当前标签页,而窗口 ID 可以指代任何标签页中的窗口。

2. 启动 Vim 窗口启动

默认情况下,Vim 以一个窗口启动,就像 Vi 一样。
Vim 的 "-o" 和 "-O" 参数可用于为参数列表中的每个文件打开一个窗口。"-o" 参数将水平拆分窗口;"-O" 参数将垂直拆分窗口。如果同时给出 "-o" 和 "-O",则将使用遇到的最后一个参数来确定拆分方向。例如,这将打开三个窗口,水平拆分:
vim -o file1 file2 file3
"-oN",其中 N 是十进制数,将打开 N 个水平拆分的窗口。如果文件名比窗口多,则只打开 N 个窗口,一些文件将不会获得窗口。如果窗口比文件名多,则最后几个窗口将编辑空缓冲区。类似地,"-ON" 将打开 N 个垂直拆分的窗口,并具有相同的限制。
如果文件名很多,窗口会变得很小。您可能需要设置 'winheight' 和/或 'winwidth' 选项以创建可行的状况。
Buf/Win Enter/Leave 自动命令 在打开新窗口和读取文件时不会执行,而只会在真正进入这些窗口时执行。
状态栏
将使用状态栏来分隔窗口。 'laststatus' 选项指示最后一个窗口是否也有状态栏:'laststatus' = 0 从不显示状态栏 'laststatus' = 1 如果有多个窗口,则显示状态栏 'laststatus' = 2 始终显示状态栏 'laststatus' = 3 在底部显示一个全局状态栏,而不是为每个窗口显示一个状态栏
您可以使用 'statusline' 选项更改状态栏的内容。此选项可以是窗口的本地选项,因此您可以在每个窗口中拥有不同的状态栏。
通常,使用反转来显示状态栏。这可以通过 hl-StatusLine 突出显示组进行更改。如果状态栏没有使用任何突出显示,则“^”字符用于当前窗口,而“=”用于其他窗口。如果启用了 'mouse',则可以拖动状态栏以调整窗口大小。
填充行
窗口中最后一个缓冲区行后的行称为填充行。默认情况下,这些行以波浪号 (~) 字符开头。 'fillchars' 选项中的 "eob" 项可用于更改此字符。默认情况下,这些字符被突出显示为 NonText (hl-NonText)。 EndOfBuffer 突出显示组 (hl-EndOfBuffer) 可用于更改填充字符的突出显示方式。

3. 打开和关闭窗口 打开窗口

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] [file] :sp :split 将当前窗口拆分为两个窗口。结果是两个在同一文件上的视窗。
将新窗口的高度设置为 N(默认为当前窗口高度的一半)。减小当前窗口的高度以腾出空间(以及其他窗口,如果设置了 'equalalways' 选项,'eadirection' 不是 "hor",并且其中一个窗口比当前窗口或新窗口更高)。
如果给出了 [file],它将在新窗口中进行编辑。如果它没有加载到任何缓冲区中,它将被读取。否则,新窗口将使用已经加载的缓冲区。
注意: CTRL-S 并非在所有终端上都能正常工作,并且可能会阻塞后续输入,使用 CTRL-Q 继续操作。另请参阅 ++opt+cmdE242 E1159 在自动命令中拆分窗口时要小心,如果在进行其他窗口布局更改时发生这种情况,可能会弄乱窗口布局。
CTRL-W CTRL-V CTRL-W_CTRL-V
CTRL-W v CTRL-W_v
:[N]vs[plit] [++opt] [+cmd] [file] :vs :vsplit:split 相似,但垂直拆分。如果满足以下条件,窗口将水平展开:1. 未指定宽度,2. 设置了 'equalalways' 选项,3. 'eadirection' 不是 "ver",并且 4. 另一个窗口比当前窗口或新窗口更宽。如果给出了 N,则尽可能将新窗口的宽度设置为 N 列。 注意: 在其他地方,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+cmd。如果 'fileformats' 不为空,则将使用给出的第一个格式作为新缓冲区的格式。如果 'fileformats' 为空,则将使用当前缓冲区的 'fileformat' 格式。这可以通过 ++opt 参数进行覆盖。自动命令按以下顺序执行:1. 当前窗口的 WinLeave 2. 新窗口的 WinEnter 3. 当前缓冲区的 BufLeave 4. 新缓冲区的 BufEnter 此操作类似于首先执行 ":split",然后执行 ":enew" 命令。
:[N]new [++opt] [+cmd] {file} :[N]sp[lit] [++opt] [+cmd] {file} :split_f
创建一个新窗口并在其中开始编辑文件 {file}。此操作几乎类似于首先执行 ":split",然后执行 ":edit" 命令,但原始窗口中的备用文件名将设置为 {file}。如果给出了 [+cmd],则在文件加载后执行该命令 +cmd。另请参阅 ++opt。将新窗口的高度设置为 N(默认为现有高度的一半)。减小当前窗口的高度以腾出空间(以及其他窗口,如果设置了 'equalalways' 选项)。
:[N]vne[w] [++opt] [+cmd] [file] :vne :vnew:new 相似,但垂直拆分。如果设置了 'equalalways' 选项,并且 'eadirection' 不是 "ver",则窗口将水平展开,除非指定了宽度。
:[N]sv[iew] [++opt] [+cmd] [file] :sv :sview 拆分视图 与 ":split" 相同,但为该缓冲区设置 'readonly' 选项。
:[N]sf[ind] [++opt] [+cmd] {file} :sf :sfi :sfind splitfind 与 ":split" 相同,但在 'path' 中搜索 {file},类似于 :find。如果未找到 {file},则不会拆分。
CTRL-W CTRL-^ CTRL-W_CTRL-^ CTRL-W_^ CTRL-W ^ 将当前窗口拆分为两个,并编辑备用文件。如果给出计数 N,则拆分当前窗口并编辑缓冲区 N。类似于 ":sp #" 和 ":sp #N",但它允许另一个缓冲区没有名称。此命令与 CTRL-^ 的行为匹配,不同之处在于它首先拆分一个窗口。
CTRL-W ge CTRL-W_ge
将当前窗口作为外部窗口分离。仅在使用支持 ui-multigrid 的 UI 时可用。
请注意,'splitbelow''splitright' 选项会影响新窗口的显示位置。 E36
如果空间不足,创建窗口将失败。每个窗口至少需要一行和一列屏幕,有时更多。选项 'winminheight''winminwidth' 相关。
:vert :vertical :vert[ical] {cmd} 执行 {cmd}。如果它包含拆分窗口的命令,则它将被垂直拆分。对于 vertical wincmd =,窗口将仅在垂直方向上均衡。不适用于 :execute:normal
:hor :horizontal :hor[izontal] {cmd} 执行 {cmd}。目前仅对以下命令有影响
:wincmd =: 仅在水平方向上均衡窗口。
:terminal: 在拆分的窗口中打开一个 terminal 缓冲区。
:checkhealth: 在拆分的窗口中打开一个 healthcheck 缓冲区。
: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
:bo :botright :bo[tright] {cmd} 执行 {cmd}。如果它包含拆分窗口的命令,则它将出现在底部并占据 Vim 窗口的全部宽度。当拆分是垂直方向时,窗口将出现在最右侧并占据 Vim 窗口的全部高度。不适用于 :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 the first window
:$quit  " quit the last window
:9quit  " quit the last window
        " if there are fewer than 9 windows opened
:-quit  " quit the previous window
:+quit  " quit the next window
:+2quit " quit the second next window
关闭帮助窗口时,如果它不是唯一的窗口,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} 窗口。
'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'unloaddeletewipe)。如果窗口是当前选项卡页中的最后一个,则选项卡页将被关闭。 tab-page
'hidden' 的值与此命令无关。对缓冲区的更改不会写入,也不会丢失,因此这是一个“安全”命令。
:hid[e] {cmd} 使用设置的 'hidden' 执行 {cmd}{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' 选项设置时,已修改的缓冲区将被写入。否则,具有已修改缓冲区的窗口不会被移除,除非给出 [!],否则它们将变为隐藏。但是已修改的缓冲区永远不会被放弃,因此更改不会丢失。
:fc :fclose :[count]fc[lose][!] 关闭具有最高 zindex 值的 [count] 个浮动窗口。'!' 用于关闭所有浮动窗口。

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 不使用计数:将光标移动到当前窗口下方/右侧的 focusable 窗口。如果没有(focusable)窗口在下方或右侧,则转到左上角窗口。使用计数:转到第 N 个窗口(窗口从左上角到右下角编号)。要获取窗口编号,请参见 bufwinnr()winnr()。当 N 大于窗口数时,转到最后一个窗口。
CTRL-W_W
CTRL-W W 不带计数:将光标移动到当前窗口上方/左侧的 可聚焦 窗口。如果上方或左侧没有窗口,则移动到右下角的窗口。带计数:移动到第 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 移动到上一个(最近访问的)窗口。
CTRL-W_P E441 CTRL-W P 移动到预览窗口。如果不存在预览窗口,则会报错。
如果处于可视模式,并且新窗口不属于同一个缓冲区,则可视模式将结束。如果窗口属于同一个缓冲区,则光标位置将设置为保持相同的可视区域被选中。
:winc :wincmd 这些命令也可以用 ":wincmd" 执行。
:[count]winc[md] {arg} :winc[md] [count] {arg} 类似于执行 CTRL-W [count] {arg}。示例
:wincmd j
移动到当前窗口下方的窗口。当无法使用普通模式时,此命令很有用(例如 CursorHold 自动命令事件)。或者当普通模式命令不方便时。计数也可以是窗口编号。示例
:exe nr .. "wincmd w"
此命令将移动到窗口 "nr"。
注意: 所有 CTRL-W 命令也可以用 :wincmd 执行,这些地方不能使用普通模式命令或使用起来不方便(例如在基于浏览器的终端中)。

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,但它应用于当前窗口,并且不会创建新窗口。
CTRL-W_L
CTRL-W L 将当前窗口移动到最右侧,使用整个屏幕高度。这类似于 :vert botright split,但它应用于当前窗口,并且不会创建新窗口。
CTRL-W_T
CTRL-W T 将当前窗口移动到新的标签页。如果当前标签页中只有一个窗口,则此操作会失败。这类似于 :tab split,但之前的窗口会被关闭。当指定计数时,新的标签页将在具有此索引的标签页之前打开。否则,它将在当前标签页之后打开。

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 之后使用:将宽度减少 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(默认值为:最高可能高度)。
:{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(默认值为:最宽可能宽度)。
您也可以通过使用鼠标上下拖动状态栏来调整窗口大小。或者通过左右拖动垂直分隔线。这只有在正在使用的 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' 设置。这些是硬性值,窗口永远不会变小。
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 的示例值
{
   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() 函数。
WinScrolledWinResized 在添加第一个自动命令时不会触发,而是在第一次滚动或调整大小之后才会触发。它们可能会在切换到另一个标签页时触发。
预计执行的命令不会导致窗口大小或滚动更改。如果确实发生了更改,事件将很快再次触发。换句话说:在触发事件之前,当前大小和滚动位置将被存储并用于确定是否发生了更改。

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

参数列表缓冲区列表含义
1. :[N]argument [N] 11. :[N]buffer [N] 到参数/缓冲区 N 2. :[N]next [文件 ..] 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 [文件 ..] 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" 时,参数列表中的位置保持不变,但您并没有编辑该位置的文件。为了表示这一点,文件消息(以及标题,如果您有一个)会显示 "(file (N) of M)",其中 "(N)" 是文件列表中的当前位置,而 "M" 是文件列表中的文件数量。
参数列表中的所有条目都将添加到缓冲区列表中。因此,您也可以使用缓冲区列表命令(例如 ":bnext")访问它们。
:[N]al[l][!] [N] :al :all :sal :sall :[N]sal[l][!] [N] 重新排列屏幕,为每个参数打开一个窗口。所有其他窗口都将关闭。当给出计数时,这是要打开的最大窗口数。使用 :tab 修饰符为每个参数打开一个标签页。当参数多于 'tabpagemax' 时,其余参数将在最后一个标签页中成为拆分窗口。当 'hidden' 选项设置时,所有关闭窗口中的缓冲区都将隐藏。当 'hidden' 未设置且 'autowrite' 选项设置时,将写入已修改的缓冲区。否则,包含已修改缓冲区的窗口将不会被移除,除非给出 [!],否则它们将被隐藏。但是,已修改的缓冲区永远不会被放弃,因此更改不会丢失。[N] 是要打开的最大窗口数。 'winheight' 也限制了打开的窗口数('winwidth' 如果预先添加了 :vertical)。新窗口不会在此处执行 Buf/Win Enter/Leave 自动命令,这只会发生在它们真正被进入时。如果自动命令在此命令繁忙时更改窗口布局,则会给出错误。 E249
:[N]sa[rgument][!] [++opt] [+cmd] [N] :sa :sargument ":split | argument [N]" 的简写:拆分窗口并转到第 N 个参数。但是,如果没有这样的参数,则不会拆分窗口。另请参见 ++opt+cmd
:[N]sn[ext][!] [++opt] [+cmd] [文件 ..] :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}
如果文件已在窗口中打开,则切换到该窗口。
如果文件未在窗口中打开,则在当前窗口中编辑文件。如果当前缓冲区无法 放弃,则会先拆分窗口。
不在参数列表中或未完全宽度的窗口将尽可能关闭。 参数列表 将设置,就像使用 :next 命令一样。此命令的目的是它可以从想要 Vim 编辑另一个文件的程序中使用,例如调试器。使用 :tab 修饰符时,每个参数将在一个标签页中打开。如果最后一个窗口为空,则使用它。另请参见 ++opt+cmd

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

:windo
:[range]windo {cmd} 在每个 可聚焦 窗口中执行 {cmd},或者只针对窗口编号在给定 [range] 中的窗口执行。它就像执行以下操作一样
CTRL-W t
:{cmd}
CTRL-W w
:{cmd}
etc.
这只会作用于当前标签页。如果在一个窗口上检测到错误,则不会访问其他窗口。最后一个窗口(或发生错误的位置)将变为当前窗口。 {cmd} 可以包含 '|' 来连接多个命令。 {cmd} 不得打开或关闭窗口,也不得重新排列它们。
另请参见 :tabdo:argdo:bufdo:cdo:ldo:cfdo:lfdo
:bufdo
:[range]bufdo[!] {cmd} 在缓冲区列表中的每个缓冲区中执行 {cmd},或者如果给出 [range],则只针对缓冲区编号在 [range] 中的缓冲区执行。它就像执行以下操作一样
:bfirst
:{cmd}
:bnext
:{cmd}
etc.
如果当前文件无法 放弃 且未给出 [!],则命令将失败。如果在一个缓冲区上检测到错误,则不会访问其他缓冲区。未列出的缓冲区将被跳过。最后一个缓冲区(或发生错误的位置)将变为当前缓冲区。 {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]" 并为找到的标签拆分窗口。另请参见 :tag
CTRL-W ] CTRL-W_] CTRL-W_CTRL-] CTRL-W CTRL-] 将当前窗口拆分成两个。使用光标下的标识符作为标签并跳转到新上部窗口中的标签。在 Visual 模式下,使用 Visually 选定的文本作为标签。将新窗口的高度设置为 N。
CTRL-W_g]
CTRL-W g ] 将当前窗口拆分成两个。使用光标下的标识符作为标签并对新上部窗口中的标签执行 ":tselect"。在 Visual 模式下,使用 Visually 选定的文本作为标签。将新窗口的高度设置为 N。
CTRL-W_g_CTRL-]
CTRL-W g CTRL-] 将当前窗口拆分成两个。使用光标下的标识符作为标签并对新上部窗口中的标签执行 ":tjump"。在 Visual 模式下,使用 Visually 选定的文本作为标签。将新窗口的高度设置为 N。
CTRL-W f CTRL-W_f CTRL-W_CTRL-F CTRL-W CTRL-F 将当前窗口拆分成两个。编辑光标下的文件名。就像 ":split gf" 一样,但是如果文件不存在,则不会拆分窗口。使用 'path' 变量作为要查找文件的目录名列表。当前文件的路径也用于搜索文件名。如果名称是看起来像 "type://machine/path" 的超文本链接,则只使用 "/path"。如果给出计数,则编辑第 count 个匹配文件。
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

预览窗口是一个特殊的窗口,用于显示(预览)另一个文件。它通常是一个小窗口,用于显示包含文件或函数定义。
每个标签页只能有一个预览窗口。它通过以下命令之一创建。可以使用 'previewheight' 选项指定预览窗口打开时的高度。'previewwindow' 选项在预览窗口中设置,以便能够识别它。 'winfixheight' 选项用于在打开/关闭其他窗口时保持相同的高度。
:pta :ptag :pta[g][!] [tagname] 执行 ":tag[!] [tagname]",并在“预览”窗口中显示找到的标签,而不会更改当前缓冲区或光标位置。如果“预览”窗口已经存在,则会重复使用它(就像帮助窗口一样)。如果打开一个新的窗口,则 'previewheight' 用于窗口的高度。另请参见 :tag。有关示例,请参见以下内容。 CursorHold-example:tag 的小差异:当 [tagname] 等于已显示的标签时,匹配标签列表中的位置不会重置。这使得 CursorHold 示例在 :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'
: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>")
当光标在使用 'updatetime' 设置的时间内没有移动时,这将导致对光标下的关键字执行 ":ptag" 操作。"++nested" 使其他自动命令被执行,从而使语法高亮在预览窗口中生效。"silent!" 避免在找不到标签时出现错误消息。另请参见 CursorHold。要再次禁用它
:au! CursorHold
一个很好的补充是突出显示找到的标签,避免在光标下没有单词时执行 ":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

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

隐藏缓冲区不会在窗口中显示,但仍然加载到内存中。这使得在文件之间跳转成为可能,而无需每次在窗口中获取另一个缓冲区时都读取或写入文件。
: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-buffer
:files[!] [flags] :files
:buffers[!] [flags] :buffers :ls :ls[!] [flags] 显示所有缓冲区。例子
1 #h "/test/text" line 1
2u "asdf" line 0
3 %a + "version.c" line 1
当包含 [!] 时,列表将显示未列出的缓冲区(术语“未列出”在此时有点令人困惑...)。
每个缓冲区都有一个唯一的编号。该编号不会改变,因此您可以始终使用 ":buffer N" 或 "N CTRL-^" 转到特定缓冲区,其中 N 是缓冲区编号。
指示器(同一列中的字符是互斥的): u 未列出的缓冲区(仅在使用 [!] 时显示) unlisted-buffer % 当前窗口中的缓冲区 # ":e #" 和 CTRL-^ 的备用缓冲区 a 活动缓冲区:它已加载并可见 h 隐藏的缓冲区:它已加载,但当前未在窗口中显示 hidden-buffer - 'modifiable' 关闭的缓冲区 = 只读缓冲区 R 带有正在运行作业的终端缓冲区 F 带有已完成作业的终端缓冲区 ? 没有作业的终端缓冲区::terminal NONE + 修改过的缓冲区 x 带有读取错误的缓冲区
[flags] 可以是以下字符的组合,这些字符限制了要列出的缓冲区: + 修改过的缓冲区 - 'modifiable' 关闭的缓冲区 = 只读缓冲区 a 活动缓冲区 u 未列出的缓冲区(覆盖 "!") h 隐藏的缓冲区 x 带有读取错误的缓冲区 % 当前缓冲区 # 备用缓冲区 R 带有正在运行作业的终端缓冲区 F 带有已完成作业的终端缓冲区 t 显示上次使用时间并对缓冲区进行排序 组合标志意味着它们是 "and"ed 运算,例如: 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,并且缓冲区的选项值、变量和映射/缩写被清除。例子
:.,$-bdelete   "delete buffers from the current one to
               " last but one
:%bdelete      " delete all buffers
:bdelete[!] {bufname} E93 E94 与 ":bdelete[!] [N]" 相似,但缓冲区由名称给出,参见 {bufname}
:bdelete[!] N1 N2 ... 对缓冲区 N1、N2 等执行 ":bdelete[!]"。参数可以是缓冲区编号或缓冲区名称(但不能是数字的缓冲区名称)。在缓冲区名称中的空格之前插入反斜杠。
:N,Mbdelete[!] 对范围 N 到 M 包含 的所有缓冲区执行 ":bdelete[!]"。
:[N]bw[ipeout][!] :bw :bwipe :bwipeout E517 :bw[ipeout][!] {bufname} :N,Mbw[ipeout][!] :bw[ipeout][!] N1 N2 ... 与 :bdelete 相似,但确实删除了缓冲区。与缓冲区相关的所有内容都将丢失。此缓冲区中的所有标记都将失效,选项设置将丢失,跳转列表和标签栈数据将被清除,等等。除非您知道自己在做什么,否则不要使用它。例子
:.+,$bwipeout   " wipe out all buffers after the current
                " one
:%bwipeout            " wipe out all buffers
:[N]bun[load][!] :bun :bunload E515 :bun[load][!] [N] 卸载缓冲区 [N](默认:当前缓冲区)。为该缓冲区分配的内存将被释放。缓冲区将保留在缓冲区列表中。如果缓冲区已更改,则会失败,除非指定了 [!],在这种情况下,更改将丢失。此缓冲区的任何窗口都将关闭。如果缓冲区 [N] 是当前缓冲区,则将显示另一个缓冲区。这是指向已加载缓冲区的跳转列表中最新的条目。
:bunload[!] {bufname} 与 ":bunload[!] [N]" 相似,但缓冲区由名称给出。另请参见 {bufname}
:N,Mbunload[!] 对范围 N 到 M 包含 的所有缓冲区执行 ":bunload[!]"。
:bunload[!] N1 N2 ... 对缓冲区 N1、N2 等执行 ":bunload[!]"。参数可以是缓冲区编号或缓冲区名称(但不能是数字的缓冲区名称)。在缓冲区名称中的空格之前插入反斜杠。
:[N]b[uffer][!] [+cmd] [N] :b :bu :buf :buffer E86 编辑缓冲区列表中的缓冲区 [N]。如果没有给出 [N],则当前缓冲区保持被编辑。有关 [!],请参阅 :buffer-!。这也会编辑缓冲区列表中不存在的缓冲区,而不会设置 'buflisted' 标志。另请参阅 +cmd
:[N]b[uffer][!] [+cmd] {bufname} {bufname}
编辑缓冲区列表中的缓冲区 {bufname}。部分名称也可以使用,只要它在缓冲区列表中是唯一的。请注意,名称为数字的缓冲区不能用该名称引用;请改用缓冲区编号。在缓冲区名称中的空格之前插入反斜杠。有关 [!],请参阅 :buffer-!。这也会编辑缓冲区列表中不存在的缓冲区,而不会设置 'buflisted' 标志。另请参阅 +cmd
:[N]sb[uffer] [+cmd] [N] :sb :sbuffer 拆分窗口并编辑缓冲区列表中的缓冲区 [N]。如果没有给出 [N],则编辑当前缓冲区。在拆分时会尊重 'switchbuf' 的 "useopen" 设置。这也会编辑缓冲区列表中不存在的缓冲区,而不会设置 'buflisted' 标志。另请参阅 +cmd
:[N]sb[uffer] [+cmd] {bufname} 拆分窗口并编辑缓冲区列表中的缓冲区 {bufname}。这也会编辑缓冲区列表中不存在的缓冲区,而不会设置 'buflisted' 标志。 注意:如果您想做的是拆分缓冲区,并在另一个名称下创建副本,您可以这样操作
:w foobar | sp #
另请参阅 +cmd
:[N]bn[ext][!] [+cmd] [N] :bn :bnext [b 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 ]b E88 :[N]bp[revious][!] [+cmd] [N] 转到缓冲区列表中的第 [N] 个上一个缓冲区。[N] 默认值为 1。在缓冲区列表开头循环。有关 [!],请参阅 :buffer-!'switchbuf'。另请参阅 +cmd
:[N]sbN[ext] [+cmd] [N] :sbN :sbNext :sbp :sbprevious :[N]sbp[revious] [+cmd] [N] 拆分窗口并转到缓冲区列表中的第 [N] 个上一个缓冲区。在缓冲区列表开头循环。使用 'switchbuf'。另请参阅 +cmd
:br[ewind][!] [+cmd] :br :bre :brewind [B 转到缓冲区列表中的第一个缓冲区。如果缓冲区列表为空,则转到第一个未列出的缓冲区。有关 [!],请参阅 :buffer-!
:bf[irst] [+cmd] :bf :bfirst:brewind 相同。另请参阅 +cmd
:sbr[ewind] [+cmd] :sbr :sbrewind 拆分窗口并转到缓冲区列表中的第一个缓冲区。如果缓冲区列表为空,则转到第一个未列出的缓冲区。尊重 'switchbuf' 选项。另请参阅 +cmd
:sbf[irst] [+cmd] :sbf :sbfirst 与 ":sbrewind" 相同。
:bl[ast][!] [+cmd] :bl :blast ]B 转到缓冲区列表中的最后一个缓冲区。如果缓冲区列表为空,则转到最后一个未列出的缓冲区。有关 [!],请参阅 :buffer-!
:sbl[ast] [+cmd] :sbl :sblast 拆分窗口并转到缓冲区列表中的最后一个缓冲区。如果缓冲区列表为空,则转到最后一个未列出的缓冲区。尊重 'switchbuf' 选项。
:[N]bm[odified][!] [+cmd] [N] :bm :bmodified E84 转到第 [N] 个下一个已修改的缓冲区。 注意:此命令还会查找未列出的缓冲区。如果没有已修改的缓冲区,该命令将失败。
:[N]sbm[odified] [+cmd] [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 自动命令不会在此处为新窗口执行,只有在实际进入时才会执行。当使用 :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
Main
命令索引
快速参考