usr_26

usr_26.txt 适用于 Vim 9.0 版本。 最近更新: 2005年3月 VIM 用户手册 - by Bram Moolenaar 译者: Chimin Yen 重复 编辑工作往往不是杂乱无章的。同一个修改动作常常会被重复多次。在本章中,我们将解 释几种有用的重复修改动作的方法。 26.1 可视模式下的重复 26.2 加与减 26.3 改动多个文件 26.4 在外壳脚本里使用 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 在外壳脚本里使用 Vim

假定你要在很多文件内把字符串 "-person-" 改成 "Jones",然后把它们打印出来。你该 怎么做?一种方法是键入许许多多命令。另一种是写个外壳脚本来完成这件工作。 作为一个可视的交互式的编辑器,Vim 在执行普通模式命令时表现得极为出色。然而 在批量处理时,普通模式命令无法产生简洁的带有注释的命令文件;在此,你该转而利用 Ex 模式。该模式为你提供一种友好的命令行界面,方便你把命令写进一个批处理文件。 ("Ex 命令" 无非是命令行 (:) 命令的另一个名称。) 以下就是你所需要的 Ex 模式命令: %s/-person-/Jones/g write tempfile quit 你把这些命令放进文件 "change.vim" 里。现在就用这个外壳脚本在批量模式下运行编辑 器: for file in *.txt; do vim -e -s $file < change.vim lpr -r tempfile done 循环 for-done 是一个外壳结构,用来重复执行循环结构内的两行命令,而变量 $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-copyright vim:tw=78:ts=8:noet:ft=help:norl: