y.y
Published on

提示 63:从寄存器中粘贴

提示 63:从寄存器中粘贴

Normal 模式下的粘贴命令会根据插入文本的性质表现出不同的行为。根据我们要粘贴的是行模式还是字符模式的文本,采用不同的策略会有所帮助。

提示 60 中,我们看到可以通过按 xp 来调换两个字符的顺序,而通过按 ddp 来调换两行的顺序。我们在这两种情况下都使用了 p 命令,但结果略有不同。

p 命令将寄存器中的文本放在光标位置之后(:h p)。作为补充,Vim 还提供了(大写的)P 命令,它会在光标位置之前插入文本。所谓的“之前”或“之后”因寄存器中的内容而异。

xp 的例子中,寄存器中只包含一个字符。p 命令将寄存器的内容放在光标所在字符的后面。

ddp 的例子中,寄存器包含的是一整行。p 命令会将寄存器中的内容放在光标所在行的下一行。

p 命令将寄存器中的文本放在当前字符之后还是当前行之后,取决于寄存器的类型。如果是行模式的复制或删除操作(例如 ddyydap),则会创建一个行模式的寄存器;如果是字符模式的复制或删除操作(例如 xdiwdas),则会创建一个字符模式的寄存器。通常,使用 p 命令的结果是比较直观的(详见 :h linewise-register)。

粘贴字符模式的文本

假设我们的默认寄存器中包含文本 "collection",我们希望将其粘贴为方法调用的第一个参数。是否使用 pP 命令取决于光标所在的位置。如下所示:

与之相比:

在第一个例子中,我们会使用 p,而在第二个例子中,我们会使用 P。我觉得这并不直观,事实上,我经常会出错,所以 puPPup 几乎已经成为我的肌肉记忆!

我不喜欢思考字符模式的文本应该放在光标前面还是后面。因此,有时我更喜欢在插入模式下使用 <C-r>{register} 映射来粘贴字符模式的文本,而不是使用 Normal 模式下的 pP 命令。使用这种技巧时,寄存器中的文本始终会插入到光标前面,就像我们在插入模式下输入的一样。

在插入模式下,我们可以通过按 <C-r>" 来插入未命名寄存器的内容,或者按 <C-r>0 来插入最近复制的寄存器内容(详见 提示 15:在插入模式下从寄存器中粘贴)。我们可以使用此技巧解决 Oops! 我覆盖了我的复制内容 中遇到的问题:

使用 ciw 命令还有一个额外的好处:可以用 . 命令将当前单词替换为 "collection"。

粘贴行模式的文本

当从行模式寄存器中粘贴时,pP 命令会将文本放在当前行的下方或上方。这比字符模式的行为更直观。

值得注意的是,Vim 还提供了 gpgP 命令。它们也可以将文本放在当前行的上方或下方,但它们会将光标停留在粘贴文本的末尾,而不是开始处。gP 命令在复制一系列行时尤其有用,以下是示例:

我们可以使用复制的文本作为模板,修改表格单元格的内容,使其符合我们的需求。PgP 命令都可以正常工作,不同之处在于第一个命令会将光标停留在插入文本的上方,而 gP 命令会将光标停留在第二个副本上,这让我们可以方便地修改它。

讨论

pP 命令非常适合粘贴多行文本。但对于短小的字符模式文本,使用 <C-r>{register} 映射可能更直观。