打开新窗口最简单的命令如下:
:split
这个命令把屏幕分解成两个窗口并把光标置于上面的窗口中:
+----------------------------------+
|/* file one.c */ |
|~ |
|~ |
one.c=============================
|/* file one.c */ |
|~ |
one.c=============================
| |
+----------------------------------+
你可以看到显示同一个文件的两个窗口。带 "====" 的行是状态条,用来显示它上面的窗
口的信息。(在实际的屏幕上,状态条用反色显示)
这两个窗口允许你同时显示一个文件的两个部分。例如,你可以让上面的窗口显示变
量定义而下面的窗口显示使用这些变量的代码。
CTRL-W
w 命令可以用于在窗口间跳转。如果你在上面的窗口,它会跳转到下面的窗口,
如果你在下面的窗口,它会跳转到上面的窗口。(CTRL-W
CTRL-W
可以完成相同的功能这
是为了避免你有时按第二次的时候从 CTRL 键上缩手晚了。)
关 闭 窗 口
以下命令用于关闭窗口:
:close
实际上,任何退出编辑的命令都可以关闭窗口,像 ":quit" 和 "ZZ" 等。但 "close" 可
以避免你在剩下一个窗口的时候不小心退出 Vim 了。
关 闭 所 有 其 它 窗 口
如果你已经打开了一整套窗口,但现在只想编辑其中一个,如下命令可以完成这个功能:
:only
这个命令关闭除当前窗口外的所有窗口。如果要关闭的窗口中有一个没有存盘,Vim 会显
示一个错误信息,并且那个窗口不会被关闭。
08.2 用另一个文件分割窗口
下面命令打开另一个窗口并用该窗口编辑另一个指定的文件:
:split two.c
如果你在编辑 one.c,则命令执行的结果是:
+----------------------------------+
|/* file two.c */ |
|~ |
|~ |
two.c=============================
|/* file one.c */ |
|~ |
one.c=============================
| |
+----------------------------------+
要打开窗口编辑一个新文件,可以使用如下命令:
:new
你可以重复使用 ":split" 和 ":new" 命令建立任意多的窗口。
:split 命令可以接受计数前缀。如果指定了这个前缀,这个数将作为窗口的高度。例如
如下命令可以打开一个三行的窗口并编辑文件 alpha.c:
:3split alpha.c
对于已经打开的窗口,你可以用有几种方法改变它的大小。如果你有鼠标,很简单: 把鼠
标指针移到分割两个窗口的状态栏上,上下拖动即可。
要扩大窗口:
CTRL-W +
要缩小窗口:
CTRL-W -
这两个命令接受计数前缀用于指定扩大和缩小的行数。所以 "4 CTRL-W
+" 会使窗口增高
4 行。
要把一个窗口设置为指定的高度,可以用这个命令:
{height}CTRL-W _
就是先输入一个数值,然后输入 CTRL-W
和一个下划线 (在美式英语键盘中就是 Shift
加上 "-")。
要把一个窗口扩展到尽可能大,可以使用无计数前缀的 CTRL-W
_ 命令。
使 用 鼠 标
在 Vim 中,你可以用键盘很快完成很多工作。但很不幸,改变窗口大小要敲不少键。在
这种情况下,使用鼠标会更快一些。把鼠标指针移到状态条上,按住左键并拖动。状态条
会随之移动,这会使一个窗口更大一个更小。
选 项
'winheight' 选项设置最小的期望窗口高度而 'winminheight' 选项设置最小的 "硬性"
高度。
同样,'winwidth' 设置最小期望宽度而 'winminwidth' 设置最小硬性宽度。
'equalalways' 选项使所有的窗口在关闭或者打开新窗口的时候总保持相同大小。
":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 。
你已经分割了一些窗口,但现在的位置不正确。这时,你需要一个命令用于移动窗口。
例如,你已经打开了三个窗口,像这样:
+----------------------------------+
|/* 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 会使当前窗口移动到上面并扩展到整屏的宽度。
假设你的布局如下:
+-------------------------------------------+
|/* 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
这表示 "quit all" (全部退出)。如果任何一个窗口没有存盘,Vim 都不会退出。同时光
标会自动跳到那个窗口,你可以用 ":write" 命令保存该文件或者 ":quit!" 放弃修改。
如果你知道有窗口被改了,而你想全部保存,则执行如下命令:
:wall
这表示 "write all" (全部保存)。但实际上,它只会保存修改过的文件。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 用 vimdiff 显示文件差异
有一种特殊的启动 Vim 的方法可以用来显示两个文件的差异。让我们打开一个 "main.c"
并插入一些字符。在设置了 'backup' 选项的情况下保存这个文件,以便产生 "main.c~"
备份文件。
在命令行中输入如下命令: (不是在 Vim 中)
vimdiff main.c~ main.c
Vim 会用垂直分割的方式打开两个文件。你只能看到你修改过的地方和上下几行的地方。
VV VV
+-----------------------------------------+
|+ +--123 lines: /* a|+ +--123 lines: /* a| <- 折叠
| text | text |
| text | text |
| text | text |
| text | changed text | <- 修改过的行
| text | text |
| text | ------------------| <- 删除的行
| text | text |
| text | text |
| text | text |
|+ +--432 lines: text|+ +--432 lines: text| <- 折叠
| ~ | ~ |
| ~ | ~ |
main.c~==============main.c==============
| |
+-----------------------------------------+
(这幅图没有显示出高亮效果,可以使用 vimdiff 命令看到更好的效果)
那些没有修改的行会被折叠成一行,这称为 "关闭的折叠" (closed fold)。上图中
由 "<- 折叠" 标记的行就是一个用一行表示 123 行的折叠。这些行在两个文件中完全相
同。
标记为 "<- 修改过的行" 被高亮显示,而增加的行被用另一种颜色表示。这可以很
清楚地表示出两个文件间的不同。
被删除的行在 main.c 窗口中用 "---" 显示,如图中用 "<- 删除的行" 标记的行。
这些字符并不是真的存在。它们只是用于填充 main.c,以便与另一个窗口对齐。
折 叠 栏
每个窗口在左边都有一个颜色略有不同的显示栏,图中标识为 "VV"。你会发现每个折叠
在那个位置都有一个加号。把鼠标移到那里并按左键可以打开那个折起,从而让你看到里
面的内容。
对于打开的折叠,折叠栏上会出现一个减号。如果你单击那个减号,折叠会被重新关
闭。
当然,这只能在你有鼠标的情况下使用。如果你没有,可以用 "zo" 打开一个折叠。
关闭使用 "zc"。
用 Vim 做 比 较
启动比较模式的另一种方法从 Vim 内部开始: 编辑 "main.c" 文件,然后分割窗口显示
区别:
:edit main.c
:vertical diffsplit main.c~
":vertical" 命令使窗口用垂直的方式分割。如果你不写这个命令,结果会变成水平分
割。
如果你有一个当前文件的补丁或者 diff 文件,你可以用第三种方法启动比较模式: 先编
辑这个文件,然后告诉 Vim 补丁文件的名称:
:edit main.c
:vertical diffpatch main.c diff
警告
: 补丁文件中必须仅包括为一个目标文件所做的补丁,否则你可能会得到一大堆错误
信息。还可能有些你没打算打补丁的文件也被打了补丁。
补丁功能只改变内存中的文件备份,不会修改你硬盘上的文件 (除非你决定写入改
动)。
滚 动 绑 定
当文件中有很多改动时,你可以用通常的方式滚动屏幕。Vim 会尽可能保持两个文件对
齐,以便你可以并排看到文件的区别。
如果暂时想关闭这个特性,使用如下命令:
:set noscrollbind
跳 转 到 修 改 的 地 方
如果你通过某种方法取消了折叠功能,可能很难找到有改动的地方。使用如下命令可以跳
转到下一个修改点:
]c
反向跳转为:
[c
加上一个计数前缀可以跳得更远。
消 除 差 异
你可以把文本从一个窗口移到另一个,并以此来消除差异,或者为其中一个文件中增加几
行。Vim 有时可能无法及时更新高亮显示。要修正这种问题,使用如下命令:
:diffupdate
要消除差异,你可以把一个高亮显示的块从一个窗口移动到另一个窗口。以上面的
"main.c" 和 "main.c~" 为例,把光标移到左边的窗口,在另一个窗口中被删除的行的位
置,执行如下命令:
:dp
这将把文字从左边拷到右边,从而消除两边的差异。"dp" 代表 "diff put"。
你也可以反过来做: 把光标移到右边的窗口,移到被 "改动" 了的行上,然后执行
如下命令:
:do
这把文本从左边拷到右边,从而消除差异。
由于两个文件已经没有区别了,Vim 会把所有文字全部折叠起来。"do" 代表 "diff
obtain"。本来用 "dg" (diff get) 会更好。可是它已经有另外的意思了 ("dgg" 删除从
光标为止到首行的所有文本)。
要了解更多的比较模式的内容,参见 vimdiff 。
'laststatus' 选项用于指定什么时候对最后一个窗口显示状态条:
0 永远不
1 只有用分割窗口的时候 (默认)
2 永远有
很多编辑另一个文件的命令都有一个使用分割窗口的变体。对于命令行命令,这通过前置
一个 "s" 实现。例如 ":tag" 用来跳到一个标记,"stag" 就会分割出一个新窗口并跳到
那个标记。
对于普通模式,前置一个 CTRL-W
可以完成这个功能。例如,CTRL-^
跳到轮换文
件,而 CTRL-W
CTRL-^
打开一个新窗口并编辑轮换文件。
'splitbelow' 选项可以让新的窗口出现在当前窗口的下面。'splitright' 选项让垂直分
割的窗口出现在当前窗口的右边。
打开一个新窗口时可以在命令前加上一个修饰符说明新窗口应该出现在什么地方:
:leftabove {cmd} 当前窗口的左上方
:aboveleft {cmd} 同上
:rightbelow {cmd} 当前窗口的右下方
:belowright {cmd} 同上
:topleft {cmd} 整个 Vim 窗口的最上面或者最左边
:botright {cmd} 整个 Vim 窗口的最下面或者最右边
你会注意
到窗口永远不会重叠。这意味着屏幕空间很快会用完。这个问题的解决方法叫做
标签页。
假设你正在编辑文件 "thisfile"。下面的命令可以建立新的标签页:
:tabedit thatfile
这会在一个窗口中编辑文件 "thatfile",这个窗口会占满整个 Vim 窗口。你会注意
到在
顶部有一个含有两个文件名的横条:
+----------------------------------+
| thisfile | /thatfile/ __________X| (thatfile 用加粗字体出现)
|/* thatfile */ |
|that |
|that |
|~ |
|~ |
|~ |
| |
+----------------------------------+
现在,你拥有了两个标签页。第一个是文件 "thisfile" 的窗口,第二个是文件
"thatfile" 的窗口。这就像是两张重叠的纸,它们所带的的标签露在外面,显示其文件
名。
现在,使用鼠标单击顶端的 "thisfile"。结果是
+----------------------------------+
| /thisfile/ | thatfile __________X| (thisfile 用加粗字体出现)
|/* thisfile */ |
|this |
|this |
|~ |
|~ |
|~ |
| |
+----------------------------------+
你可以通过单击顶端的标签切换标签页。如果没有鼠标或者不想用它,可以使用 "gt" 命
令。助记符: Goto Tab。
现在,让我们通过下面的命令建立另一个标签页:
:tab split
这会建立一个新的标签页,包含一个窗口,编辑和刚才所在窗口中的缓冲区相同的缓冲
区:
+-------------------------------------+
| thisfile | /thisfile/ | thatfile __X| (thisfile 用加粗字体出现)
|/* thisfile */ |
|this |
|this |
|~ |
|~ |
|~ |
| |
+-------------------------------------+
在任何打开窗口的 Ex 命令前面,你都可以放上 ":tab"。这个窗口在新标签页中打开。
另一个例子:
:tab help gt
它将在新的标签页中显示关于 "gt" 的帮助。
使用标签页可以完成更多的工作:
- 在末尾标签后面的空白处单击鼠标
选择下个标签页,同 "gt"。
- 在右上角的 "X" 处单击鼠标
关闭当前标签页,除非当前标签页中的改变没有保存。
- 在标签行上双击鼠标
建立新标签页。
- "tabonly" 命令
关闭除了当前标签页以外的所有标签页,除非其它标签页中的改变没有保存。
关于标签页更多的信息,参见 tab-page 。