Vim 有一系列功能可以使处理文本变得更容易。在默认情况下,Vim 并不会自动换行,换
句话说,你得自己敲 <Enter>。这在你编写程序并想自己决定哪里是行尾时会很有用。但
当你想建立一个每行至多有 70 个字符宽的文档时,这就显得没那么好了。
如果你设置了 'textwidth' 选项,Vim 就会自动插入换行符。举个例子,假设您想
要一个只有 30 个字符宽的非常窄的栏,你需要执行下面的命令:
:set textwidth=30
现在开始输入正文 (加入了标尺):
1 2 3
12345678901234567890123456789012345
I taught programming for a whi
如果接下来你输入 "l",这将使此行的长度超出 30 个字符的限制。当 Vim 发现这种情
况时,它会自动插入换行符。你将得到下面的结果:
1 2 3
12345678901234567890123456789012345
I taught programming for a whil
接着,你可以输入剩下的段落:
1 2 3
12345678901234567890123456789012345
I taught programming for a while. One time, I was stopped by the Fort Worth police, because my homework wos too hard. True story.
你不用输入换行符,Vim 会自动插入的。
备注:
'wrap' 选项会使 Vim 分行显示文本,但并不会在文件中插入换行符。
重 排 文 本
Vim 编辑器并不是一个字处理器。字处理器在你删除了段落开头的一些东西时会重新调整
换行符。(译者注: 这意味着后边的文本会向前补进,使换行位置保持不变)。但在 Vim
里并不是这样。因此,当你从第一行删除单词 "programming" 时,你所得到的只是一个
短行:
1 2 3
12345678901234567890123456789012345
I taught for a while. One time, I was stopped by the Fort Worth police, because my homework was too hard. True story.
这看起来不大美观。为了保持段落的形状,你要用到 "gq" 操作符。
下面我们首先结合一个可视选择区来使用它。从第一行开始,键入:
v4jgq
"v" 用来进入可视模式,"4j" 用来移动到段落结尾,接下来是 "gq" 操作符。下面是得
到的结果:
1 2 3
12345678901234567890123456789012345
I taught for a while. One time, I was stopped by the Fort Worth police, because my homework was too hard. True story. 备注: 有一种方法可以自动地排版特定文本类型的布局,参见 auto-format 。
因为 "gq" 是一个操作符,所以你可以通过下面三种方法之一来选择要操作的文本范围:
可视模式,一个移动操作,或是一个文本对象。
上面的例子也可以用 "gq4j" 来完成。这减少了击键次数,但你得知道行数。一个更
有用的移动命令是 "}"。使用这个命令可以移动到一个段落的结尾处。因此,"gq}" 将对
从当前光标处至当前段段尾所包括的文本进行排版操作。
可以和 "gq" 一起使用的一个很有用的文本对象是段落。试一下这个:
gqap
"ap" 意味着 "a-paragraph" (译者注: 一个段落)。这将对一个段落 (用空行隔开) 的文
本进行排版操作。也包括在光标之前的部分。
如果你所有的段落都已经用空行分隔好了,你可以键入以下命令来对整个文件进行格
式化操作:
gggqG
"gg" 用来移动到第一行,"gqG" 用来对文本进行排版操作直到最后一行。
警告: 如果你的段落没有被正确的分隔开,它们将被连接在一起。一个常见的错误是
文件内包含一些只有空格或制表符的行。这些是空白行,但不是空行。
Vim 并不是只能对纯文本进行排版操作。请参考 fo-table 一节获取更详细的信息。参
考 'joinspaces' 选项以了解如何改变在句号之后加入的空格数。
也可以调用外部程序来做排版。这在 Vim 自带的排版功能无法满足你的文本的需要时
很有用。参阅 'formatprg' 选项。
要使一定范围包括的行居中,用以下命令:
:{range}center [width]{range} 即是那些通常命令所能指定的范围。 [width] 是一个可选项,用来确定要居中
的行的宽度。如果没有指定 [width],则默认使用 'textwidth' 的值。(如果
'textwidth' 是 0,则默认为 80。)
例如:
:1,5center 40
将得到下面的结果:
I taught for a while. One time, I was stopped by the Fort Worth police, because my homework was too hard. True story.
右 对 齐
类似地,":right" 命令将使文本右对齐:
:1,5right 37
将得到这种结果:
I taught for a while. One time, I was stopped by the Fort Worth police, because my homework was too hard. True story.
左 对 齐
我们使用这个命令:
:{range}left [margin]
和 ":center" ":right" 不同的是,":left" 的参数并不是行的宽度,而是左边的页边
距。如果这个参数被省略了,文本将被紧靠在屏幕的左边缘 (用一个零页边距参数将得
到一样的效果)。如果页边距是 5,文本将缩进五个空格。举个例子,使用以下命令:
:1left 5 :2,5left
结果会是下面这样:
I taught for a while. One time, I was stopped by the Fort Worth police, because my homework was too hard. True story.
两 端 对 齐
Vim 并没有提供内建的方法来使文本两端对齐。不过,我们可以通过使用一个灵巧的宏来
做这项工作。要使用这个包,执行下列命令:
:packadd justify
或在 .vimrc 里放上之行:
packadd! justify
这个 Vim 脚本文件定义了一个新的可视命令 "_j"。要使一块文本两端对齐,只需在可视
模式中选择该文本块,然后执行 "_j"。
请查阅该文件以获得更详细的解释说明。在文件名
$VIMRUNTIME/pack/dist/opt/justify/plugin/justify.vim 上键入命令 "gf",就可以打
开该文件。
作为另一个选择,你还可以使用一个外部程序来对文本进行过滤。例如:
:%!fmt