简要记录 Vim 中常用的搜索和替换功能。
搜索
行内搜索
在 Vim 中行内搜索的最简单方法莫过于使用f键,即按下f键后,再次按下要搜索单词的任意字母便会跳到对应位置。不过缺点也同样明显:只能对单字符进行搜索,且不支持中文。
- 向前搜索:
f - 向后搜索:
F - 上一匹配:
, - 下一匹配:
;
其实严格意义上f键并不是一个「搜索」motion,而是「移动」motion,不过有时候搜索一个字符也是为了移动到对应位置,因此这里也一并提及。
全文搜索
/是进入全文搜索的触发键,按下该键之后输入想要搜索的字符,再按回车键即可跳到第一个匹配处,此时可以按n继续向下搜索,或按N往回搜索。
- 向前搜索:
/ - 向后搜索:
? - 上一匹配:
N - 下一匹配:
n
另外默认搜索是区分大小写的,如果要忽略大小写,可以使用元字符\c:
Hello Vim
# 下面两个的作用是相同的/ he\c/\c he如果只想搜索处于行首或行尾的字符,可以使用元字符^和$:
Hello VimVim Hello
# 匹配行首/^He
# 匹配行尾/He$需要注意的是匹配行首的元字符必须放在搜索字符前,同样匹配行尾的元字符必须放在末尾。
光标字符搜索
如果想搜索的字符刚好处于光标下,使用*键是一个比/键更加优雅的办法,按下该键后会立即跳到下一个匹配处。同样可以使用n和N键进行向前和往后匹配。
替换
替换和搜索不同,并没有独立的按键直接进入替换模式,而是同样使用:进入命令行模式后,以s作为元字符标示。一个最简单的替换命令为:/s/Vim/World,作用是把当前行的Vim替换为World,重复执行使用&键,当然也只对当前行有效。
- 进入替换模式:
:s/目标/替换 - 重复替换:
&
如果想对当前行所有匹配都执行替换,可以在末尾增加标志符/g,即:s/目标/替换/g。
作用范围
作用范围是指可以进行替换操作的范围:/作用范围s/目标/替换/g。
全局
使用百分号%(等效于1,$)表示对全局进行操作:%s/目标/替换/g。
Hello VimHi Vim
# 替换所有 Vim 为 vi:%s/Vim/vi/g指定范围
指定范围有两种方式,一是直接使用行号标记,另一种是使用高亮选取:
Hello VimHi Vim
# 行号标记,替换 1-42 行:1,42s/Vim/vi/g如果使用高亮选取,需先选中需要操作的范围,然后按:键会自动补全范围:
Hello VimHi Vim
# 高亮范围:'<,'>:'<,'>s/Vim/vi/g标志符
标志符便是前面提到用于替换所有匹配的/g,一般位于最后:%s/目标/替换/标志符,除了必备的/g之外还有几个常用的标志符。
替换前提示
如果想在替换前进行确认,可以在末尾增加标志符c,即%s/目标/替换/gc,这样只有按指定键后才会执行操作:
- 替换:
y - 忽略:
n - 全部:
a - 退出:
Esc或q
统计匹配数
自然,能替换同样也可以搜索,使用标志符n可以抑制正常的替换操作,达到搜索目的,而且还有一个额外的功能,即统计匹配的数量。命令如下:%s/目标//gn