如何在不覆盖vim寄存器的情况下添加行

Map*_*pad 79 vim keyboard-shortcuts

我想在寄存器中划一条线:"{register}y但是不要覆盖寄存器中先前的内容.我经常需要在寄存器中复制非连续的行,我有时会像堆栈一样使用寄存器.

例:

line1
line2
line3
Run Code Online (Sandbox Code Playgroud)

我想复制line1,通过把光标放在它并输入"ay,然后事情line3"ay.然后,当我会做"ap,既line1line3将被粘贴.

这可能没有插件吗?有插件吗?

Mar*_*rkB 124

如果要附加到命名寄存器,请使用相应的大写字符.即在你的例子中:

"ayy
"Ayy
"ap

  • 有没有可能的方法附加到未命名的注册表?(主要的一个) (11认同)
  • @Zaffy http://stackoverflow.com/questions/18536511/vim-how-to-append-yanked-text-to-unnamed-register (3认同)

Rob*_*lls 11

只是为了扩展MarkB的响应,你知道你也可以使用标记为你的猛拉选择一个文本块吗?

转到要拉出的块的第一行,并在选择一个字母作为标记后输入标记命令,例如

ma  (entered in command mode, i.e. no colon)
Run Code Online (Sandbox Code Playgroud)

然后转到要阻塞的块的底部并输入命令:

:'a,.ya A
Run Code Online (Sandbox Code Playgroud)

这个命令意味着从包含我的标记的行中取出文本块,称为一个直到当前行并将其拉入缓冲区a.与MarkB提到的规则相同,使用小写缓冲区名称来覆盖缓冲区.使用大写缓冲区名称附加到缓冲区.所以在这种情况下,这将附加到缓冲区a的内容.

注意用于标记的"a"与用于选择注册的"a"无关.(AFAIK但是YMMV)

BTW'a(撇号a)是指含有标记a的线.`a(反引号a)是指输入ma时光标下的字符.

`ad`b (also entered in command mode)
Run Code Online (Sandbox Code Playgroud)

是有用的,因为它会删除标记为标记的字符之间的文本,直到您用标记b标记的字符之前的字符.