简要记录 Vim 中常用的搜索和替换功能。

搜索

行内搜索

在 Vim 中行内搜索的最简单方法莫过于使用f键,即按下f键后,再次按下要搜索单词的任意字母便会跳到对应位置。不过缺点也同样明显:只能对单字符进行搜索,且不支持中文。

  • 向前搜索:f
  • 向后搜索:F
  • 上一匹配:,
  • 下一匹配:;

其实严格意义上f键并不是一个「搜索」motion,而是「移动」motion,不过有时候搜索一个字符也是为了移动到对应位置,因此这里也一并提及。

全文搜索

/是进入全文搜索的触发键,按下该键之后输入想要搜索的字符,再按回车键即可跳到第一个匹配处,此时可以按n继续向下搜索,或按N往回搜索。

  • 向前搜索:/
  • 向后搜索:?
  • 上一匹配:N
  • 下一匹配:n

另外默认搜索是区分大小写的,如果要忽略大小写,可以使用元字符\c

Hello Vim

# 下面两个的作用是相同的
/ he\c
/\c he

如果只想搜索处于行首或行尾的字符,可以使用元字符^$

Hello Vim
Vim Hello

# 匹配行首
/^He

# 匹配行尾
/He$

需要注意的是匹配行首的元字符必须放在搜索字符前,同样匹配行尾的元字符必须放在末尾。

光标字符搜索

如果想搜索的字符刚好处于光标下,使用*键是一个比/键更加优雅的办法,按下该键后会立即跳到下一个匹配处。同样可以使用nN键进行向前和往后匹配。

替换

替换和搜索不同,并没有独立的按键直接进入替换模式,而是同样使用:进入命令行模式后,以s作为元字符标示。一个最简单的替换命令为:/s/Vim/World,作用是把当前行的Vim替换为World,重复执行使用&键,当然也只对当前行有效。

  • 进入替换模式::s/目标/替换
  • 重复替换:&

如果想对当前行所有匹配都执行替换,可以在末尾增加标志符/g,即:s/目标/替换/g

作用范围

作用范围是指可以进行替换操作的范围:/作用范围s/目标/替换/g

全局

使用百分号%(等效于1,$)表示对全局进行操作:%s/目标/替换/g

Hello Vim
Hi Vim

# 替换所有 Vim 为 vi
:%s/Vim/vi/g

指定范围

指定范围有两种方式,一是直接使用行号标记,另一种是使用高亮选取:

Hello Vim
Hi Vim

# 行号标记,替换 1-42 行
:1,42s/Vim/vi/g

如果使用高亮选取,需先选中需要操作的范围,然后按:键会自动补全范围:

Hello Vim
Hi Vim

# 高亮范围:'<,'>
:'<,'>s/Vim/vi/g

标志符

标志符便是前面提到用于替换所有匹配的/g,一般位于最后:%s/目标/替换/标志符,除了必备的/g之外还有几个常用的标志符。

替换前提示

如果想在替换前进行确认,可以在末尾增加标志符c,即%s/目标/替换/gc,这样只有按指定键后才会执行操作:

  • 替换:y
  • 忽略:n
  • 全部:a
  • 退出:Escq

统计匹配数

自然,能替换同样也可以搜索,使用标志符n可以抑制正常的替换操作,达到搜索目的,而且还有一个额外的功能,即统计匹配的数量。命令如下:%s/目标//gn

参考