如何在不影响当前搜索模式的情况下执行Vim替换命令?

如何在不影响当前搜索模式的情况下执行Vim替换命令?,vim,Vim,我想跳转到包含特定模式的行,并确定是否应用:s命令 但在应用:s命令后,“/”寄存器被:s命令中的模式替换, 而且使用原始模式跳转也不是很方便 那么,它是否有一种舒适的方式来完成这项任务呢? 谢谢 您可以通过vim脚本实现这一点。以下几点应该会有所帮助: function! s:CustomSearch() let oldsearch = @/ :%s/pattern/replace/flags let @/=oldsearch endfunction Vim(版本8+

我想跳转到包含特定模式的行,并确定是否应用:s命令

但在应用:s命令后,“/”寄存器被:s命令中的模式替换, 而且使用原始模式跳转也不是很方便

那么,它是否有一种舒适的方式来完成这项任务呢?

谢谢

您可以通过vim脚本实现这一点。以下几点应该会有所帮助:

function! s:CustomSearch()
    let oldsearch = @/
    :%s/pattern/replace/flags
    let @/=oldsearch
endfunction
Vim(版本8+)提供了
:keeppatterns
命令,可防止您的命令更改搜索寄存器。例如:

:keeppatterns %s/foo/bar/g

有关更多帮助,请参见Vim手册(
:help histdel
)中提供了另一种删除最后一个搜索模式的方法:


我不确定我是否理解你的用例?!搜索X,跳转到匹配项,然后替换X,还是要替换Y?你知道确定取代基吗<代码>:s///c@Lieven Keersmaekers感谢您的评论。我想搜索X,然后用Z替换Y。我知道c标志。但是:s///c仍将更改原始模式X。也许您可以展示一些示例。全局命令可以执行您需要的操作,而不必使用函数或模糊设置:pe
g/X/s/Y/Z/gc
您还可以使用
:keeppatterns
。e、 g.
:保持模式%s/foo/bar/g
。参见
:h:keeppatterns
@PeterRincker我觉得这应该是一个答案。这完全符合这种情况。
call histdel("search",-1)
let @/ = histget("search",-1)