完整的替换命令为::'<,'>s/United States of America/USA/ + Enter(如图 35-5 所示)
【图 35-4:选中待替换区域后的实测效果图(Windows 版 Vim,v9.1)】
【图 35-5:对选中区块执行替换命令的实测效果图】
这样就实现了仅对选中区域进行文本替换,而其他位置的匹配项则不受影响,如图 35-6 所示:
【图 35-6:仅对选中区域实现内容替换后的实测效果图】
关于视频提到的 Bug 的本地验证
视频中还提到录制当时 Vim 存在的一个 Bug:命令模式下的替换命令会对一整行生效。也就是说,如果启用的是字符级可视化模式,从命令模式下执行的命令将会对那一整行生效。为此,实操过程中特地在本地进行了验证,发现该 Bug 依然存在。以下是验证过程(时间:2025 年 1 月17 日):
假如同一行有两处匹配项:
【图 35-7:临时构造的待验证文本,同一行包含两处待替换内容】
按 V 开启字符级可视化模式,并只选中后一个匹配项:
【图 35-8:字符级可视化模式下,只选中后面那个匹配项】
然后在命令行模式下执行相同的替换命令,发现 Vim 实时匹配的是选中区外的那个关键词:
【图 35-9:在命令模式下执行相同的替换命令】
按 Enter 执行命令,实际只替换了选中的第一项,选中区域内的关键词反而未被替换:
【图 35-10:执行替换后,选区外的关键词被意外替换,而选取内的却保持原样】
此时若修改命令,追加一个全局替换 g,则两个匹配项 都会被替换 :
【图 35-11:改为全局替换后,两个关键词均被替换,与选中区域无关】
为了排除实时匹配关键词的影响,又尝试关闭 is 参数::set nois。再次测试,问题依旧。
【结论】
对于 Vim 的 v9.1 版 Windows 版本,当同一行存在多个待替换关键词时,仍然无法通过选中部分关键词、并通过命令行模式中的 :s/old/new/ 替换命令,实现指定区域内的关键词替换。:s/old/new/ 命令将无视选中区域,对该行的关键字实施单个(不带 g 标记)或全量(带 g 标记)替换。
################################################################################
# Episode V:
# The Empire Strikes Back
################################################################################