USR_25

*usr_25.txt*    For Vim version 7.0.     最近更新:2005年3月

                    Vim 用户手册 - by Bram Moolenaar
                  译者: snoopyxp http://vimcdoc.sf.net

                           编辑已编排过的文本


很少有那种一行一个句子的文本。这一章我们将要介绍如何为了适合页面而为句子分行
以及进行其它的编排操作。当然,针对编辑单行的段落和表格,Vim 也有一些有用的特性。

|25.1|  折行
|25.2|  对齐文本
|25.3|  缩进和制表符
|25.4|  对长行的处理
|25.5|  编辑表格

       下一章: |usr_26.txt|   重复
       上一章: |usr_24.txt|   快速插入
         目录: |usr_toc.txt|


*25.1* 折行

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' 选项。

*25.2* 对齐文本

要使一定范围包括的行居中,用以下命令: :{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 并没有提供内建的方法来使文本两端对齐。不过,我们可以通过使用一个灵巧的宏来 做这项工作。要使用这个包,执行下列命令: :runtime macros/justify.vim 这个 Vim 脚本文件定义了一个新的可视命令"_j"。要使一块文本两端对齐,只需在可视 模式中加亮该文本块,然后执行"_j"。 请查阅该文件以获得更详细的解释说明。在文件名$VIMRUNTIME/macros/justify.vim 上键入命令 "gf", 就可以打开该文件。 作为另一个选择,你还可以使用一个外部程序来对文本进行编排处理。例如: :%!fmt

*25.3* 缩进和制表符

缩进可以被用来突显特定的文本。举个例子,在本手册的示例文本用八个空格或一个制表 符来缩进。通常,你可以在每行的开头键入一个制表符来输入下面内容。用这个文本: the first line the second line 这些文本是这样输入的,先输入一个制表符,再输入一些文本,然后键入 <Enter>,接着 又是一个制表符,然后输入另一些文本。 设置 'autoindent' 选项可以自动插入缩进: :set autoindent 当开始一个新行时,新行会采用和上一行相同的缩进。在上面的例子中,我们再也不需要在 <Enter> 后面输入制表符了。 增 加 缩 进 要增加一行中的缩进量,可以使用 ">" 操作符。一个经常使用的操作是 ">>",这将为当前 行增加缩进。 增加的缩进量是使用 'shiftwidth' 来指定的。默认的值是 8。举例来说,要使 ">>" 插 入四个空格宽度的缩进,键入: :set shiftwidth=4 当你在示例文本中的第二行上使用时,你会得到下面的结果: the first line the second line "4>>" 将为四行增加缩进。 制 表 位 如果你想使缩进量为 4 的倍数,你需把 'shiftwidth' 设置为4。但是当你敲下Tab 键时, 你仍然会得到八个空格宽度的缩进。要改变这种情况,请设置 'softtabstop' 选项。 :set softtabstop=4 这将使 <Tab> 键插入四个空格宽度值的缩进量。如果已经存在四个空格,就加上一个 <Tab> 字符(在文件中省去了七个字符)。(如果你只想要空格而不想加上 tab 字符,请设 置 'expandtab' 选项。) 备注: 也许你已经把 'tabstop' 选项设置为4。尽管如此,如果你在另一个时间再次编辑 这个文件时 'tabstop' 的默认值是8,文件缩进看起来会不对。在其它程序中或者在打 印的时候,缩进也将是错的。因此,建议把 'tabstop' 的值始终保持为8。在 任何地方该值都是标准值。 改 变 制 表 符 当你在 Vim 中编辑一个 tabstop 为3的文件时,文件会看起来很难看,因为在 Vim 中 tabstop 的正常值为8。你可以通过把 'tabstop' 的值设置为3来更正它。但是你每一次 你编辑这个文件都得做这个更改。 Vim 可以改变你的文件中的 tabstops 的用法。首先,设置 'tabstop' 的值使缩进 看起来美观,然后使用 ":retab" 命令: :set tabstop=3 :retab 8 ":retab" 命令将把 'tabstop' 的值改为8,同时仍保持文件看起来不变。它改变了制表 符中空白的范围和所占的空间。现在你可以写入这个文件。 下次你再编辑它的时候缩进 将是正确的,你不需要改变任何选项。 警告: 当你对一个程序文件使用 ":retab" 命令时,它可能会改变一个字符串常量 中的空白。因此,要养成在程序中使用 "\t" 而不是输入一个制表符的好习惯。

*25.4* 对长行的处理

有时你会编辑一个比窗口列数宽的文件。当发生这种情况时,Vim将把文件折行显示以便适 应屏幕显示。 如果你将 'wrap' 选项设置为关闭,文件中的每一行都将在屏幕上仅作为一行显示。这 时行尾会超出屏幕右端从而无法看到。 当你把光标移动到一个无法看到的字符时,Vim将滚动文本来显示它。这就好像在文本 的水平方向移动视口一样。 默认情况下,Vim 并不在 GUI 中显示水平滚动条。如果你想启用它,使用下面的命令: :set guioptions+=b 一个水平滚动条将出现在 Vim 窗口的底部。 如果你没有滚动条或者你不想使用它,可以用下面这些命令来滚动文本。光标将停留在同样 的地方,但在必要时会回移到可见文本区。 zh 向右滚动 4zh 向右滚动四个字符 zH 向右滚动半个窗口宽度 ze 向右滚动使光标处于行尾 zl 向左滚动 4zl 向左滚动四个字符 zL 向左滚动半个窗口宽度 zs 向左滚动使光标处于行首 让我们试着用一行文本来演示一下。光标停留在 "which" 的 "w" 处。那行上方的 "当前窗 口" 标示当前可见的文本。下方的 "窗口" 指示了执行了左边的命令后可见的文本区域。 |<-- 当前窗口 -->| some long text, part of which is visible in the window ze |<-- 窗口 -->| zH |<-- 窗口 -->| 4zh |<-- 窗口 -->| zh |<-- 窗口 -->| zl |<-- 窗口 -->| 4zl |<-- 窗口 -->| zL |<-- 窗口 -->| zs |<-- 窗口 -->| 在 关 闭 折 行 情 况 下 移 动 当 'wrap' 选项被关闭,文本将在水平方向卷动。你可以通过以下命令来使光标移动到你可 以看到的一个字符处。这样超出窗口左右两端的文本将被忽略。这些命令将不会使文本卷动: g0 移动到当前行的第一个可见字符 g^ 移动到当前行的第一个非空白的可见字符 gm 移动到当前行的中点 g$ 移动到当前行的最后一个可见字符 |<-- 窗口 -->| some long text, part of which is visible g0 g^ gm g$ 断 词 *edit-no-break* 当你为另一个程序准备文本时,你或许需要使段落没有一处换行。使用 'nowrap' 选项的 一个弊端是你看不见你正在处理的整个句子。当 'wrap' 选项开启时,会发生会断词,从而 难以阅读。 编辑此类段落时,一个好的解决方法是设置 'linebreak' 选项。这样,Vim 将会在一 个适当的地方折行显示,同时仍保持文件中的文本不变。 没有设置 'linebreak' 选项时的文本看起来可能是这样: +---------------------------------+ |letter generation program for a b| |ank. They wanted to send out a s| |pecial, personalized letter to th| |eir richest 1000 customers. Unfo| |rtunately for the programmer, he | +---------------------------------+ 使用如下命令之后: :set linebreak 看起来会是这样: +---------------------------------+ |letter generation program for a | |bank. They wanted to send out a | |special, personalized letter to | |their richest 1000 customers. | |Unfortunately for the programmer,| +---------------------------------+ 相关选项: 'breakat' 指定了可以用来作为插入换行地点的字符。 'showbreak' 指定了一个用于显示在折行显示行的行首的字符串。 设置 'textwidth' 的值为零来避免一个段落被拆分。 通 过 可 见 行 移 动 使用 "j" 和 "k" 命令可以移动到下一行和上一行。当作用于一个长行时,这通常意味 着要一次移动许多屏幕行。 使用 "gj" 和 "gk" 命令可以只移动一个屏幕行。当一个行没有折行时,它们和 "j" 和 "k"命令所起的作用一样。当一个行折行时,它们将在屏幕上显示的上一行和 下一行的一个字符之间移动。 下面这些移动命令的键映射也许对你有用: :map <Up> gk :map <Down> gj 变 段 为 行 如果你想把文本导入类似 MS-Word 的程序中,每个段落就要变成一个单行。如果你的段落 是由空行分隔开的,下面这个命令就可以要把一个段转化为一个单行: :g/./,/^$/join 这看起来挺复杂。让我们把它分解开: :g/./ 一个 ":global" 命令,用来搜索至少含一个字符的所有行。 ,/^$/ 一个范围,从当前行开始(非空行)到一个空行。 join ":join" 命令把范围内的行连接成一行。 从下面这段含有八行,且在第三十列换行的文本开始: +----------------------------------+ |A letter generation program | |for a bank. They wanted to | |send out a special, | |personalized letter. | | | |To their richest 1000 | |customers. Unfortunately for | |the programmer, | +----------------------------------+ 你将得到下面两行: +----------------------------------+ |A letter generation program for a | |bank. They wanted to send out a s| |pecial, personalized letter. | |To their richest 1000 customers. | |Unfortunately for the programmer, | +----------------------------------+ 注意 当分隔段落的行是含有空格和/或制表符的空白行而不是空行时,这行命令将不起作 用。下列的命令对于空白行仍起作用: :g/\S/,/^\s*$/join 要使最后一段也被连接,这行命令需要文件的结尾仍有一个空白行或空行。

*25.5* 编辑表格

设想你正在编辑一个含有四列的表格: nice table test 1 test 2 test 3 input A 0.534 input B 0.913 你需要在第三列输入数字。你可以先移动到第二行,键入 "A",键入一大堆空格然后输入 你要输入的文本。 对于这种类型的编辑操作有一个特殊的选项: set virtualedit=all 现在你可以把光标移动到没有任何文本的位置。这叫做 "虚空间"。通过这种方法,编辑 表格变得容易很多。 通过查找最后一列的标题来移动光标: /test 3 现在按下 "j",光标就到了你要输入对应 "input A" 的值的地方了。输入 "0.693", 结果是: nice table test 1 test 2 test 3 input A 0.534 0.693 input B 0.913 Vim 已经自动为你填充了新文本前面的间隙。现在,要到此列的下一个域,键入 "Bj"。 "B" 用来移动到间隔单词的空白的开始处。然后,用 "j" 移动到可以输入下一域的地方。 备注: 你可以把光标移动到窗口的任何地方,也可以超出行尾。但是,Vim 在你未在 该位置插入字符之前并不会插入空格。 拷 贝 一 列 你想增加一列,它是第三列的一个拷备并且想放在 "test 1" 列的前面。做以下七步: 1. 移动光标到这一列的左上角,例如用 "/test 3"。 2. 按 CTRL-V 来开启块可视模式。 3. 用 "2j" 使光标向下移动两行。你现在进入了 "虚空间": "input B" 行中对应 对应列 "test 3" 的地方。 4. 把光标向右移动来选择整列,外加那些你想要的列之间的空格。用 "9l" 就行。 5. 用 "y" 来拷贝矩形选择区的内容。 6. 把光标移动到我们需要插入新列的地方 "test 1"。 7. 按下 "P"。 结果应该是: nice table test 3 test 1 test 2 test 3 input A 0.693 0.534 0.693 input B 0.913 需要注意的是整个 "test 1" 列被向右移动了,同时也包括 "test 3" 列中没有文本 的行。 要返回到光标的非虚拟移动模式用: :set virtualedit= 虚 替 换 模 式 使用 'virtualedit' 的弊端是你会 "感觉" 不太一样。当你移动光标的时候,你不能分辨 超出行尾的制表符或空格。另一种可行的方法是: 虚替换模式。 设想在表格中有一个包含了制表符和其它字符的行。在第一个制表符上使用 "rx": inp 0.693 0.534 0.693 | rx | V inpx0.693 0.534 0.693 版面被弄乱了。要避免这种情况,使用 "gr" 命令: inp 0.693 0.534 0.693 | grx | V inpx 0.693 0.534 0.693 这里的情况是 "gr" 命令确保了新字符占据了正确的屏幕空间。额外需要的空格或制表符被 插入到间隙中。然而,真正发生的是一个制表符被一个 "x" 代替, 然后空白字符被加上来 使文本保持它的位置。在这个例子里是插入了一个制表符。 当你需要替换多于一个字符时,使用 "R" 命令来进入替换模式(参看 |04.9|)。这样 一来,原来的版面乱套了,而且替换了不该换的字符。 inp 0 0.534 0.693 | R0.786 | V inp 0.78634 0.693 "gR" 使用虚替换模式。这保全了版面布局: inp 0 0.534 0.693 | gR0.786 | V inp 0.786 0.534 0.693

下一章: |usr_26.txt| 重复 版权: 参看 |manual-copyright| vim:tw=78:ts=8:ft=help:norl:

Generated by vim2html on 2006年 06月 24日 星期六 00:27:59 UTC