如何执行Vim替换命令而不影响当前搜索模式?

6
我希望跳转到包含特定模式的行,并确定是否应用:s命令。
但是在应用:s命令后,'/'寄存器被替换为:s命令中的模式,使用原始模式跳转并不方便。
那么,有没有一个更方便的方法来完成这个任务? 谢谢!

1
我不太确定我理解你的用例!你搜索X,跳到匹配项,然后替换X还是想要替换Y?你知道如何确认替换吗?:s/<search>/<subst>/c - Lieven Keersmaekers
@Lieven Keersmaekers 感谢您的评论。我想搜索 X 然后用 Z 替换 Y。我知道 c 标志。但是 :s/<search>/<subst>/c 仍然会更改原始模式 X。 - foobar
也许您可以展示一些例子。全局命令可能会满足您的需求,而无需使用函数或模糊设置:pe. g/X/s/Y/Z/gc - Lieven Keersmaekers
3个回答

5

Vim(8+版本)提供了:keeppatterns命令,防止您的命令改变搜索寄存器。 示例:

:keeppatterns %s/foo/bar/g

如需更多帮助,请参见:h :keeppatterns


1
你可以通过vim脚本实现这一点。以下内容应该会有所帮助:
function! s:CustomSearch()
    let oldsearch = @/
    :%s/pattern/replace/flags
    let @/=oldsearch
endfunction

2
你也可以使用 :keeppatterns。例如::keeppatterns %s/foo/bar/g。请参阅 :h :keeppatterns - Peter Rincker
@PeterRincker 我觉得那应该是一个独立的答案。那完美地适用于这种情况。 - Randy Morris

1

在Vim手册中提供了另一种删除最后一个搜索模式的方法 (:help histdel):

call histdel("search",-1)
let @/ = histget("search",-1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接