Vim 进阶学习(三)—— 查找并手动替换

93 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情

前言

每天一个进阶 Vim 命令,帮助我们提升研发效率!

今天我们学习的一个 查找并手动替换 的命令。我们知道 :%s/x/y/g 命令可以批量把 x 替换为 y,但是大部分情况下,除非我们对我们要替换的内容非常了解,否则一定会出现意想不到的问题。

今天我们就来学习一下查找并手动替换的命令。

* 和 . 命令结合实现查找替换

我们以 Senorita 歌词为例,查找歌词中的 Senorita 并替换为 rose。首先我们将光标移动到 Senorita 单词上,然后使用 * 命令对它进行查找。

* 命令有两个作用:

  1. 光标跳到下一个匹配项上
  2. 文档中所有出现这个词的地方都会被高亮显示出来。如果我们没有看到高亮,执行 :set hls 命令即可;

执行 * 命令后,效果如下:

image.png

然后我们按 n 键就可以跳到下一个匹配项。

当光标位于 senorita 开头时,我们就可以修改它了。我们通过 cw 命令来进入插入模式,cw 命令会删除从光标位置到单词结尾间的字符,并进入插入模式,接着我们输入替换的文本 rose,然后执行 <Esc> 命令。

Vim 会把我们离开插入模式之前的全部按键操作都记录下来,因此整个 cwrose<Esc> 会被当成一个修改,执行 . 命令会删除从光标到当前单词结尾间的字符,并把它修改为 “rose”

这里我们又利用了前文中提到了 . 命令,你看,. 命令真的是妙用无穷,它对我们的日常工作真的有很大的效率提升。

接下来我们就将两个命令合二为一,每次我们按 n 键时,光标就会跳到下一个“senorita”单词所在之处,而当我们按 . 键时,它就会把光标下的单词改为“rose”。如果我们想替换所有地方,就可以不加思考地一直按 n.n.n. 以完成所有的修改(但是,这种情况下也可以用 :%s/senorita/rose/g 命令)。然而,由于我们需要留意不符合要求的匹配项,所以在按了 n 之后,我们要审视一下当前的匹配项,然后决定是否把它改为“rose”。如果需要修改的话,就按 . 命令,反之则不用。无论决定是什么,我们都可以再次按 n 移到下一个地方,如此循环往复,直到完成全部的修改。

替换命令 substitute

既然上面我们已经提到了替换命令 substitute,我们就再来学习一下。

substitute 命令的语法格式为::[range]s[ubstitute]/{pattern}/{string}/[flags]

[flags] 表示可选的标志位,常用的包括 gcne 等。其中,标志位 g 使得 substitute 命令可以修改一行内的所有匹配,而不仅仅是第一处匹配;标志位 c 可以确认或拒绝每一处修改;标志位 n 让 Vim 不执行替换操作,而只是统计和显示本次 substitute 命令匹配的个数;标志位 e 专门用于屏蔽错误提示;标志位 & 用于指示 Vim 重用上一次 substitute 命令所用过的标志位。

通过上述我们对 substitute 的语法学习,我们可以了解,有一个更快的命令就可以实现上述的替换功能,那就是 :%s/x/y/gc,通过 c 标志位我们可以确认或拒绝每一处修改,那么是不是更方便了呢!

结论

今天我们学习了两个查找并手动替换的命令:

  1. 组合命令 *.:通过 * 命令查找出所有需要修改的单次,然后执行 cw[words]<Esc>,并用 . 命令代替上述命令,不断执行 n. 即可;

  2. 替换命令 :%s/x/y/gc:通过 g 标志位实现全局替换,然后通过 c 标志位判断是否需要替换;

希望对大家有所帮助!

参考文档

往期文章