2010-10-13 40 views
22

我希望在Vim中使用寄存器的內容作爲搜索模式。使用寄存器值作爲搜索模式

我想在命令行中這樣做,所以因爲它假定一個交互式會話我不能使用<c-r>語法。

它可能使用一個寄存器作爲替換圖案,這樣

:%s/foo/\[email protected]/g 

但是使用此語法作爲搜索圖案不起作用

:%s/\[email protected]/foo/g 

它輸出

E64: \= follows nothing 
E476: Invalid command 
+0

但大多數來這裏的人可能正在尋找'':[相關問題+答案](https://stackoverflow.com/q/101258/1143274)。 – 2017-11-19 09:00:21

回答

11

,我不認爲它直接是可能的,但你可以使用:exe來實現這一目標:

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

我更喜歡這個答案,因爲我可以將多個變量傳遞給腳本。舉例來說,我需要通過兩個變量來確定搜索範圍,我可以使用這個:':exe'/ ^'來實現。 @一個 。 '/,/ ^'。 @b。 '/ s /'。 @C 。 '/'。 @d。 「/ g''。 – lerner 2015-08-10 11:06:57

11

在模式(不更換零件),\=代表「0或1時間」(這是一個代名詞對於\?,應優先於\?,因爲後者向後看時意味着文字?

詳情請參閱:help /\=help pattern

爲什麼不:

let @/[email protected] 
%s//foo/g 
+0

我接受了Al的回答,因爲它也適用於像''vimgrep''這樣的其他命令(我也希望控制它)。 – pkit 2010-10-13 11:06:12

+1

沒問題。選擇答案時不要道歉,我們知道你只能選擇一個答案。 – Benoit 2010-10-13 11:07:32

10

您可以用/寄存器

做到這一點這並不解決一般問題,但它似乎對我來說,/寄存器在這方面特別:如果您將搜索詞留空,它將使用/寄存器中的任何內容;即最後搜索的任何內容。

所以,如果你想用@a的內容替換foo,你可以這樣做:

  1. 搜索foo
  2. %s//\[email protected]/g(或突出顯示某些文本並開始鍵入:s僅在該範圍內替代)