Использовать значение регистра в качестве шаблона поиска

Я хочу использовать содержимое регистра в качестве шаблона поиска в Vim.

Я хотел бы сделать это из командной строки, поэтому я не могу использовать синтаксис <c-r>, так как это предполагает интерактивный сеанс.

В качестве шаблона замены можно использовать регистр, например

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

Однако использование этого синтаксиса в качестве шаблона поиска не работает

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

выводит

E64: \= follows nothing
E476: Invalid command

Ответ 1

Я не думаю, что это возможно напрямую, но вы можете использовать :exe для достижения этого:

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

Ответ 2

В шаблоне (а не в замещающей части) \= означает "0 или 1 раз" (это синоним для \? put должен быть предпочтительнее \?, поскольку последний означает литерал ? когда смотришь назад.

Подробнее см. :help /\= и help pattern.

Почему бы и нет:

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

Ответ 3

Вы можете сделать это с помощью регистра /

Это не решает общую проблему, но мне кажется, что регистр / является особым в этом отношении: если вы оставите пустой пробел, он будет использовать все, что находится в регистре /; а именно, что бы вы ни искали в последний раз.

Итак, если вы хотите заменить foo на содержимое @a, вы можете сделать это:

  • Искать foo
  • %s//\[email protected]/g (или выделите текст и начните вводить :s для замены только в этом диапазоне)