默认情况下,每当执行Vim查找命令时,光标总会被定位于匹配的字母上。

虽然这种缺省操作看起来比较合理,但可能有时候需要将光标定位于查找匹配的结尾或其他相对位置,然后执行某些操作。

Vim 的查找偏移功能用来指定光标相对于找到的匹配的位置,可以灵活指定搜索到目标单词后光标所在的具体位置,使用Vim命令 :h search-offset 可查看官方的Vim查找偏移介绍。

例如,在下面这段文本中,需要将所有出现 lang 的地方扩展为完整的单词 language。

1
2
3
Aim to learn a new programming lang each year.
Which lang did you pick up last year?
Which langs would you like to learn?

这是一个典型的使用Vim替换命令 substitute 就可以完成的操作,使用Vim命令 :%s/lang/language/g 即可达到目的。

下面考虑使用Vim点范式查找偏移实现另外一种方案。

2. 使用Vim查找偏移进行单词替换

首先需要明确,在上面这段文字中,有一个单词 langs,按要求应该是将 langs 扩展成 languages。

如果通过某种方式能将光标移动到每个匹配项 lang的结尾字符处,就可以使用Vim插入命令 a 在当前光标后面插入需要增加的内容。

Vim查找偏移命令 /lang/e 会从当前位置往后进行查找,并且将光标置于查找匹配的结尾,然后执行 auage 在当前匹配的结尾处增加字符 uage,将第一个 lang 替换为 language。

此后,使用Vim命令 n. 找到下一处匹配并重复执行上一次的修改命令,最终可完成将当前文档所有 lang 扩展为 language 的任务。

vim-search-offset

3. Vim查找偏移

Vim查找偏移用来指定光标相对于找到的匹配的位置。Vim支持的查找偏移类型包括:

Vim查找偏移 光标位置
+[num] 相对于找到的匹配的 [num] 行向下,第一列
-[num] 相对于找到的匹配的 [num] 行向上,第一列
e[+num] 从匹配结束 (end) 处算起,[num] 字符向
e[-num] 从匹配结束 (end) 处算起,[num] 字符向
s[+num] 从匹配开始 (start) 处算起,[num] 字符向
s[-num] 从匹配开始 (start) 处算起,[num] 字符向
b[+num] 等价于 s[+num] (b 表示 begin)
b[-num] 等价于 s[-num]

:在上面的Vim查找偏移命令中,如果给出了 -+ 但省略了 [num],会使用缺省的值 1。

例如,/test/+1 会将光标移动到查找目标 test 所在行的下一行第一列位置,test/s+2 会将光标移动到目标词 test 中的 s 上,而 /test/b-4 则会将光标移动到 test 的第 4 个字符。
vim-search-offset

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