Windows
Nvim :help
页面,生成 于 源代码,使用 tree-sitter-vimdoc 解析器。
这里解释了为使用多个窗口和缓冲区而添加的命令。此外,还解释了一些在与多个窗口组合使用时操作方式不同的命令。
总结:缓冲区是指内存中的文件文本。窗口是缓冲区的视窗。标签页是窗口的集合。
窗口是缓冲区的视窗。您可以在一个缓冲区上使用多个窗口,或者在不同的缓冲区上使用多个窗口。
缓冲区是指加载到内存中用于编辑的文件。原始文件在您将缓冲区写入文件之前保持不变。
缓冲区可以处于以下三种状态之一:
活动缓冲区 活动:缓冲区显示在窗口中。如果此缓冲区存在文件,则该文件已读入缓冲区。缓冲区可能已在之后被修改,因此与文件不同。
隐藏缓冲区隐藏:缓冲区未显示。如果此缓冲区存在文件,则该文件已读入缓冲区。否则,它与活动缓冲区相同,只是您看不到它。
非活动缓冲区非活动:缓冲区未显示且不包含任何内容。如果曾经加载过文件,则会记住缓冲区的选项。它可以包含来自
shada 文件的标记。但缓冲区不包含文本。
在表格中
状态 显示 加载 ":buffers"
在窗口中 显示
活动 是 是 'a' 隐藏 否 是 'h' 非活动 否 否 ' '
缓冲区重用 每个缓冲区都有一个唯一的编号,该编号在 Vim 会话中不会改变。可以使用
bufnr() 和
bufname() 函数在缓冲区名称和缓冲区编号之间进行转换。有一个例外:如果创建了一个新的空缓冲区,并且没有修改它,那么在将另一个文件加载到该缓冲区时,将重用该缓冲区。这也意味着缓冲区编号不会改变。
主 Vim 窗口可以包含多个拆分窗口。还有标签页
标签页,每个标签页可以包含多个窗口。
默认情况下,Vim 以一个窗口启动,就像 Vi 一样。
Vim 的 "-o" 和 "-O" 参数可用于为参数列表中的每个文件打开一个窗口。"-o" 参数将水平拆分窗口;"-O" 参数将垂直拆分窗口。如果同时给出 "-o" 和 "-O",则将使用遇到的最后一个参数来确定拆分方向。例如,这将打开三个窗口,水平拆分:
vim -o file1 file2 file3
"-oN",其中 N 是十进制数,将打开 N 个水平拆分的窗口。如果文件名比窗口多,则只打开 N 个窗口,一些文件将不会获得窗口。如果窗口比文件名多,则最后几个窗口将编辑空缓冲区。类似地,"-ON" 将打开 N 个垂直拆分的窗口,并具有相同的限制。
Buf/Win Enter/Leave
自动命令 在打开新窗口和读取文件时不会执行,而只会在真正进入这些窗口时执行。
您可以使用
'statusline' 选项更改状态栏的内容。此选项可以是窗口的本地选项,因此您可以在每个窗口中拥有不同的状态栏。
通常,使用反转来显示状态栏。这可以通过
hl-StatusLine 突出显示组进行更改。如果状态栏没有使用任何突出显示,则“^”字符用于当前窗口,而“=”用于其他窗口。如果启用了
'mouse',则可以拖动状态栏以调整窗口大小。
如果给出了 [file],它将在新窗口中进行编辑。如果它没有加载到任何缓冲区中,它将被读取。否则,新窗口将使用已经加载的缓冲区。
注意: CTRL-S
并非在所有终端上都能正常工作,并且可能会阻塞后续输入,使用
CTRL-Q
继续操作。另请参阅
++opt 和
+cmd。
E242 E1159 在自动命令中拆分窗口时要小心,如果在进行其他窗口布局更改时发生这种情况,可能会弄乱窗口布局。
:[N]new [++opt] [+cmd]
{file}
:[N]sp[lit] [++opt] [+cmd]
{file}
:split_f创建一个新窗口并在其中开始编辑文件
{file}
。此操作几乎类似于首先执行 ":split",然后执行 ":edit" 命令,但原始窗口中的备用文件名将设置为
{file}
。如果给出了 [+cmd],则在文件加载后执行该命令
+cmd。另请参阅
++opt。将新窗口的高度设置为 N(默认为现有高度的一半)。减小当前窗口的高度以腾出空间(以及其他窗口,如果设置了
'equalalways' 选项)。
CTRL-W
CTRL-^
CTRL-W_CTRL-^ CTRL-W_^ CTRL-W ^ 将当前窗口拆分为两个,并编辑备用文件。如果给出计数 N,则拆分当前窗口并编辑缓冲区 N。类似于 ":sp #" 和 ":sp #N",但它允许另一个缓冲区没有名称。此命令与
CTRL-^ 的行为匹配,不同之处在于它首先拆分一个窗口。
:hor :horizontal :hor[izontal]
{cmd}
执行
{cmd}
。目前仅对以下命令有影响
:wincmd =
: 仅在水平方向上均衡窗口。
: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”文件窗口。
关闭窗口
当
'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' 设置时,或者当缓冲区已更改并且使用了 [!] 时,缓冲区将变为隐藏(除非有另一个窗口正在编辑它)。
此命令在以下情况下失败:
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}
。
{cmd}
执行后,将恢复
'hidden' 的先前值。示例
:hide edit Makefile
这将编辑“Makefile”,如果当前缓冲区有任何更改,则将其隐藏。
当
'hidden' 未设置,并且
'autowrite' 选项设置时,已修改的缓冲区将被写入。否则,具有已修改缓冲区的窗口不会被移除,除非给出 [!],否则它们将变为隐藏。但是已修改的缓冲区永远不会被放弃,因此更改不会丢失。
:fc :fclose :[count]fc[lose][!] 关闭具有最高 zindex 值的 [count] 个浮动窗口。'!' 用于关闭所有浮动窗口。
CTRL-W_W CTRL-W W 不带计数:将光标移动到当前窗口上方/左侧的
可聚焦 窗口。如果上方或左侧没有窗口,则移动到右下角的窗口。带计数:移动到第 N 个窗口,类似于
CTRL-W
w。
如果处于可视模式,并且新窗口不属于同一个缓冲区,则可视模式将结束。如果窗口属于同一个缓冲区,则光标位置将设置为保持相同的可视区域被选中。
:[count]winc[md]
{arg}
:winc[md] [count]
{arg}
类似于执行
CTRL-W
[count]
{arg}
。示例
:wincmd j
移动到当前窗口下方的窗口。当无法使用普通模式时,此命令很有用(例如
CursorHold 自动命令事件)。或者当普通模式命令不方便时。计数也可以是窗口编号。示例
:exe nr .. "wincmd w"
此命令将移动到窗口 "nr"。
注意: 所有
CTRL-W
命令也可以用
:wincmd 执行,这些地方不能使用普通模式命令或使用起来不方便(例如在基于浏览器的终端中)。
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
,但之前的窗口会被关闭。当指定计数时,新的标签页将在具有此索引的标签页之前打开。否则,它将在当前标签页之后打开。
:{winnr}res[ize] [+-]N 类似于上面的 :resize
,但将大小应用于窗口 {winnr}
而不是当前窗口。
z{nr}<CR> 将当前窗口高度设置为 {nr}
。
您也可以通过使用鼠标上下拖动状态栏来调整窗口大小。或者通过左右拖动垂直分隔线。这只有在正在使用的 Vim 版本支持鼠标并且
'mouse' 选项已设置为启用时才有效。
'winheight' (
'wh') 选项用于设置当前窗口的最小窗口高度。此选项在另一个窗口变为当前窗口时使用。如果选项为 '0',则被禁用。将
'winheight' 设置为一个非常大的值,例如 '9999',使当前窗口始终填充所有可用空间。将其设置为一个合理的值,例如 '10',使在当前窗口中进行编辑更加舒适。
当
'equalalways' (
'ea') 选项设置后,所有窗口将在分割或关闭窗口后自动调整为相同大小。如果您不设置此选项,分割窗口将减小当前窗口的大小,而其他窗口保持不变。关闭窗口时,额外的行将分配给上面的窗口。
'eadirection' 选项限制了
'equalalways' 选项应用的方向。默认的 "both" 在两个方向上调整大小。当值为 "ver" 时,仅窗口的高度会均衡。当您手动调整了垂直分割窗口的大小,并希望保持其宽度时,请使用此选项。同样,"hor" 会导致仅均衡窗口的宽度。
如果只有一个窗口,调整该窗口的大小也会更改命令行的高度。如果有几个窗口,调整当前窗口的大小也会更改下面窗口的高度(有时还会更改上面窗口的高度)。
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()
函数。
预计执行的命令不会导致窗口大小或滚动更改。如果确实发生了更改,事件将很快再次触发。换句话说:在触发事件之前,当前大小和滚动位置将被存储并用于确定是否发生了更改。
参数列表缓冲区列表含义
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。
:sla :slast :sla[st][!] [++opt] [+cmd] ":split | last" 的简写:拆分窗口并转到最后一个参数。但是,如果没有参数列表,则不会拆分窗口。另请参见
++opt 和
+cmd。
:dr :drop :dr[op] [++opt] [+cmd]
{file}
.. 在窗口中编辑第一个
{file}
。
如果文件已在窗口中打开,则切换到该窗口。
如果文件未在窗口中打开,则在当前窗口中编辑文件。如果当前缓冲区无法
放弃,则会先拆分窗口。
不在参数列表中或未完全宽度的窗口将尽可能关闭。
参数列表 将设置,就像使用
:next 命令一样。此命令的目的是它可以从想要 Vim 编辑另一个文件的程序中使用,例如调试器。使用
:tab 修饰符时,每个参数将在一个标签页中打开。如果最后一个窗口为空,则使用它。另请参见
++opt 和
+cmd。
:windo :[range]windo
{cmd}
在每个
可聚焦 窗口中执行
{cmd}
,或者只针对窗口编号在给定 [range] 中的窗口执行。它就像执行以下操作一样
CTRL-W t
:{cmd}
CTRL-W w
:{cmd}
etc.
这只会作用于当前标签页。如果在一个窗口上检测到错误,则不会访问其他窗口。最后一个窗口(或发生错误的位置)将变为当前窗口。 {cmd}
可以包含 '|' 来连接多个命令。 {cmd}
不得打开或关闭窗口,也不得重新排列它们。
:bufdo :[range]bufdo[!]
{cmd}
在缓冲区列表中的每个缓冲区中执行
{cmd}
,或者如果给出 [range],则只针对缓冲区编号在 [range] 中的缓冲区执行。它就像执行以下操作一样
:bfirst
:{cmd}
:bnext
:{cmd}
etc.
如果当前文件无法
放弃 且未给出 [!],则命令将失败。如果在一个缓冲区上检测到错误,则不会访问其他缓冲区。未列出的缓冲区将被跳过。最后一个缓冲区(或发生错误的位置)将变为当前缓冲区。
{cmd}
可以包含 '|' 来连接多个命令。
{cmd}
不得删除缓冲区或将缓冲区添加到缓冲区列表中。
注意: 在执行此命令时,Syntax 自动命令事件将通过将其添加到
'eventignore' 来禁用。这大大加快了编辑每个缓冲区的速度。
示例
:windo set nolist foldcolumn=0 | normal! zn
这将重置
'list' 选项并在所有窗口中禁用折叠。
:bufdo set fileencoding= | update
这将在每个缓冲区中重置
'fileencoding',并在更改缓冲区时写入它。结果是所有缓冲区都将使用
'encoding' 编码(如果转换成功)。
: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" 一样,但是如果文件不存在,则不会创建新的标签页。
预览窗口是一个特殊的窗口,用于显示(预览)另一个文件。它通常是一个小窗口,用于显示包含文件或函数定义。
: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
隐藏缓冲区不会在窗口中显示,但仍然加载到内存中。这使得在文件之间跳转成为可能,而无需每次在窗口中获取另一个缓冲区时都读取或写入文件。
您可以通过使用任何命令开始编辑隐藏缓冲区,或者通过使用 ":bdelete" 命令删除隐藏缓冲区,来使隐藏缓冲区不再隐藏。
hidden-quit 当您尝试在有隐藏的修改过的缓冲区时退出 Vim 时,您将收到一条错误消息,Vim 将使该缓冲区成为当前缓冲区。然后,您可以选择写入此缓冲区(":wq")或不写入就退出(":q!")。注意:可能还有更多隐藏的修改过的缓冲区!
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]
{bufname}
{bufname}编辑缓冲区列表中的缓冲区
{bufname}
。部分名称也可以使用,只要它在缓冲区列表中是唯一的。请注意,名称为数字的缓冲区不能用该名称引用;请改用缓冲区编号。在缓冲区名称中的空格之前插入反斜杠。有关 [!],请参阅
:buffer-!。这也会编辑缓冲区列表中不存在的缓冲区,而不会设置
'buflisted' 标志。另请参阅
+cmd。
:[N]sb[uffer] [+cmd]
{bufname}
拆分窗口并编辑缓冲区列表中的缓冲区
{bufname}。这也会编辑缓冲区列表中不存在的缓冲区,而不会设置
'buflisted' 标志。
注意:如果您想做的是拆分缓冲区,并在另一个名称下创建副本,您可以这样操作
:w foobar | sp #
:[N]bn[ext][!] [+cmd] [N]
:bn :bnext [b E87 转到缓冲区列表中的第 [N] 个下一个缓冲区。[N] 默认值为 1。在缓冲区列表末尾循环。有关 [!],请参阅
:buffer-!。另请参阅
+cmd。如果您位于帮助缓冲区中,这会将您带到下一个帮助缓冲区(如果有)。类似地,如果您位于普通(非帮助)缓冲区中,这会将您带到下一个普通缓冲区。这样,如果您调用了帮助,它就不会在您浏览代码/文本缓冲区时妨碍您。接下来的三个命令也以这种方式工作。
:[N]bm[odified][!] [+cmd] [N]
:bm :bmodified E84 转到第 [N] 个下一个已修改的缓冲区。
注意:此命令还会查找未列出的缓冲区。如果没有已修改的缓冲区,该命令将失败。
一些有用的缓冲区类型
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