Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim 使用寄存器值作为搜索模式_Vim - Fatal编程技术网

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' 在模式(不是替换部件)中,\=表示

我希望使用寄存器的内容作为Vim中的搜索模式

我想从命令行执行此操作,因此我不能使用
语法,因为这假定为交互式会话

可以使用寄存器作为替换模式,如下所示

:%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'
    。但是大多数到这里来,你可能正在寻找
    :。