查找
查找命令
命令 | 用途 |
---|---|
n | 跳至下一处匹配,保持查找方向与偏移不变 |
N | 跳至上一处匹配,保持查找方向与偏移不变 |
/ | 正向跳转至相同模式的下一处匹配 |
? | 反向跳转至相同模式的上一处匹配 |
查找历史
vim 会一直记录我们执行过的查找模式,因此可以方便地重用它们。当查找提示符出现时使用”向上方向键”浏览之前的查找记录
高亮查找匹配
查找命令允许我们在诸多匹配中快速跳转,但在缺省情况下,Vim 不会将这些匹配可视化地凸现出来。我们可以通过设置高亮来解决此问题(:h hlsearch)
设置和关闭方式:
:set nohlsearch/hlsearch
在执行查找前预览第一处匹配
缺省情况下,我们在输入查找模式时,Vim 不会进行查找,只有当我们按下 后,它才会立即展开行动。‘incsearch’可以执行前预览第一处匹配
设置和关闭方式:
:set noincsearch/incsearch
统计当前模式的匹配个数
%s///gn
substitute 命令,但标志位n 会抑制正常的替换动作。该命令不会对每处匹配进行替换,而是简单地统计匹配的次数,并将结果显示到命令行上。此处我们将查找域留空,旨在让Vim 使用当前的查找模式。替换域(由于标志位n 的缘故)不管怎样都将会被忽略,因此也可以将其留空
快速查找当前光标位置keyword
*:在普通模式下,* 命令让我们可以查找光标下的单词
替换
格式:
:[range]s[ubstitute]/{pattern}/{string}/[flags]
range 的规则对于每一条Ex命令都适用,substitute 命令也不例外
:substitute 命令很复杂,除了要提供查找的模式以及替换字符串外,还要指定执行的范围。另外,作为可选项,我们还可以通过标志位来调整该命令的行为(:h s_flags):
标志位 | 作用 |
---|---|
g | 使得subsititute 命令可在全局范围内执行,即可以修改一行内的所有匹配,而不仅仅是第一处匹配。 |
c | 让我们有机会可以确认或拒绝每一处修改。 |
n | 会抑制正常的替换行为,即让 Vim 不执行替换操作,而只是报告本次substitute 命令匹配的个数。 |
e | 用于屏蔽错误信息。如当我们执行 substitute 命令时,如果在当前文件中没有匹配到该模式,Vim 会提示错误信息“E486: 找不到模式”。 |
& | 仅仅用于指示Vim 重用上一次substitute 命令所用过的标志位。 |
替换域中的特殊字符
查找完整的特殊字符列表
:h sub-replace-special
贴一副图片上来(偷个懒太多了,文字还得排版)
手工控制每一处替换
引入c标志位即可,每次替换都询问,y替换当前匹配,n跳过当前匹配。
所有回应提示如下表(:h :s_c):
答案 | 用途 |
---|---|
y | 替换此处匹配 |
n | 忽略此处匹配 |
q | 退出替换过程 |
l | “last” —— 替换此处匹配后退出 |
a | “all” —— 替换此处与之后所有的匹配 |
<C-e> | 向上滚动屏幕 |
<C-y> | 向下滚动屏幕 |
重用上次的查找模式
将substitute 命令的查找域留空,意味着Vim 将会重用上次的查找模式。
*注意*
把查找域留空,会在命令历史中留下一项不完整的记录。由于模式通常保存在Vim 的查找历史记录中,而substitute 命令则保存于Ex 命令的历史记录中(参见:h cmdline-history )。因此,将查找任务与替换任务分离,会致使这两组信息被单独存放,从而导致当你再想重用之前的substitute 命令时,会遇到困难
用寄存器的内容替换
实际上,我们不必手动输入完整的替换字符串。如果某段文本已在当前文档中出现,我们可以先把它复制到寄存器,再通过传值或引用的方式将寄存器的内容应用至替换域。
另种方式(以复制专用寄存器(”0)为例):
1)传值
通过输入<C-r>{register},我们可以将寄存器的内容插入到命令行.
执行yy赋值命令使得寄存器0中有值或者执行命令:let @0=’test’
vim test.sh
/a
:let @0='test'
:%s//<C-r>0/g 实际效果是:%s//test/g
Vim 会把寄存器0 的内容粘贴进来,这意味着我们可以在执行substitute 命令之前对其进行一番检查
*注意*如果寄存器0 中的文本包含了在替换域中具有特殊含义的字符(例如& 或~),我们必须手动编辑这段文本,对这些字符进行转义。另外,如果寄存器0 包含多行文本,有可能在命令行上显示不全。
2)引用
执行yy赋值命令使得寄存器0中有值或者执行命令:let @0=’test’
vim test.sh
/a
:let @0='test'
:%s//\=@0/g
替换域中出现的\= 将指示 Vim 执行一段表达式脚本。在Vim 脚本中,我们可以用@{register} 来引用某个寄存器的内容。
*注意* 这里用到了:let @{register}=’xxxxx’
未完待续……
原文链接:https://www.f2er.com/bash/392003.html