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

98
我想将一行复制到寄存器中:"{register}y,但不要覆盖之前已经在寄存器中的内容。我经常需要在寄存器中复制非连续的行,并且有时希望像使用堆栈一样使用这些寄存器。
例子:
line1
line2
line3

我想通过在line1上放置光标并输入"ay,然后进入line3并执行"ay来复制line1。 然后,当我执行"ap时,line1line3都将被粘贴。

没有插件是否可能实现这一点?有插件可以实现吗?


非常适合在文件顶部快速列出定义的简单清单。 - Joe McGrath
2个回答

143

如果您想追加到一个已命名的寄存器,使用相应的大写字符即可。 例如,在您的示例中:

"ayy
"Ayy
"ap
其中,"ayy 将当前行复制到 a 寄存器;"Ayy 将当前行附加到 A 寄存器中的文本末尾;"ap 将 A 寄存器中的文本粘贴到当前位置之后。

13
可以在未命名的寄存器(即主要寄存器)中追加内容��? - Zaffy
3
@Zaffy https://dev59.com/DmMl5IYBdhLWcg3wRlTp - PonyEars
为了节省页面访问,我认为最好使用命名寄存器。当您键入“a”,然后输入“using register a…”时,将会把内容追加到寄存器a中。 - Rob Kielty

12

补充一下MarkB的答案,你知道你还可以使用标记来选择要复制的文本块吗?

跳转到你想复制的文本块的第一行,在选择一个字母作为标记后输入标记命令,例如:

ma  (entered in command mode, i.e. no colon)

然后跳到你想要复制的代码块底部,输入以下命令:

:'a,.ya A

这个命令的意思是从包含了名为 "a" 的标记的那一行开始,一直到当前行,将这段文本复制到缓冲区 "a" 中。和MarkB提到的规则相同,使用小写的缓冲区名称来覆盖该缓冲区,使用大写的缓冲区名称来向该缓冲区追加内容。所以在这种情况下,它会将内容追加到缓冲区 "a" 中。

注意:用作标记的 'a' 与用于选择寄存器的 'a' 没有任何关系。(据我所知但可能因人而异)

顺便说一下,'a(撇号后面跟着a)' 是指包含标记 a 的那一行。'`a'(反引号后面跟着a)' 是指输入 ma 时光标下面的字符。

d`a (also entered in command mode)

这个命令很有用,因为它将删除标记为a的字符之间的文本,直到您当前光标所在位置的前一个字符。


'a,.ya A' 可以正常工作,但是当我在 a 前面加上 'tick' --> `a 时,它会显示:E492: Not an editor command: `a,.ya A。如果示例中的标记只使用字母 a 以外的字符,将难以理解哪个字母代表哪个内容 :) - justin w
我什么时候会使用这个命令,而不是使用可视模式来选择要复制的文本呢? - Ralph
@ Ralph,这只是关于你编程时大脑如何工作的问题。如果你习惯使用GUI来完成任务,那就继续使用它。我发现使用这种技术有助于我保持"代码模式",我的思维方式是基于可以重复使用的功能块。希望有所帮助。 - Rob Wells
@justinw 语法已更改,现在删除命令为"d`a",用于从当前光标位置删除到标记"a"所在位置,而"d'a"则用于从当前光标位置删除到包含标记"a"的行。希望对你有所帮助。 - Rob Wells
@RobWells 我并不是要告诉你做错了什么,只是想减少总击键数。据我所知,使用可视模式比标记使用更少的击键(而且据我所知,与标记一样“可重用”,例如录制模式)。例如,要复制一个段落,假设您已经导航到开头,只需键入 v}"ryv 表示可视模式,} 表示段落结尾," 表示寄存器名,r 表示目标寄存器,y 表示复制)。也许您可以分享一下非连续行的例子,其中标记优于可视模式?干杯。 - Ralph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接