Vim:每次找到特定文本时添加粘贴缓冲区

Vim:每次找到特定文本时添加粘贴缓冲区,vim,buffer,paste,Vim,Buffer,Paste,在Vim中,我尝试粘贴几行: PROC SQL; CONNECT TO DB2(DSN=test); CREATE TABLE test AS SELECT * FROM CONNECTION TO DB2 ( 以“选择”开头的每行上方 及 在以“仅供提取”结尾的每行下方 有没有办法使用粘贴缓冲区?像 %s/^select/(a!)\rselect/ 因此,一旦我输入命令,它就会打开一个粘贴缓冲区,就像a!命令,并将其用作替代 谢谢, Dan如果您在寄存器a中有PROC S

在Vim中,我尝试粘贴几行:

PROC SQL;
   CONNECT TO DB2(DSN=test);
   CREATE TABLE test AS SELECT *
   FROM CONNECTION TO DB2 (
以“选择”开头的每行上方 及

在以“仅供提取”结尾的每行下方

有没有办法使用粘贴缓冲区?像

%s/^select/(a!)\rselect/
因此,一旦我输入命令,它就会打开一个粘贴缓冲区,就像a!命令,并将其用作替代

谢谢,
Dan

如果您在寄存器a中有
PROC SQL
块,并且
退出寄存器b中的块,然后您可以简单地执行以下操作

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

查找与给定模式匹配的所有行,然后在这些行上运行指定的ex命令。在这种情况下,如果您在寄存器a中有
PROC SQL
块,并且
退出,您希望使用粘贴指定的内容。

寄存器b中的块,然后您可以简单地执行以下操作

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

查找与给定模式匹配的所有行,然后在这些行上运行指定的ex命令。在这种情况下,您希望使用粘贴指定内容。

对于在行上方或下方插入文本的问题,我将使用jamessan的解决方案,即使用
:g/../put a
。但是,要回答有关将寄存器用作替换的一部分的问题,可以使用表达式替换,方法是以\=开头。因此,假设“PROC SQL;…”文本位于寄存器a中,这也应该满足您的要求:

:%s/^select/\=@a."\n".submatch(0)/
在表达式中@a计算为寄存器a的内容,submatch(0)是一个计算为正则表达式匹配的字符串的函数


请注意,整个替换被视为一个表达式,因此如果您想包含常规文本,则需要引用它并将字符串与
连接。对于在行上方或下方插入文本的问题,我将使用jamessan使用
:g/../put a
的解决方案。但是,要回答有关将寄存器用作替换的一部分的问题,可以使用表达式替换,方法是以\=开头。因此,假设“PROC SQL;…”文本位于寄存器a中,这也应该满足您的要求:

:%s/^select/\=@a."\n".submatch(0)/
在表达式中@a计算为寄存器a的内容,submatch(0)是一个计算为正则表达式匹配的字符串的函数


请注意,整个替换被视为一个表达式,因此如果您想包含常规文本,则需要引用它并将字符串与

连接起来,我认为
是一个
:append命令,而不是a寄存器。我认为
a
:append命令,而不是a寄存器。