Vim大部分命令默认只作用于当前行,只有 :write:global 默认作用于文件所有行

但很多Vim命令都可以加一个行号数字(用于指定某一行)或一对通过 ,; 分割的行号来指明文件范围,扩大命令操作范围

简单来说,Vim操作范围的表示方法为:. 表示当前行,$ 表示结束,% 表示所有行,再加上+-,可灵活表示当前Vim打开文件的任意范围。

以删除命令:d为例,通过增加Vim文件范围,可修改删除命令的操作对象

Vim命令 操作范围
:d 当前行
:.d 当前行
:1d 第一行
:$d 最后一行
:1,$d 所有行
:%d 所有行
:.,5d 当前行至第 5 行
:,5d 当前行至第 5 行
:,+3d 当前行及接下来的 3 行
:1,+3d 第一行至当前行再加 3 行
:,-3d 当前行及向上的 3 行
:3,'xdelete 第三行至标注 为 x 的那一行
:/^foo/,$delete 当前行以下,以字符 “foo” 开头的那一行至结尾
:/^foo/+1,$delete 当前行以下,以字符 “foo” 开头的那一行的下一行至结尾

除了,外,; 也可以分割行号用于表示Vim操作范围。

区别在于,a,bb 是以当前行作为参考,而 a;bb 是以 a 行作为参考

例如,假设当前光标所在为第 5 行,:1,+1d 命令会删除第 1 行至第 6 (5+1) 行,而 :1;+1d 命令则会删除第 1 行和第 2(1+1) 行。

如果想设置多个寻找条件,只需要在条件前再加上 /,比如:

:/foo//bar//quux/d

上面的命令首先在当前行之后寻找第一个包含 “foo” 字符的那一行,然后在找到的这一行之后寻找第一个包含 “bar” 字符的那一行,然后再在找到的这一行之后寻找第一个包含 “quux” 的那一行

最后删除的对象就是最后找到的这一行

嗯,扫一扫就可以找到小女子我啦~