在强大的vim编辑器中,range(范围)是一个核心且功能强大的概念,它极大地扩展了编辑命令的灵活性和威力。
许多冒号命令都支持 [range] 参数,例如:
复制命令:
:[range]co[py] {address} " 帮助命令 :copy
替换命令:
:[range]s[ubstitute]/{pattern}/{string}/[flags] [count] " 帮助命令 :s
一、替换命令(:substitute)与范围
我们从最常用的 :s(:substitute 的缩写)命令开始。它允许你在指定范围内搜索并替换文本,基本格式如下:
:[range]s/from/to/[flags]
这个命令会将 [range] 指定行内的字符串 from 替换为字符串 to。例如,将所有行中的 Professor 替换为 Teacher:
:%s/Professor/Teacher/
命令前的 % 表示范围是整个文件(1,$ 的简写)。如果不指定范围,:s 命令仅作用于当前行。
默认情况下,替换只针对每行的第一个匹配项。要为行中所有匹配项执行替换,需要添加 g(全局)标志:
:%s/Professor/Teacher/g
替换命令还支持其他有用的标志,如 c(确认),它会在每次替换前请求确认。Vim 会提示 replace with Teacher (y/n/a/q/l/^E/^Y)?,你可以选择:
- y: 替换当前匹配项。
- n: 跳过当前匹配项。
- a: 替换所有剩余匹配项,不再询问。
- q: 退出替换操作。
- l: 替换当前项后退出。
s/ 后面的 from 部分是一个模式(正则表达式),例如,要替换行首的 the:
:s/^the/these/
如果模式或替换字符串中包含正斜杠 /,可以用反斜杠转义,或者使用其他分隔符(如 +、=)以提高可读性:
:s+one/two+one or two+
二、范围的指定方法
范围总是放在冒号命令的开头,用于精确控制命令生效的行。
1. 使用行号
最直接的方式是使用确切的数字行号。
:1,5s/this/that/g:在第1至第5行(含)进行替换。
:54s/President/Fool/:仅在第54行进行替换。
2. 使用特殊符号
.:代表当前行。例如 :.write otherfile 仅将当前行写入另一文件。
$:代表文件最后一行。例如 :.,$s/yes/no/ 从当前行修改到文件末尾。
%:代表整个文件 (1,$)。
3. 使用搜索模式
范围可以由搜索模式来动态定义。
:/^Chapter/,/^Chapter/s=grey=gray=g:从当前向前的首个 ^Chapter 行,到当前向后的下一个 ^Chapter 行之间进行替换。这里用 = 代替 / 作为分隔符以避免混淆。
- 模式后可以跟偏移量:
/Chapter/-1 表示匹配行的上一行,/Chapter/+2 表示匹配行的下两行。
4. 使用标记 (Mark)
如果你用 mt 和 mb 分别标记了文本块的起始和结束,那么范围可以表示为:
:'t,'b
这表示从标记 t 所在行到标记 b 所在行。
5. 源自可视模式
在可视模式下选择文本行后,输入 : 进入命令行模式,你会看到自动生成的范围 :'<,'>,它代表了刚才选中的行区域。'< 和 '> 就是标识可视选区起止位置的标记。
6. 指定行数
在输入冒号前先输入一个数字 N,然后按 :,Vim 会自动生成从当前行开始的 N 行范围 :.,.+N-1。接着输入命令即可。
三、范围限定符完整列表与规则
以下是Vim中可用的行限定符总结:
{number}: 绝对行号。
.: 当前行。
$: 文件最后一行。
%: 整个文件 (1,$)。
't: 标记 t 所在行(小写标记可跨缓冲区)。
/pattern/: 向下匹配 pattern 的下一行。
?pattern?: 向上匹配 pattern 的上一行。
\/: 下一个匹配上次搜索模式的行。
\&: 下一个匹配上次替换模式的行。
这些符号后可附加 +n 或 -n 来表示偏移。范围可以用逗号 , 或分号 ; 连接。使用 , 时,两个地址基于原始行号计算;使用 ; 时,第二个地址的计算会从第一个地址确定的位置开始。
看到这些强大的范围指定方式,你会发现其理念与 awk 或 sed 这类经典的文本处理工具中的 pattern { action } 高度一致,体现了Unix哲学下工具设计的通用性与灵活性。
最后,一个小技巧:你可以在Vim内部直接打开一个终端,而无需切换窗口:
:terminal bash
这为在编辑器中执行Shell命令提供了极大便利。