如何在Vim中复制一个单词并粘贴到另一个单词上?

21

我知道如何复制一个单词,但是当我尝试覆盖剪贴板中的内容时,好像会覆盖掉原来的内容,这导致我无法成功复制单词。

要复制一个单词,我可以使用:

bye

如何复制一个单词?


不确定是否完全重复,但很接近:https://dev59.com/yXE95IYBdhLWcg3wEpvo - Marc B
https://dev59.com/rmYq5IYBdhLWcg3wvzGm#66910215 - ABN
7个回答

36

也许您只是想这样做:

viwp

这会在视觉上选择一个新单词,并粘贴在其上。

现在,如果您不想在执行此操作时丢失注册表,还可以将以下内容添加到您的vimrc中:

xnoremap p pgvy

2
xnoremap p pgvy 很好用。vepviwp 少按一个键,但是效果相同。 - nrz
可视模式很棒,但如果你可以像使用 dwP 一样轻松地不用它,那不是更好吗? - zumalifeguard
@nrz 没门儿,“它做的一样”是不可能的,只有当光标在单词开头时,vep才能像viwp一样工作。而viwp则可以在任何地方使用。 - poige

5

通常情况下,按照惯例复制源单词(例如使用yiw)并使用:

viw"0p

将目标单词上覆盖。

由于Visual模式下的p命令(参见:help v_p)不会更改包含最近一次复制命令文本的编号为0的寄存器,因此同一复制的单词可以一遍又一遍地粘贴。


4

执行以下操作:

ciw<C-r>0

然后每次使用你复制的文本替换单词:

.

你可以像这样与搜索一起使用:

/foo<Cr>

.n.n.n

它有效的原因是:

ciw 替换内部单词,而

<C-r>0 使用最近复制的寄存器进行替换,.随后也使用。

遗憾的是,如果你选择了要替换的文本,则无法使用.进行替换。

请注意,如果最初使用视觉选择选中要替换的文本并执行了c<C-r>0,那么在那之后,. 将替换与视觉选择中包含的相同长度的字符。


2

您可以使用寄存器0,其中包含刚刚覆盖的“剪贴板”文本。对于您的示例,您可以拖动要粘贴的文本,将光标放在单词“bye”的某个位置,然后键入

ciw [在单词中剪切;删除光标下的单词并进入插入模式]

ctrl-r 0 [寄存器0;从寄存器0粘贴文本]

您可以使用:disp查看所有寄存器中的内容。正如Daenyth所说,您可以使用"x[删除/剪切/复制命令]将内容保存到特定寄存器中,并从命令模式下使用"xp或从插入/替换模式下使用ctrl-r x进行粘贴。


我认为你误解了问题。没有提到“bye”这个词,只是vim正常命令“bye”,相当于“yiw”。 - Benoit
@Benoit 我现在把 bye 视为一个命令。无论如何,我的回答回答了正确的问题,并且是正确和适当的信息。要覆盖的单词是无关紧要的。 - Kevin

2
当您删除一个单词时,它会被放入默认粘贴寄存器"中,因此当您删除要替换的单词时,它将在"寄存器中占据前一个单词的位置。然而,前一个单词将在寄存器0中,之前的单词在1中等等 - 您随时可以通过运行:reg查看这一点,并查看寄存器的内容。因此,要替换一个单词,您可以首先复制第一个单词(yiw),然后“更改”您想要替换的单词(ciw),然后通过按下ctrl-r0从寄存器0插入。 (您也可以先删除单词(diw),然后从寄存器0粘贴:"0p)。

1

简单的解决方案是反过来操作:先粘贴新单词,再删除旧的。


2
但我希望能够多次粘贴它。 - codecompleting

0

你可以通过在寄存器名称前加上 "a(其中 a 是寄存器的名称)来将内容复制到寄存器中。请参见如何使用vim寄存器

b"aye


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