Vim: добавлять буфер вставки каждый раз, когда найден определенный текст - PullRequest
1 голос
/ 03 марта 2010

В Vim я пытаюсь вставить несколько строк:

PROC SQL;
   CONNECT TO DB2(DSN=test);
   CREATE TABLE test AS SELECT *
   FROM CONNECTION TO DB2 (

над каждой строкой, начинающейся с «select» и

);
quit;

ниже каждой строки, которая заканчивается "ТОЛЬКО ДЛЯ FETCH"

Есть ли способ использовать буфер вставки? Как

%s/^select/(a!)\rselect/

чтобы после ввода команды он открыл буфер вставки, такой как команда a! , и использовал его в качестве замены?

Спасибо, Dan

Ответы [ 2 ]

3 голосов
/ 03 марта 2010

Если у вас есть блок PROC SQL в регистре a и блок quit; в регистре b, то вы можете просто сделать следующее.

:g/^select/put! a
:g/FOR FETCH ONLY$/put b

: g находит все строки, соответствующие заданному шаблону, а затем запускает указанную команду ex в этих строках. В этом случае вы хотите использовать : put для вставки содержимого указанных регистров .

1 голос
/ 04 марта 2010

Для вашей проблемы вставки текстового текста выше или ниже строки, я бы пошел с решением jamessan использования :g/.../put a. Однако, чтобы ответить на ваш вопрос об использовании регистра как части замены, вы можете использовать выражение для замены, начав его с \ =. Так что это также должно делать то, что вы хотите, предполагая, что текст «PROC SQL; ...» находится в регистре a:

:%s/^select/\=@a."\n".submatch(0)/

в выражении @a оценивает содержимое регистра a, а submatch (0) - это функция, которая оценивает строку, совпадающую с регулярным выражением.

Обратите внимание, что вся замена рассматривается как выражение, поэтому, если вы хотите включить обычный текст, вам нужно заключить его в кавычки и объединить строки с ..

...