Usr_08

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


VIM 用户手册 - 作者 Bram Moolenaar
分割窗口
在同一个屏幕上显示两个不同的文件。或者在同一时间查看文件中的两个位置。通过将两个文件并排放置,查看它们之间的差异。所有这些功能都可以通过分割窗口实现。
08.1 分割窗口 08.2 在另一个文件上分割窗口 08.3 窗口大小 08.4 垂直分割 08.5 移动窗口 08.6 所有窗口的命令 08.7 使用 diff 模式查看差异 08.8 各种 08.9 选项卡页
下一章:usr_09.txt 使用 GUI 上一章:usr_07.txt 编辑多个文件 目录:usr_toc.txt

分割窗口

打开新窗口最简单的方法是使用以下命令
:split
此命令将屏幕分成两个窗口,并将光标留在上面的窗口中
+----------------------------------+
|/* file one.c */                   |
|~                                   |
|~                                   |
|one.c=============================|
|/* file one.c */                   |
|~                                   |
|one.c=============================|
|                                   |
+----------------------------------+
你在这里看到的是同一个文件上的两个窗口。带有 "====" 的行是状态行。它显示有关其上方窗口的信息。(实际上,状态行将以反显显示。)这两个窗口允许你查看同一个文件的两个部分。例如,你可以让上面的窗口显示程序的变量声明,下面的窗口显示使用这些变量的代码。
CTRL-W w 命令可用于在窗口之间跳转。如果你在上面的窗口中,CTRL-W w 会跳到下面的窗口。如果你在下面的窗口中,它将跳到第一个窗口。(CTRL-W CTRL-W 做同样的事情,以防你稍后才松开 CTRL 键。)

关闭窗口

要关闭窗口,请使用以下命令
:close
实际上,任何退出编辑文件的命令都可以,例如 ":quit" 和 "ZZ"。但 ":close" 可以防止你在关闭最后一个窗口时意外退出 Vim。

关闭所有其他窗口

如果你打开了大量的窗口,但现在想专注于其中一个,那么这个命令将很有用
:only
这将关闭所有窗口,除了当前窗口。如果其他窗口中有更改,你将收到错误消息,并且该窗口不会关闭。

08.2 在另一个文件上分割窗口

以下命令打开第二个窗口并开始编辑给定文件
:split two.c
如果你正在编辑 one.c,那么结果看起来像这样
+----------------------------------+
|/* file two.c */                   |
|~                                   |
|~                                   |
|two.c=============================|
|/* file one.c */                   |
|~                                   |
|one.c=============================|
|                                   |
+----------------------------------+
要在一个新的空白文件中打开窗口,请使用
:new
你可以重复 ":split" 和 ":new" 命令来创建任意数量的窗口。

08.3 窗口大小

":split" 命令可以接受数字参数。如果指定了,这将是新窗口的高度。例如,以下命令打开一个三行高的窗口,并开始编辑文件 alpha.c
:3split alpha.c
对于现有窗口,你可以通过多种方式更改大小。当你有可用的鼠标时,这很容易:将鼠标指针移动到分隔两个窗口的状态行,然后将其向上或向下拖动。
要增加窗口的大小
CTRL-W +
要减小它
CTRL-W -
这两个命令都接受一个计数,并将窗口大小增加或减少该计数行数。因此 "4 CTRL-W +" 使窗口高出四行。
将窗口高度设置为指定行数
{height}CTRL-W _
那是:一个数字 {height}CTRL-W 然后是一个下划线(在英文-美国键盘上,Shift 键与 - 键一起使用)。要使窗口尽可能高,请使用 CTRL-W _ 命令而不带计数。

使用鼠标

在 Vim 中,你可以通过键盘快速完成很多事情。不幸的是,调整窗口大小的命令需要大量的输入。在这种情况下,使用鼠标更快。将鼠标指针放在状态行上。现在按下鼠标左键并拖动。状态行将移动,从而使一侧的窗口更高,另一侧的窗口更小。

选项

'winheight' 选项可以设置为窗口的最小期望高度,而 'winminheight' 选项可以设置为硬最小高度。同样,有 'winwidth' 用于最小期望宽度,'winminwidth' 用于硬最小宽度。当 'equalalways' 选项被设置为时,当窗口被关闭或打开时,Vim 会使窗口大小相等。

08.4 垂直分割

":split" 命令在新窗口出现在当前窗口上方。要使窗口出现在左侧,请使用
:vsplit
:vsplit two.c
结果看起来像这样
+--------------------------------------+
|/* file two.c */   |/* file one.c */  |
|~                    |~                       |
|~                    |~                       |
|~                    |~                       |
|two.c===============one.c=============|
|                                       |
+--------------------------------------+
实际上,中间的 | 行将以反显显示。这被称为垂直分隔符。它将左右两侧的两个窗口隔开。
还有一个 ":vnew" 命令,用于在新的空文件中打开垂直分割的窗口。另一种方法
:vertical new
":vertical" 命令可以插入到另一个分割窗口的命令之前。这将导致该命令垂直分割窗口,而不是水平分割窗口。(如果该命令不分割窗口,它将按原样工作。)

在窗口之间移动

由于你可以随意水平和垂直分割窗口,因此你可以创建几乎所有窗口布局。然后你可以使用以下命令在它们之间移动
CTRL-W h 移动到左边的窗口 CTRL-W j 移动到下面的窗口 CTRL-W k 移动到上面的窗口 CTRL-W l 移动到右边的窗口
CTRL-W t 移动到顶部窗口 CTRL-W b 移动到底部窗口
你会注意到与移动光标时使用的字母相同。如果你喜欢,也可以使用光标键。更多移动到其他窗口的命令:Q_wi.

08.5 移动窗口

你已经分割了一些窗口,但现在它们位于错误的位置。然后你需要一个命令将窗口移动到其他地方。例如,你有三个这样的窗口
+----------------------------------+
|/* file two.c */                   |
|~                                   |
|~                                   |
|two.c=============================|
|/* file three.c */                   |
|~                                   |
|~                                   |
|three.c===========================|
|/* file one.c */                   |
|~                                   |
|one.c=============================|
|                                   |
+----------------------------------+
显然最后一个应该在顶部。转到该窗口(使用 CTRL-W w),然后键入以下命令
CTRL-W K
这使用了大写字母 K。发生的事情是窗口被移动到最顶部。你会注意到,K 再次用于向上移动。当你进行垂直分割时,CTRL-W K 会将当前窗口移动到顶部,并使其占据整个 Vim 窗口的宽度。如果这是你的布局
+-------------------------------------------+
|/* two.c */  |/* three.c */  |/* one.c */  |
|~              |~              |~            |
|~              |~              |~            |
|~              |~              |~            |
|~              |~              |~            |
|~              |~              |~            |
|two.c=========three.c=========one.c========|
|                                            |
+-------------------------------------------+
那么在中间窗口(three.c)中使用 CTRL-W K 将导致
+-------------------------------------------+
|/* three.c */                                    |
|~                                            |
|~                                            |
|three.c====================================|
|/* two.c */               |/* one.c */            |
|~                       |~                    |
|two.c==================one.c===============|
|                                            |
+-------------------------------------------+
其他三个类似的命令(你可能现在已经猜到了这些命令)
CTRL-W H 将窗口移动到最左边 CTRL-W J 将窗口移动到底部 CTRL-W L 将窗口移动到最右边

08.6 所有窗口的命令

当你打开多个窗口并且想要退出 Vim 时,你可以分别关闭每个窗口。更快的方法是使用以下命令
:qall
这代表 "退出所有"。如果任何窗口包含更改,Vim 将不会退出。光标将自动定位在有更改的窗口中。然后,你可以使用 ":write" 保存更改,或者使用 ":quit!" 丢弃它们。
如果你知道有窗口有更改,并且你想保存所有这些更改,请使用以下命令
:wall
这代表 "写入所有"。但实际上,它只写入已更改的文件。Vim 知道,写入未更改的文件没有意义。然后是 ":qall" 和 ":wall" 的组合:"写入并退出所有" 命令
:wqall
这将写入所有修改过的文件并退出 Vim。最后,有一个命令可以退出 Vim 并丢弃所有更改
:qall!
小心,这个命令无法撤销!
为所有参数打开窗口
要使 Vim 为每个文件打开一个窗口,请使用 "-o" 参数启动它
vim -o one.txt two.txt three.txt
这将导致
+-------------------------------+
|file one.txt                        |
|~                                |
|one.txt========================|
|file two.txt                        |
|~                                |
|two.txt========================|
|file three.txt                        |
|~                                |
|three.txt======================|
|                                |
+-------------------------------+
"-O" 参数用于获得垂直分割的窗口。当 Vim 正在运行时,":all" 命令将为参数列表中的每个文件打开一个窗口。":vertical all" 使用垂直分割来执行此操作。

08.7 使用 diff 模式查看差异

有一种特殊的方法可以启动 Nvim,它显示两个文件之间的差异。让我们以文件 "main.c" 为例,在其中一行中插入一些字符。使用 'backup' 选项设置写入此文件,以便备份文件 "main.c~" 将包含文件的先前版本。在 shell 中键入以下命令以在 diff 模式下启动 Nvim
nvim -d main.c~ main.c
Vim 将启动,并在窗口旁边并排显示两个窗口。你只会看到你添加字符的那一行,以及它上面和下面的几行。
 VV                      VV
+-----------------------------------------+
|+ +--123 lines: /* a|+ +--123 lines: /* a|  <- fold
|  text                     |        text                  |
|  text                     |        text                  |
|  text                     |        text                  |
|  text                     |        changed text          |  <- changed line
|  text                     |        text                  |
|  text                     |        ------------------|  <- deleted line
|  text                     |        text                  |
|  text                     |        text                  |
|  text                     |        text                  |
|+ +--432 lines: text|+ +--432 lines: text|  <- fold
|  ~                     |        ~                  |
|  ~                     |        ~                  |
|main.c~==============main.c==============|
|                                          |
+-----------------------------------------+
(此图片没有显示突出显示,请使用 "nvim -d" 来实现。)
未修改的行已折叠成一行。这称为关闭折叠。它们在图片中用 "<- fold" 表示。因此,顶部的单个折叠行代表 123 行文本。这些行在两个文件中都是相同的。用 "<- changed line" 标记的行突出显示,插入的文本以另一种颜色显示。这清楚地显示了两个文件之间的差异。被删除的行在 main.c 窗口中用 "---" 显示。请参见图片中的 "<- deleted line" 标记。这些字符实际上并不存在。它们只是填满了 main.c,以便它显示与另一个窗口相同数量的行。

折叠列

每个窗口的左侧都有一列,其背景略有不同。在上面的图片中,它们用 "VV" 表示。你会注意到,在每个关闭的折叠的前面都有一个加号。将鼠标指针移动到那个加号上,然后点击鼠标左键。折叠将打开,你可以看到它包含的文本。折叠列包含一个减号,用于打开的折叠。如果你点击这个 -,折叠将关闭。显然,这只有在你有可用的鼠标时才有效。你也可以使用 "zo" 打开折叠,使用 "zc" 关闭折叠。

在 Vim 中进行 diff

另一种在 diff 模式下启动 Vim 的方法可以在 Vim 内部完成。编辑 "main.c" 文件,然后进行分割并显示差异
:edit main.c
:vertical diffsplit main.c~
":vertical" 命令用于使窗口垂直分割。如果你省略此命令,你将获得水平分割。
如果你有一个补丁或 diff 文件,你可以使用第三种方法启动 diff 模式。首先编辑应用补丁的文件。然后告诉 Vim 补丁文件的名称
:edit main.c
:vertical diffpatch main.c.diff
警告:补丁文件必须只包含一个补丁,用于您正在编辑的文件。否则您将收到许多错误消息,并且一些文件可能会被意外地修补。修补只会对 Vim 中的文件副本进行。硬盘上的文件将保持不变(直到您决定写入文件)。

滚动绑定

当文件有更多更改时,您可以按通常方式滚动。Vim 会尝试将两个窗口的开始位置保持在相同位置,这样您就可以轻松地并排查看差异。当您暂时不需要这样做时,请使用以下命令
:set noscrollbind

跳转到更改

当您以某种方式禁用折叠时,可能很难找到更改。使用以下命令向前跳转到下一个更改
]c
要反向跳转,请使用
[c
在前面添加一个计数以跳转更远。

删除更改

您可以将文本从一个窗口移动到另一个窗口。这要么删除差异,要么添加新的差异。Vim 并非在所有情况下都能保持突出显示的更新。要更新它,请使用以下命令
:diffupdate
要删除差异,您可以将突出显示的块中的文本从一个窗口移动到另一个窗口。以上面的“main.c”和“main.c~”为例。将光标移动到左侧窗口,在另一个窗口中被删除的行上。现在输入以下命令
dp
通过将当前窗口的文本放入另一个窗口中,更改将被删除。“dp”代表“diff put”。您也可以反过来做。将光标移动到右侧窗口,移动到插入“changed”的行。现在输入以下命令
do
更改现在将通过从另一个窗口获取文本而被删除。由于现在没有剩余的更改,Vim 将所有文本放入一个关闭的折叠中。“do”代表“diff obtain”。“dg”本来会更好,但它已经有了不同的含义(“dgg”从光标删除到第一行)。
有关 diff 模式详细信息,请参阅 diff-mode

08.8 各种

可以使用 'laststatus' 选项指定何时最后一个窗口具有状态行
0 从不 1 仅在有拆分窗口时(默认) 2 始终 3 在底部有一个全局状态行,而不是每个窗口一个
许多编辑其他文件的命令都有一个拆分窗口的变体。对于命令行命令,这是通过在前面添加一个“s”来完成的。例如:“:tag”跳转到标签,“:stag”拆分窗口并跳转到标签。对于普通模式命令,在前面添加一个CTRL-WCTRL-^ 跳转到备用文件,CTRL-W CTRL-^ 拆分窗口并编辑备用文件。
可以使用 'splitbelow' 选项设置新窗口出现在当前窗口下方。可以使用 'splitright' 选项设置垂直拆分窗口出现在当前窗口右侧。
拆分窗口时,可以在前面添加一个修饰符命令来告诉窗口将出现在哪里
:leftabove {cmd} 当前窗口左侧或上方 :aboveleft {cmd} 同上 :rightbelow {cmd} 当前窗口右侧或下方 :belowright {cmd} 同上 :topleft {cmd} 在 Vim 窗口的顶部或左侧 :botright {cmd} 在 Vim 窗口的底部或右侧

08.9 标签页

您会注意到,窗口从不重叠。这意味着您很快就会用完屏幕空间。解决方法称为标签页。
假设您正在编辑“thisfile”。要创建一个新的标签页,请使用以下命令
:tabedit thatfile
这将在占据整个 Vim 窗口的窗口中编辑“thatfile”文件。您会注意到顶部有一条显示两个文件名。
+----------------------------------+
| thisfile | /thatfile/ __________X|    (thatfile is bold)
|/* thatfile */                           |
|that                                   |
|that                                   |
|~                                   |
|~                                   |
|~                                   |
|                                   |
+----------------------------------+
您现在有两个标签页。第一个标签页有一个用于“thisfile”的窗口,第二个标签页有一个用于“thatfile”的窗口。这就像两张彼此叠放的纸,每张纸上都伸出一张标签,显示文件名。
现在使用鼠标单击顶行中的“thisfile”。结果是
+----------------------------------+
| /thisfile/ | thatfile __________X|    (thisfile is bold)
|/* thisfile */                           |
|this                                   |
|this                                   |
|~                                   |
|~                                   |
|~                                   |
|                                   |
+----------------------------------+
因此,您可以通过单击顶行中的标签来在标签页之间切换。如果您没有鼠标或不想使用鼠标,可以使用“gt”命令。助记符:Goto Tab。
现在让我们使用以下命令创建一个新的标签页
:tab split
这将创建一个新的标签页,其中包含一个正在编辑与我们之前所在窗口相同的缓冲区的窗口。
+-------------------------------------+
| thisfile | /thisfile/ | thatfile __X|   (thisfile is bold)
|/* thisfile */                              |
|this                                      |
|this                                      |
|~                                      |
|~                                      |
|~                                      |
|                                      |
+-------------------------------------+
您可以在任何打开窗口的 Ex 命令之前添加“:tab”。窗口将在新的标签页中打开。另一个例子
:tab help gt
将在新的标签页中显示“gt”的帮助文本。
您可以使用标签页做更多事情
用鼠标单击最后一个标签后的空间 将选择下一个标签页,就像使用“gt”一样。
用鼠标单击右上角的“X” 将关闭当前标签页。除非当前标签页中存在未保存的更改。
双击顶行中的鼠标 将创建一个新的标签页。
“tabonly”命令 关闭除当前标签页以外的所有标签页。除非其他标签页中存在未保存的更改。
有关标签页的更多信息,请参阅 tab-page
下一章:usr_09.txt 使用 GUI
版权:请参阅 manual-copyright vim:tw=78:ts=8:noet:ft=help:norl
主要
命令索引
快速参考