forked from ma6174/vim
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathusr_26.cnx
executable file
·196 lines (138 loc) · 8.21 KB
/
usr_26.cnx
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
*usr_26.txt* For Vim version 7.3 最近更新:2005年3月
VIM 用户手册 - Bram Moolenaar 著
译者: Chimin Yen http://vimcdoc.sf.net
重复
编辑工作往往不是杂乱无章的。同一个修改动作常常会被重复多次。在本章中,我们将解
释几种有用的重复修改动作的方法。
|26.1| 可视模式下的重复
|26.2| 加与减
|26.3| 改动多个文件
|26.4| 在 shell 脚本里使用 Vim
下一章: |usr_27.txt| 查找命令及模式
前一章: |usr_25.txt| 编辑带格式的文本
目录: |usr_toc.txt|
==============================================================================
*26.1* 可视模式下的重复
可视模式在反复修改一段文本方面十分方便。你可以看见高亮的文本,从而确定是否改对
了地方。但选择文本也得打几个字。"gv" 命令再次选择上次选过的文本,让你对同一段
文本再作别的修改。
假定你有几行文本,你要把其中的 "2001" 改成 "2002",以及 "2000" 改成 "2001":
The financial results for 2001 are better ~
than for 2000. The income increased by 50%,~
even though 2001 had more rain than 2000. ~
2000 2002 ~
income 45,403 66,234 ~
首先把 "2001" 改成 "2002"。在可视模式下选择这几行文本,并执行: >
:s/2001/2002/g
现在用 "gv" 命令再次选择同一文本。光标在哪儿都没关系。然后用 ":s/2000/2001/g"
命令作第二项修改。
很明显,你可以多次重复这些动作。
==============================================================================
*26.2* 加与减
当你反复地把一个数改成另一个时,你常遇到定值的偏移。在上例中,每个年份都加了
一。与其为每个要修改的年份都键入一个替换命令,不如利用 CTRL-A 命令。
在上面这段文本中搜索年份: >
/19[0-9][0-9]\|20[0-9][0-9]
现在按 CTRL-A。找到的年份增加了一:
The financial results for 2002 are better ~
than for 2000. The income increased by 50%,~
even though 2001 had more rain than 2000. ~
2000 2001 ~
income 45,403 66,234 ~
用 "n" 命令找到下一个年份,并按 "." 重复 CTRL-A 命令 (键入 "." 会快一点儿)。为
所有找到的年份重复 "n" 和 "."。
提示: 设定 'hlsearch' 选项以突显那些你要修改的数字,然后你可以提前观察并修
改得快些。
你可以在 CTRL-A 之前附加数字来增加一个大于一的数。假定你有这么个列表:
1. item four ~
2. item five ~
3. item six ~
把光标移到 "1." 上并键入: >
3 CTRL-A
那个 "1." 就变成了 "4."。同样,你可以用 "." 命令对其它数字重复这项修改。
再看一个例子:
006 foo bar ~
007 foo bar ~
在这些数字上执行 CTRL-A 产生了以下结果:
007 foo bar ~
010 foo bar ~
7 加 1 等于 10? 这是因为 Vim 根据首位出现的 "0" 而误以为 "007" 是个八进位数
字。这种表示法常用于 C 程序。如果你不要首位为 "0" 的数字被处理成八进位数字,请
用这个命令: >
:set nrformats-=octal
CTRL-X 命令用于减数字,用法与加数字类似。
==============================================================================
*26.3* 改动多个文件
假定你有个变量名为 "x_cnt" 而你要把他改为 "x_counter"。这个变量在多个 C 文件都
被用到了。你需要在所有文件中作此改动。你得这么做。
把所有相关文件放进参数列表: >
:args *.c
<
这个命令会找到所有的 C 文件并编辑其中的第一个。现在你可以对所有这些文件执行替
代命令: >
:argdo %s/\<x_cnt\>/x_counter/ge | update
命令 ":argdo" 把另一个命令当作其参数。而后者将对参数列表内所有的文件执行。
作为参数的替代命令 "%s" 作用于所有文本行。它用 "\<x_cnt\>" 来查找 "x_cnt"。
"\<" 和 "\>" 用来指定仅匹配那些完整的词,而不是 "px_cnt" 或 "x_cnt2"。
替代命令的标志位中包含 "g",用以置换同一行文本内出现的所有的匹配 "x_cnt"。
标志位 "e" 用于避免因文件中找不到 "x_cnt" 而出现错误信息。否则 ":argdo" 命令就
会在遇到第一个找不到 "x_cnt" 的文件时中断。
字符 "|" 分隔两条命令。后面的 "update" 命令将那些有改动的文件存盘。如果没有
"x_cnt" 被改成 "x_counter",这个命令什么也不做。
还有一个 ":windo" 命令,用于在所有窗口内执行其参数所规定的命令。以及 ":bufdo"
命令,对所有缓冲区执行其参数所规定的命令。使用中要小心,因为你在缓冲区列表中的
文件数量可能超过你能想像的。请用 ":buffers" 命令 (或 ":ls") 来检查缓冲区列表。
==============================================================================
*26.4* 在 shell 脚本里使用 Vim
假定你要在很多文件内把字符串 "-person-" 改成 "Jones",然后把它们打印出来。你该
怎么做?一种方法是键入许许多多命令。另一种是写个 shell 脚本来完成这件工作。
作为一个可视的交互式的编辑器,Vim 在执行普通模式命令时表现得极为出色。然而
在批量处理时,普通模式命令无法产生简洁的带有注释的命令文件;在此,你该转而利用
Ex 模式。该模式为你提供一种友好的命令行界面,方便你把命令写进一个批处理文件。
("Ex 命令" 无非是命令行 (:) 命令的另一个名称。)
以下就是你所需要的 Ex 模式命令: >
%s/-person-/Jones/g
write tempfile
quit
你把这些命令放进文件 "change.vim" 里。现在就用这个 shell 脚本在批量模式下运行
编辑器: >
for file in *.txt; do
vim -e -s $file < change.vim
lpr -r tempfile
done
循环 for-done 是一个 shell 结构,用来重复执行循环结构内的两行命令,而变量
$file 则在每次循环时被设成不同的文件名。
脚本第二行的作用是对文件 $file 运行 Vim 且在 Ex 模式下 (参数 -e),并从文件
"change.vim" 读取命令。参数 -s 告诉 Vim 运行在安静模式下。换言之,不要持续不断
的发出 :prompt,或针对那个问题发出的任何别的提示。
命令 "lpr -r tempfile" 打印执行中产生的文件 "tempfile" 并把它删除 (是参数
-r 的作用)。
从 标 准 输 入 读 取
Vim 能从标准输入读取文本。由于通常从那里读取的是命令,你得告诉 Vim 你读的是文
本。这需要在通常是文件名的地方传送一个参数 "-"。例如: >
ls | vim -
这个命令让你编辑 "ls" 命令的输出结果,而不必先把那些输出文本存入一个文件。
如果你从标准输入读取文本,那么你可以用参数 "-S" 来读取脚本: >
producer | vim -S change.vim -
普 通 模 式 脚 本
如果你真的要在脚本内利用普通模式命令,你可以这样来用: >
vim -s script file.txt ..。
<
注意:
当 "-s" 不与 "-e" 一起用时,它的意思是不同的。此时,它的意思是把文件
"script" 里的命令当作普通模式命令来执行。而与 "-e" 一起用时,它的意思
是保持安静,并不会把下一个参数视为文件名。
文件 "script" 里的命令就像你键入它们那样得到执行。别忘了换行符被解释成按下回车
键 <Enter>。在普通模式下该键把光标移到下一行。
要创建这么一个脚本你可以编辑这个脚本文件,键入那些命令。你得想象每个命令会
产生什么样的结果。这可不那么容易。另一种方法是在你手动执行那些命令时把它们记录
下来。你可以采用下面的方法: >
vim -w script file.txt ..。
所有键入的字符都将被写进文件 "script"。如果你犯了个小错误,不妨继续输入。但要
记得事后更正一下这个脚本文件。
参数 "-w" 会将新键入的命令附加在一个已存在的脚本文件末尾。这在你需要一点儿
一点儿记录该脚本时是很不错的。但当你要从零开始重新记录你的脚本时,你则需要用
"-W" 参数。该参数重写任何已存在的文件。
==============================================================================
下一章: |usr_27.txt| 搜索命令和模式
版权: 参见 |manual-copy:wright| vim:tw=78:ts=8:ft=help:norl: