多次粘贴

116

如何使用剪贴板替换多行内容是最好的方法?

我遇到的问题是当我复制一行并将其粘贴到另一行上时,“复制”会被我刚刚替换的行所替代。现在,如果我想用相同的行替换另一行,我必须返回上一页并再次复制该行。

肯定有更好的方法来解决这个问题。

8个回答

135

我在我的.vimrc文件中有这段代码:

xnoremap p pgvy

(注:这仅适用于默认寄存器,但这个映射很容易记住)。编写更详细版本是可能的。此外,您仍然可以使用P来获得旧的行为。


39
聪明。按下 'p' 粘贴,按下 'gv' 重新选择最初选定的内容。按下 'y' 再次复制它。 - Amjith
@SibbsGambling,可能使用的是 Vim 7 之前的版本?那么要么升级 Vim,要么使用 v 而不是 x(vnoremap)。Vim 帮助文件 version7.txt 指出 xmap 和 smap 出现在该版本中。 - Benoit
1
@Benoit 嗯,我有7.4.52版本,但是xnoremapvnoremap都不起作用。 - Sibbs Gambling
14
为什么这不是默认行为? - Seth
请注意,这种重新映射有一个问题:如果您用较长的文本替换较短的文本,则第二次粘贴时,它将存储较短的文本。https://i.imgur.com/Nehm7fL.mp4 - Sbu

32

"0 应该包含您复制的内容。虽然打字有点繁琐,但 "0p 将实现您想要的效果。

或者,不必事先选择和替换旧行。如果您使用搜索找到这些行,只需在初始的 p 后一遍又一遍地按 n.,然后当它们都被粘贴后,执行 ndd,接着再按多次 n. 直到需要为止。

我在切换到 Vim 时需要做的最大心理转变是如何按顺序进行组编辑。也就是说,不是在一行上进行一堆编辑,然后在另一行上进行相同的一堆编辑,而是在一堆行上做第一个编辑(利用 . 起到很大作用),然后在一堆行上做第二个编辑,以此类推。或者,使用宏可能会有所帮助,因为它们非常棒,但有时会更费力一些,特别是在 "复杂" 变更方面。


2
听起来像是一个正则表达式与确认 :%s/.../.../gc 类型命令更接近你想要的。 - Milimetric
@Milimetric +1 不知道你可以那样确认。 - user2065875
1
点赞,因为宏可以使这成为一个非问题。只需进行一次编辑,然后您就可以执行类似于 5@m(对于名为 m 的宏)的操作。 - skatenerd
感谢您的详细解释。现在我在我的~/.vimrc中使用xnoremap p "0p - nexayq

15

我经常使用另一个注册表,将需要的行复制到名为"ay的注册表中,然后从那里粘贴到"ap中。


14

在Vim中,如果你用黏贴功能覆盖一个选定区域,它会将默认的寄存器替换为所选内容。如果黏贴功能覆盖选择区域时擦除了剪贴板的内容,则很可能是因为您在 .vimrc 文件中加入了以下代码:

set clipboard=unnamed

一种选项是将其删除并使用显式剪贴板寄存器"+

另一个选择是使用任何其他明确命名的寄存器(a-z)。在第一次粘贴后,将该行重新插入到例如"c中,并从那里使用"cp进行粘贴。


1
实际上默认值(在Ubuntu上)是clipboard=autoselect;不过,迄今为止最优雅的答案还是谢谢。 - Tobu

10

使用文本对象命令,如ciw来更改单词内部,而非使用复制/粘贴。该方法的优点是可以使用.重复命令轻松地重复。

  1. yiw 复制光标下的单词(假设为“first”)。
  2. 将光标移动到另一个单词(假设为“second”)。
  3. ciw<C-r>0 更改“second”,将其替换为“first”(其中Ctrl-R 为Ctrl键和R键)。
  4. 将光标移动到另一个单词(假设为“third”)。
  5. . 更改“third”,将其替换为“first”。

1
在我的情况下,ciw<C-r>0 无效。 ciw 切换到插入模式,此时 <C-r> 变得无用。 是否有简单的解释?这可能与文本编辑器有关(我没有使用纯VIM,而是在RStudio中使用VIM键绑定)。 - Bushroot
@Bushroot <C-r> 旨在用于插入模式,因为这是您在不离开插入模式的情况下从寄存器粘贴的方式 - 在 Vim 中是如此; 我不熟悉 RStudio,但我猜您是正确的,他们尚未实现此特定的键绑定。 - insectean
@Sean H:是的。他们没有实现关键绑定。在VIM中,它正常运作,甚至在其他程序(比如Visual Studio Code)中使用VIM绑定也可以。 - Bushroot

8

使用np,其中n是您想要粘贴行数的数量,例如3p将会粘贴3行。


12
无法在非连续的行上粘贴相同的行。 - Tobu
@Tobu 但它确实回答了这个问题的标题“如何多次粘贴”。 - icc97

1
2023年,你可以使用P代替p,这样你就可以继续粘贴“yanked”选择内容。

1
添加以下键位映射,按Ctrlp粘贴。
" Paste Register 0  
map <C-p> "0p

简单而有效。 - undefined

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