- Published on
提示 63:从寄存器中粘贴
提示 63:从寄存器中粘贴
Normal 模式下的粘贴命令会根据插入文本的性质表现出不同的行为。根据我们要粘贴的是行模式还是字符模式的文本,采用不同的策略会有所帮助。
在 提示 60 中,我们看到可以通过按 xp
来调换两个字符的顺序,而通过按 ddp
来调换两行的顺序。我们在这两种情况下都使用了 p
命令,但结果略有不同。
p
命令将寄存器中的文本放在光标位置之后(:h p
)。作为补充,Vim 还提供了(大写的)P
命令,它会在光标位置之前插入文本。所谓的“之前”或“之后”因寄存器中的内容而异。
在 xp
的例子中,寄存器中只包含一个字符。p
命令将寄存器的内容放在光标所在字符的后面。
在 ddp
的例子中,寄存器包含的是一整行。p
命令会将寄存器中的内容放在光标所在行的下一行。
p
命令将寄存器中的文本放在当前字符之后还是当前行之后,取决于寄存器的类型。如果是行模式的复制或删除操作(例如 dd
、yy
或 dap
),则会创建一个行模式的寄存器;如果是字符模式的复制或删除操作(例如 x
、diw
或 das
),则会创建一个字符模式的寄存器。通常,使用 p
命令的结果是比较直观的(详见 :h linewise-register
)。
粘贴字符模式的文本
假设我们的默认寄存器中包含文本 "collection",我们希望将其粘贴为方法调用的第一个参数。是否使用 p
或 P
命令取决于光标所在的位置。如下所示:

与之相比:

在第一个例子中,我们会使用 p
,而在第二个例子中,我们会使用 P
。我觉得这并不直观,事实上,我经常会出错,所以 puP
和 Pup
几乎已经成为我的肌肉记忆!
我不喜欢思考字符模式的文本应该放在光标前面还是后面。因此,有时我更喜欢在插入模式下使用 <C-r>{register}
映射来粘贴字符模式的文本,而不是使用 Normal 模式下的 p
和 P
命令。使用这种技巧时,寄存器中的文本始终会插入到光标前面,就像我们在插入模式下输入的一样。
在插入模式下,我们可以通过按 <C-r>"
来插入未命名寄存器的内容,或者按 <C-r>0
来插入最近复制的寄存器内容(详见 提示 15:在插入模式下从寄存器中粘贴)。我们可以使用此技巧解决 Oops! 我覆盖了我的复制内容 中遇到的问题:

使用 ciw
命令还有一个额外的好处:可以用 .
命令将当前单词替换为 "collection"。
粘贴行模式的文本
当从行模式寄存器中粘贴时,p
和 P
命令会将文本放在当前行的下方或上方。这比字符模式的行为更直观。
值得注意的是,Vim 还提供了 gp
和 gP
命令。它们也可以将文本放在当前行的上方或下方,但它们会将光标停留在粘贴文本的末尾,而不是开始处。gP
命令在复制一系列行时尤其有用,以下是示例:

我们可以使用复制的文本作为模板,修改表格单元格的内容,使其符合我们的需求。P
和 gP
命令都可以正常工作,不同之处在于第一个命令会将光标停留在插入文本的上方,而 gP
命令会将光标停留在第二个副本上,这让我们可以方便地修改它。
讨论
p
和 P
命令非常适合粘贴多行文本。但对于短小的字符模式文本,使用 <C-r>{register}
映射可能更直观。