【问题标题】:Use a register value as search pattern使用寄存器值作为搜索模式
【发布时间】:2010-10-13 09:44:03
【问题描述】:

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

我想从命令行执行此操作,因此我不能使用 <c-r> 语法,因为它假定一个交互式会话。

可以使用寄存器作为替换模式,像这样

:%s/foo/\=@a/g

但是,将这种语法用作 搜索 模式是行不通的

:%s/\=@a/foo/g 

输出

E64: \= follows nothing
E476: Invalid command

【问题讨论】:

标签: vim


【解决方案1】:

我不认为直接可以,但是你可以使用:exe来实现这个:

:exe '%s/' . @a . '/foo/g'

【讨论】:

  • 我更喜欢这个答案,因为我可以将多个变量传递到脚本中。例如,我需要通过两个变量来确定搜索范围,我可以这样做::exe '/^' . @a . '/,/^' . @b . '/s/' . @c . '/' . @d . '/g'.
【解决方案2】:

在一个模式(不是替换部分)中,\= 代表“0 或 1 次”(它是 \? 的同义词,应该优先于 \?,因为后者表示文字 ?向后看时。

请参阅:help /\=help pattern 了解更多详情。

为什么不:

let @/=@a
%s//foo/g

【讨论】:

  • 我接受了 Al 的回答,因为它也适用于其他命令,例如 vimgrep(我也想控制)。
  • 没问题。选择答案时不要道歉,我们知道您只能选择一个。
【解决方案3】:

您可以使用/ 寄存器来完成此操作

这并不能解决一般问题,但在我看来/ 寄存器在这方面是特殊的:如果您将搜索词留空,它将使用/ 寄存器中的任何内容;即,您最后搜索的内容。

所以如果你想用@a的内容替换foo,你可以这样做:

  1. 搜索foo
  2. %s//\=@a/g(或突出显示某些文本并开始输入 :s 以仅在该范围内替换)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 2014-02-05
    • 2011-01-25
    • 2018-10-05
    • 2016-07-08
    相关资源
    最近更新 更多