在Vim中复制黏贴一行后,为什么不能再次黏贴它?

9
这个问题可能以前就有人问过,但我试过搜索了却找不到答案。
我对Vim还比较新手,遇到了以下问题。一旦我复制了一行并粘贴,我就无法再次粘贴它。例如,在Word环境中,您会复制文本,粘贴它,然后可以将其进一步粘贴。但是在Vim中,一旦我粘贴它,然后再尝试粘贴(p),它就会将我粘贴的文本覆盖在被复制的那一行上。
例如,我将“这一行已经复制”复制到“I don't want this line”上,因此“这一行已经复制”取代了“I don't want this line”。如果我再次点击p,我将不会得到“这一行已经复制”的粘贴,而是会得到“I don't want this line”。
是否有办法让我再次粘贴相同的复制行,而不必回去再复制一次?
2个回答

13
这是因为vim的寄存器。当你将一个复制的行粘贴到另一行上时,你刚刚删除(通过粘贴)的行将取代默认寄存器中(用于存储复制的行)复制的行的位置。这是为了使切换行更容易。复制一行,粘贴到另一行上,然后返回并再次粘贴即可。但是,为了保留已复制的行,您可以指定一个寄存器,所以不要使用y,而应该使用"ay,这将把您的行复制到寄存器a中。现在可以使用"ap进行粘贴,这将粘贴寄存器a的内容,这样就不会被覆盖掉了。
额外赠品:"+y"*y"+p"*p如果在vim中启用了它(在大多数系统上都启用了),则从系统剪贴板(其他应用程序的复制黏贴)中粘贴。
编辑:如评论中所述,当您使用复制命令时,复制的文本不仅进入默认寄存器,还进入0寄存器(当您粘贴到其他地方时不会被覆盖)。这意味着通常可以使用y进行复制,然后使用"0p进行粘贴,它不会被您粘贴的任何内容覆盖。

3
这个答案里的所有内容都是真实的。我只想补充一下,yank(复制)的内容不仅会被放到默认寄存器中,还会放到编号为 0 的寄存器中,该寄存器始终保存最近 yank 的文本;它不像默认寄存器那样被删除或更改所覆盖。这意味着,如果您想再次粘贴某些内容,即使执行了删除操作,您也可以使用 "0p 命令进行粘贴,而无需重新复制文本或手动复制到命名寄存器中。 - Trevor Powell
啊,我不知道那个,非常有用,谢谢。 - Zach
谢谢,你的回答解释得很好! - rachkov91

12

来自我的 .vimrc 文件:

"Paste in visual mode without copying
xnoremap p pgvy

说明:

xnoremap - 仅在可视模式下重新映射

p - 粘贴

gv - 重新选择上一个选择(不是当前所处的选择,而是原始选择)

y - 将其复制(最后的选择)

在此映射中,您可以一遍又一遍地覆盖可视选定行。


3
太好了!为了完整性,还可以添加 xnoremap P Pgvy,这样就可以使用P了。 - Blasco

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