学习vi和vim编辑器(17):vim的多窗口功能(2)
接着上一篇文章,继续学习vim编辑器的多窗口功能。本篇文章主要学习调整窗口尺寸、缓冲区及其与窗口的交互、分页编辑、关闭与离开窗口。
调整窗口尺寸:
在gvim中,可以使用鼠标调整窗口尺寸,只需要用鼠标点击及拖动窗口边界即可。如果是在vim中,只要开启mouse选型(" :set mouse=a "),也能够用鼠标调整窗口尺寸。
窗口尺寸调整命令:
^W=:试图调整所有窗口至相同尺寸(此命令受当前的winwidth和winheight选项值的影响)。如果可用的屏幕块不能平均划分,vim也会尽可能地平均分割。
^W-:将当前窗口的高度减少一行。vim中还有一个ex命令:resize,可以明确指定欲减少的窗口尺寸。例如" :resize -n "命令可以将当前窗口减少n行。而且,即使不在一个多窗口编辑会话中(即只打开一个窗口),vim也能够减少窗口尺寸,此时空出来的屏幕面积都留给命令行窗口。
^W+:将当前窗口的高度增加一行。用" :resize +n "命令可以将当前窗口增高n行。一旦到达窗口的最大高度,使用这个命令不会再有效果。
:resize n:设置当前窗口的的高度为n行,设置值为绝对尺寸。
^W< 与 ^W>:分别能减少与增加当前窗口的宽度。
^W| :调整当前窗口至可能的最大宽度。也能够通过vertical resize n命令明确指定如何改变窗口,n定义了窗口的新宽度。
窗口尺寸调整选项:
有些vim选项能够影响上面讲解的尺寸调整命令的行为。
在窗口变为活动中(active)时,winheight和winwidth分别定义窗口的最小高度与宽度。由于vim在分割时的默认行为是平均分配,因此假设平均分割后,两个窗口的宽度都为55列。若当将winwidth调整为80,则每次vim将光标移动到某个窗口时,该窗口的宽度自动调整为80,另一个窗口则为30。这种行为非常方便,在切换窗口、切换文件时自动增加窗口的尺寸。
equalalways:让vim在分割或关闭窗口后,把窗口调整为相同尺寸。
eadirection:定义equalalways的方向,可使用的值为hor、ver、both,分别在水平、垂直、两个方向上都调整窗口尺寸为相等的。
cmdheight:设置命令行的高度。之前已经讲过,在只打开一个窗口的情况下,减少窗口的高度将增加命令行的高度。设置此选项,即可维持命令行的高度。
winminwidth,winminheight:用于确定调整窗口时的最小宽度和高度。vim把这两个选项值视为硬性规定,所以窗口尺寸永远不允许小于这两个值。
缓冲区及其与窗口的交互:
vim使用缓冲区作为工作对象的容器。在vim中有很多控制缓冲区以及在缓冲区中移动的命令。但是首先需要学习缓冲区的基础知识。
使用vim编辑器划分三个窗口,并在三个窗口中分别打开三个不同的文件:buffer_one.file,buffer_two.file,buffer_three.file。使用" :ls "或" :files "或" buffers "命令列出缓冲区,如下图所示:
每个文件对应一个缓冲区。每个缓冲区都有一个唯一的、不会改变的编号。如果在上述命令后面加上感叹号,还能列出每个缓冲区额外的信息。列出的缓冲区中,首先是缓冲区编号,然后是状态标志。状态标志的代码和说明如下:
u:非列出缓冲区,这个缓冲区不会列出,除非使用!。
%或#:%表示当前窗口所用的缓冲区,而#表示使用" :e # "命令跳到的缓冲区(即侯补文件对应的缓冲区)。
a或h:a表示活动中的缓冲区,即该缓冲区已经载入且可见。h表示隐藏缓冲区,隐藏缓冲区虽然存在,但不能在任何窗口中查看。
-或=:-表示缓冲区把modifiable选项关闭。=表示该文件是不能把状态修改为可调整的只读文件。
+或x:+表示缓冲区可调整,x表示缓冲区具有读入错误。
vim的特殊缓冲区:
vim自身使用的一些缓冲区称为特殊缓冲区。一般而言,这些缓冲区不能被编辑。
quickfix:包含因为我们的命令或位置列表而创建的错误列表。
help:包含vim帮助文件。使用":help"命令时,这些帮助文件将放入特殊缓冲区中。directory:包含目录的内容,即某个目录中的文件列表。它是vim里的快捷工具,能让我们在缓冲区中移动,而且可用光标加上enter键选择欲编辑的文件。
scratch:这些缓冲区包含一般用途的文本。
隐藏缓冲区:
隐藏缓冲区是不在任何当前窗口里显示的vim缓冲区。隐藏缓冲区可使得编辑多个文件变得较为容易。使用隐藏缓冲区需要设置hidden选项。
缓冲区命令:
vim自动在打开或关闭多个文件或窗口时管理缓冲区。缓冲区命令几乎能对缓冲区执行所有操作。接下来介绍两个缓冲区命令,它们能一次对许多文件做许多工作。
:windo cmd:该命令是"window do"的简称,这个伪缓冲区命令(其实它是个窗口命令)在每个窗口中执行指定命令cmd。它只在当前分页中动作,若在执行命令时产生错误,即停在产生错误的窗口,产生的错误的窗口随即成为新的当前窗口。 cmd能够使用管道符号(|)串联多个命令,串联命令中的每一个依次在每个窗口逐一执行。
:bufdo[!] cmd:与windo命令类似,但操作对象是编辑会话中的所有缓冲区,而不仅仅是当前分页中的可见缓冲区。
接下来列出常见的缓冲区命令::ls[!],:files[!],:buffers[!]:列出缓冲区与文件名称,如果加上!,则包括非列表缓冲区;
:ball,:sball: 编辑所有参数或缓冲区,每个缓冲区对应一个窗口;
:unhide,:sunhide:编辑所有载入缓冲区,每个缓冲区对应一个窗口;
:badd file:把file加入列表;
:bunload[!]:从内存中卸载缓冲区。如果缓冲区修改后未保存,vim不会让缓冲区卸载。加上感叹号,将忽略vim的警告,强制卸载缓冲区;
:bdelete[!]: 卸载缓冲区并将其从缓冲区列表中删除,感叹号作用同上;
:buffer[n],:sbuffer[n]:移向缓冲区n(sbuffer会打开一个新窗口);
:bnext[n],:sbnext[n]:移向接下来的第n个缓冲区(sbnext会打开一个新窗口);
:bNext[n],:sbNext[n],:bprevious[n],:sbprevious[n]:移向前面的第n个缓冲区 (sbNext,sbprevious会打开一个新窗口);
:bfirst,:sbfirst: 移到第一个缓冲区(sbfirst会打开一个新窗口);
:blast,:sblast:移到最后一个缓冲区(sblast会打开一个新窗口);
:bmod [n],:sbmod [n]: 移到第n个修改过的缓冲区(sbmod则会打开一个新窗口);
在窗口里追踪标签:
vim把vi的标签功能扩展到窗口里,对多窗口提供标签遍历机制。使得追踪一个标签也能在新的窗口里打开相关联的文件。
使用" :stags[!] "可分割窗口,以显示找到的标签的位置。如果没有找到标签,则命令失败且不会创建新窗口。
^W^] 或 ^W] 命令:效果等价于" :stag "。
^Wg]:类似于^W],但在新窗口中,vim执行" :tselect tag "命令,其中tag是光标下的标识;
^Wg^]:类似于^Wg],但在新窗口中执行" :tjump "命令;
^Wf或^W^f:能够分割窗口并编辑光标所在处的文件名称;
^Wgf:在新的分页中打开光标所在处的文件名称。如果文件不存在,则不会创建新的分页;
分页编辑:
vim允许创建新的分页,每个分页各有独自的行为。在每个分页中,可以分割屏幕,编辑多个文件等等。可以在vim与gvim中使用分页,与分页编辑相关的命令有:
:tabnew filename :打开新分页并编辑新文件。如果未指定文件,则vim只打开一个新分页并附上空缓冲区;
:tabclose:关闭当前的分页;
:tabonly:关闭除当前分页以外的所有分页;
使用Ctrl+PgUp(向右移动一个分页)与Ctrl+PgDn(向左移动一个分页)则可在分页间左右循环移动(实际测试时,在vim中不起作用,在gvim中可行)。
关于分页编辑,书上的命令过少,这里补充几个,更详细的使用方法可以使用" :help tab-page-commands "。
:tabnext,gt:移动到下一个分页,而且为循环移动(移动到最后一个之后,继续移动将返回第一个);
:tabnext [count],[count]gt:移动到第count个分页;
:tabprevious,:tabNext,gT:移动到上一个分页,而且为循环移动;
:tabprevious [count],:tabNext [count],[count]gT: 往回移动count个分页;
:tabfirst:移动到第一个分页;
:tablast:移动到最后一个分页;
关闭与离开窗口:
vim有如下命令来关闭窗口,这些命令有很多细节需要注意,更详细的说明可以参考vim的帮助文档。
:quit,^Wq,^W^q: 离开当前窗口,如果是屏幕上的最后一个窗口,则离开vim。如果设置了hidden选项,而且该窗口是打开该文件的最后一个窗口,则缓冲区隐藏。如果没有设置hidden选项,而且该窗口是打开该文件的最后一个窗口,如果缓冲区有未保存的修改,则该命令失败(此时想要强制离开窗口,可在quit命令后面加上!,从而放弃对缓冲区的修改)。
^Wc:关闭当前窗口,如果当前窗口是屏幕上的唯一窗口,该命令执行失败。
:only,^Wo,^W^O:关闭除当前窗口以外的所有窗口。
本章vim命令总结:
^W=, ^W-, ^W+, :resize n, :resize +n, :resize -n, ^W<, ^W>, ^W|, :vertical resize, winheight选项, winwidth选项, equalalways选项,
eadirection选项, cmdheight选项, winminwidht选项,winminheight选项,
:ls, :files, :buffers, :windo cmd, :bufdo[!] cmd, :ball, :sball, :unhide, :sunhide, :badd file, :bunload[!], :bdelete[!], :buffer[n], :sbuffer[n], :bnext[n], :sbnext[n], :bNext[n], :sbNext[n], :bprevious[n], :sbprevious[n], :bfirst, :sbfirst, :blast, :sblast,
:bmod[n], :sbmod[n], :stags[!], ^W], ^W^], ^Wg], ^Wg^], ^Wf, ^W^f, ^Wgf, :tabnew, filename, :tabclose, :tabonly, ":help tab-page-commands", :tabnext, gt, :tabnext[count], [count]gt, :tabprevious, :tabNext, gT, :tabprevious[count], :tabNext[count], [count]gT,
:tabfirst, :tablast, :quit, ^Wq, ^W^q ,^Wc,:only, ^Wo, ^W^O。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。