Usr_26

Nvim :help 页面,生成源代码, 使用 tree-sitter-vimdoc 解析器。


VIM 用户手册 - 作者:Bram Moolenaar
重复操作
编辑任务很少是无结构的。一个更改通常需要多次进行。本章将解释一些用于重复更改的有用方法。
26.1 使用可视模式重复 26.2 加减运算 26.3 在多个文件中进行更改 26.4 从 shell 脚本使用 Vim
下一章:usr_27.txt 搜索命令和模式 上一章:usr_25.txt 编辑格式化文本 目录:usr_toc.txt

使用可视模式重复

可视模式对于在任何行序列中进行更改非常方便。您可以看到突出显示的文本,从而可以检查是否更改了正确的行。但是,进行选择需要一些键入。命令“gv”会再次选择相同的区域。这允许您对相同的文本执行另一个操作。假设您有一些行,您想将“2001”更改为“2002”,将“2000”更改为“2001”。
2001 年的财务结果更好
比 2000 年好。收入增长了 50%,
尽管 2001 年的降雨量比 2000 年多。
2000 2001
收入 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。年份将增加一年
2002 年的财务结果更好
比 2000 年好。收入增长了 50%,
尽管 2001 年的降雨量比 2000 年多。
2000 2001
收入 45,403 66,234
使用“n”查找下一个年份,然后按“.”重复 CTRL-A(“.” 输入速度更快)。对出现的年份重复“n”和“.”。
可以通过在 CTRL-A 前面添加数字来添加多个数字。假设您有以下列表
1. 第四项
2. 第五项
3. 第六项
将光标移至“1.”,然后键入
3 CTRL-A
“1.” 将变为“4.”。同样,您可以使用“.”在其他数字上重复此操作。
CTRL-X 命令以类似的方式进行减法。
CTRL-ACTRL-X 的行为取决于 'nrformats' 的值。例如,如果您使用
:set nrformats+=octal
在“007”上按 CTRL-A 将递增到“010”,因为“007”将被识别为八进制数。

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 变量每次都设置为不同的文件名。第二行以 Ex 模式(-e 参数)在文件 $file 上运行 Vim 编辑器,并从文件“change.vim”中读取命令。 -s 参数告诉 Vim 以静默模式运行。换句话说,不要继续输出 :prompt 或任何其他提示。命令“lpr -r tempfile”将打印生成的“tempfile”并将其删除(这就是 -r 参数的作用)。

从 STDIN 读取

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
命令索引
快速参考