[r211]: trunk / doc / usr_25.txt Maximize Restore History

Download this file

usr_25.txt    534 lines (375 with data), 19.3 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
*usr_25.txt* For Vim version 7.4. 最近更新: 20075
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 可以更换你文件使用的制表位。首先,设置 '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: