Vim 技巧 - 在指定范围上执行普通模式命令
如果想在一系列连续行上执行一条普通模式命令,我们可以用 :normal
命令。此命令在与 .
命令或宏结合使用时,我们只需花费很少的努力就能完成大量重复性任务。
比如我们想在一系列行后添加一个分号:
使用点范式让我们迅速完成了这项工作,但是在这个例子里,只需对连续的 3 行做此修改。如果不得不做 50 次同样的修改会怎么样呢?如果还用点范式的话,得按 50 次 j.
,总共得 100 次按键动作!
这里有一种更好的方法。我们将在下面文件的每行后都添加一个分号,以此作为演示。为节省空间,此处只列出了 5 行内容,然而你可以想象这里有 50 行,那么这种方法看起来就颇具诱惑了。
我们像之前做的那样,首先修改第一行:
接下来,用不着一行一行地执行 .
命令,而是使用 Ex 命令 :normal 对整个范围内的所有行同时执行 .
命令:
:'<,'>normal .
命令可以解读为“对高亮选区中的每一行,对其执行普通模式下的 .
命令”。无论是操作 5 行还是 50 行文本,这种方法都能出色地完成任务,更棒的是我们甚至都不需要计算行数,在可视模式中选中这些行使我们摆脱了计数的负担。
这个例子使用 :normal
执行 .
命令,但是也可以用这种方式执行任意其他的普通模式命令。例如,可以用如下命令解决上面的问题:
➾:%normal A;
符号 %
代表整个文件范围,因此 :%normal A;
告诉 Vim 在文件每行的结尾都添加一个分号。在做此修改时会切换到插入模式,但是在修改完后 Vim 会自动返回到普通模式。
在执行指定的普通模式命令之前,Vim 会先把光标移到该行的起始处。因此在执行时,用不着担心光标的位置。例如,下面这条命令可以把整个 JavaScript 文件注释掉:
➾:%normal i//
虽然用 :normal
命令可以执行任意的普通模式命令,但是我发现当它和 Vim 的重复命令结合在一起时,最为强大,既可以用 :normal .
应对简单的重复性工作,也可以用 :normal @q
应对较复杂的任务。
在 Ex 命令影响范围广且距离远 中,我们说过 Ex 命令可以一次修改若干行。而 :normal
命令则让我们可以把具有强大表现力的 Vim 普通模式命令与具有大范围影响力的 Ex 命令结合在一起,这种结合真地是珠联璧合!