Vim 使用寄存器值作为搜索模式
我希望使用寄存器的内容作为Vim中的搜索模式 我想从命令行执行此操作,因此我不能使用Vim 使用寄存器值作为搜索模式,vim,Vim,我希望使用寄存器的内容作为Vim中的搜索模式 我想从命令行执行此操作,因此我不能使用语法,因为这假定为交互式会话 可以使用寄存器作为替换模式,如下所示 :%s/foo/\=@a/g 但是,将此语法用作搜索模式不起作用 :%s/\=@a/foo/g 它输出 E64: \= follows nothing E476: Invalid command 我认为这不可能直接实现,但您可以使用:exe来实现: :exe '%s/' . @a . '/foo/g' 在模式(不是替换部件)中,\=表示
语法,因为这假定为交互式会话
可以使用寄存器作为替换模式,如下所示
:%s/foo/\=@a/g
但是,将此语法用作搜索模式不起作用
:%s/\=@a/foo/g
它输出
E64: \= follows nothing
E476: Invalid command
我认为这不可能直接实现,但您可以使用
:exe
来实现:
:exe '%s/' . @a . '/foo/g'
在模式(不是替换部件)中,\=
表示“0或1次”(它是\?
的同义词,因此在向后看时,put应优先于\?
,因为后者表示文字?
有关详细信息,请参见:help/\=
和帮助模式
为什么不:
let @/=@a
%s//foo/g
您可以使用/
寄存器执行此操作
这并不能解决一般问题,但在我看来,/
寄存器在这方面是特殊的:如果您将搜索词留空,它将使用/
寄存器中的任何内容;即,您最后搜索的内容
因此,如果要用@a
的内容替换foo
,可以执行以下操作:
搜索foo
%s/\=@a/g
(或者突出显示一些文本,然后开始键入:s
,以仅在该范围内替换)
我接受了Al的回答,因为它也适用于其他命令,如vimgrep
(我也希望控制它)。没问题。选择答案时请不要道歉,我们知道您只能选择一个。我更喜欢这个答案,因为我可以将多个变量传递到脚本中。举例来说,我需要通过两个变量确定搜索范围。我可以使用以下方法来确定搜索范围::exe'/^.@a'/./^.@b'/./s/'.@c'/.@d./g'
。但是大多数到这里来,你可能正在寻找
:。