Vim常用匹配、查找、替换命令总结
今天这篇是整个Vim专题的最后一篇,想看之前的篇目可以进专题详细阅读。
按模式匹配及按原义匹配
①设置全局大小写敏感
Vim支持全局性的设置大小写敏感,也支持在每次查找时进行局部调整。
如果启用 'ignorecase' 则Vim将不再区分大小写。当然也有与之相对应的 'smartcase' 选项,当 'smartcase' 被设置时,只要输入有大写字母,即使设置过 'ignorecase' 选项也将不再生效。
也就是说, 'smartcase' 选项在无大写字母的情况下是忽略大小写的匹配,一旦有大写字母,则转为大小写敏感型匹配。
: set ignorecase 忽略大小写
: set smartcase 强制大小写敏感,可覆盖ignorecase
②每次查找时设置大小写敏感
可以使用元字符 '\c' 和 '\C' 来覆盖Vim的大小写敏感设置。'\c' 指定匹配时忽略大小写,而 '\C' 则在匹配时强制区分大小写。注意: '\c' 和 '\C' 使用时自动忽略 'ignorecase' 选项
当上述元字符与①中提到的两个选项使用汇总:
模式 'ignoerecase' 'smartcase' 匹配
foo off - foo
foo on - foo Foo FOO等
foo on on foo Foo FOO等
Foo on on Foo
Foo on off foo Foo FOO等
\cfoo - - foo Foo FOO等
foo\C - - foo
③按正则表达式查找
按正则表达式匹配需要通过 '\v' 命令开启。该元字符将激活very magic搜索模式,即假定除数字0~9,大小写字母及下划线之外的所有字符都具有特殊含义。
有当前文本
搜索十六进制颜色代码,使用正则表达式:/#([0-9a-fA-F]{6}|[0-9a-fA-F]{3}),进行正则匹配
正则匹配 效果④按原义匹配
正则表达式的特殊字符在按模式查找时很顺手,但如果希望按照原义查询文本时,会有阻碍。 '\V' 将会使Vim按照原义进行查找。例如,现在有文本
原文本查询文本 "c.l.r",正常情况下通过 '/c.l.r' 的效果
匹配子串被当作正则表达式使用 '\V' 进行原义匹配
输入原义匹配命令 原义匹配⑤界定单词的边界
经常遇到这种情况,如果文本中含有 'the'、'these' 等单词,通过 '/the' 命令进行匹配时,会将所有含有 'the' 的单词的相应部分高亮显示。如果我们只是想单纯的匹配单词 'the' 可以使用在very magic模式下使用 '<>' 对单词进行定界。
'/the'匹配效果
使用very magic + <>定界
'/\v<the>'
⑥转义问题字符
'\V' 可以转义 '+'、'.'、'*'等字符的特殊含义,但仍有一些字符的特殊含义无法被屏蔽掉
(1)正向查找转义 / 字符
原文本对原文本,现在希望找到所有出现 'http://viexe.com/search?q=/\' 的地方,如果使用 '\V' 开启原义匹配。 '\V'原义匹配 效果
会发现Vim实则按照 '/\Vhttp' 进行匹配,原因是其将第一次出现的 '/'解析成了结束符号。
正向查找时,需要将每个 '/' 前添加一个 '' 进行转义。将命令改为 '/\Vhttp://viexe.com/search?q=/\'即可完成查找 '/\Vhttp://viexe.com/search?q=/\'匹配
(2)反向查找转义 ?
执行反向查找时, '?' 会被当作查找域的结束符。反向查找不必对 '/' 进行转义。
需要在 '?' 前使用 '' 进行转义,将匹配命令变为'?http://viexe.com/search?q=/\' '?http://viexe.com/search?q=/\'
(3)每次都要转义
细心的朋友发现(1)、(2)中改变匹配方式后,匹配项最后都会缺少一个 ''。因为 '\' 中第一个 '' 也会被当作转义字符,将第二个 '' 转为普通文本,相当于一个 '',因此需要对两个 ''都进行转义,只需要变为 '\\' 即可。有点不好理解,但确实能达到效果。 转义'' 完成
查找总结
每次查找操作通过 '/' 或者 '?' 命令开启,输入匹配项之后敲击回车键进入查找模式,<Esc>键退出。
①查找的方向
查找的方向可以是正向查找和反向查找,正向查找通过 '/' ,反向通过 '?' 。
重复上一次查找,通过 'n' 跳到下一处匹配, 'N' 跳到上一处匹配。注意这里的上一处和下一处是与查找方向相对应的。如果是正向查找,下一处指文本阅读顺序的下一处。反向查找的下一处,即是文本倒序的下一处。
方向命令汇总:
n 跳转到下一处,保持方向和偏移不变
N 跳转到上一处,保持方向和偏移不变
/ 跳转到 '/' 模式下的下一项匹配
? 跳转到 '?' 模式下的下一项匹配
②将光标移到匹配项的结尾
之前的匹配无论是 '/' 还是 '?' ,都会将光标移到单词的开头,如果希望光标锁定单词的结尾,可以通过添加 'e' 命令。
例如对原文本进行 "the" 的匹配查询
替换命令汇总
①认识substitute命令
':substitue'命令除了要提供查找的模式和替换的字符串之外,还要指定执行的范围。可以指定标志位调整命令的行为,这一项是可选项。
'substitue' 最常用的方式是先查找一段文本再将其替换掉。命令语法:
:[range] s[ubstitute] /{pattner}/{string}/[flags]
{string}是替换域,其中包含一些特殊字符
\r 换行符
\t 制表符
\\ 一个反斜杠
& 匹配模式的所有内容
~ 上次使用subsitute时的{string}
[flags]是标志位,常见标志位有
g 指定全局执行
c 有机会确认每次修改,每处匹配项替换时会确认,'y'为确认替换,'n'反之
n 会抑制每次替换,只返回substitue的匹配个数
& 用于使用上次substitue使用的标志位
②文件范围内查找并替换每一处匹配
使用命令
:%s/{pattner}/{string}/g
'/g'看上去是global的意思,实则只代表当前一整行的范围。'%'的意思是处理纵轴的行,与'/g'结合便可以处理全文。没有'%'则命令只能替换当前行的所有匹配项。
③手动控制每一次替换操作
需要使用到①中的'/c'标志位。
现在手动控制替换文本中所有hello为hi。
'/g'和'/c'配合使用 替换前确认 'y'完成替换对于每次手动操作,会有几个选项,每个选项的含义
y 替换此处匹配
n 忽略此处匹配
q 退出替换过程
l "last"——替换此处后退出
a "all"——替换此处之后所有的匹配
Ctrl + e 向上滚动屏幕
Ctrl + y 向下滚动屏幕
④重复上一次substitue命令
加入通过命令':s/hello/hi/g' 将当前行的hello替换为hi,之后希望通过相同的操作替换文本所有的hello,除了使用命令 ':%s/hello/hi/g' 之外还可以通过一下方式完成
其中 '~' 和 '&' 之前都有提到,分别表示之前的替换域和标志位。其实还有更简洁的方式,就是通过 'g&' 命令完成全局的替换。