在不移动光标的情况下粘贴到 Vim

32

经常需要将某些内容粘贴到相邻的多行中,位置相同或相似。每次移动到下一行时,都必须将光标移回要粘贴的内容开头,这很麻烦。如何在无需移动光标的情况下进行黏贴(例如命令“p”)?或者,如何快速将光标返回到粘贴之前的位置?

5个回答

31

保证不破坏寄存器最安全的方法是执行以下操作:

p`[

如果您想创建快捷方式,只需使用适合您的任何vim映射函数,例如:

noremap p p`[

1
请注意,当您重复使用“.”时,映射将被忽略。这是vim的一个bug吗?还是有一种方法可以遵守映射?当使用P而不是p时,这特别有用,因为Shift-P很难重复。 - pixelbeat
@pixelbeat 我认为有一个 repeat.vim 可以使 . 更加强大/智能化。可能会对你有所帮助。 - aehlke
1
我的改进是 nnoremap p P\[j`: 这个命令可以将内容粘贴到当前光标的前面,并保持光标在原地,然后再向下移动一行。只需按下p键,您就可以对代码进行注释、在连续的行上添加前缀/后缀等操作,只要这些内容对齐即可。非常灵活。 - Steven Lu
1
有没有办法让 . 在重复之前的 P 时也遵循这个 remap?因为当前当我运行 nnoremap P P\[时,我得到了我想要的P行为,但是如果我在之后按下.而不是另一个P,它只会重新运行原始的 P`。 :( - mtraceur
在插入模式下,经过 <ctrl+o> 操作后,是否可以使得此映射对于键 p 生效?使用此映射,在插入模式的 ctrl+o p 中会额外出现 '[]' - Tun

13

在我需要重复多次一个步骤序列时,我通常会使用宏进行录制,这在Vim中非常简单。一般的方法如下:

  1. 将光标移动到要进行第一次更改的位置。
  2. 键入qx开始记录按键。
  3. 进行第一次编辑。
  4. 将光标移动到第二次编辑应该开始的位置。
  5. 再次键入q退出录制。
  6. 键入@x播放宏并进行下一次编辑。 @命令接受计数,因此您可以使用一个命令重复执行编辑任意次数。

所以在你的情况下,记录宏的完整按键序列可能是:

qxp`[jq

使用5@x来重复播放它五次,共进行6个更改。

请注意,第一个q后面的字符是用来记录宏的寄存器,可以是任何字母,不一定是x。只需小心您的宏不要将文本复制到当前正在记录的寄存器中,否则会使事情变得混乱!

宏可以任意长且复杂。它们可以包含 Ex 命令,甚至调用其他宏。


5

你可以在保持正确的键盘布局的情况下完成它(当然除了p):

pg;

g; 跳转到修改列表中列出的上一个位置

更多信息:

:help changelist
:help changes

4
你可以通过按下CTRL-o快速返回上次粘贴的位置。这通常会移动回到先前的光标位置。
我正在将来自大型文档各处的行粘贴到3个书签之一(移动行以使其落在标题下面)。我发现最快的方法是:
'ap

跟着CTRL-o操作。

-6

'k'?(如上箭头)

如果您使用 'p' 将文本粘贴到当前行下方,则光标将位于粘贴内容的第一行。在命令模式下键入 'k',将带您到粘贴内容开始的上一行。


p 粘贴在光标后面。它不必在下一行。它取决于您选择要复制的块的方式(v vs. shift-v)。-1 - user80168

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