如何在光标所在行粘贴文字?

64

命令p在光标下方粘贴,P在光标上方粘贴。那么在光标所在行粘贴的命令是什么?

答案:使用命令Shift+p可以在光标所在行进行粘贴。


11个回答

53
这取决于您要粘贴的寄存器中的数据类型。如果数据是以行为单位的数据(例如使用yy复制的),则会作为整行在光标上方或下方粘贴。如果数据是以字符为单位的(例如使用y2w复制的),则将在当前行中光标位置之前或之后粘贴。
请参阅:help linewise-register,了解有关寄存器类型和put命令交互的更多信息。

复制一个单词没问题。但我说的是只有一行。这意味着在Vim中不能将一行复制并粘贴到另一行的末尾。不是吗? - Kitcha
12
@Kitcha -- 阅读有关按行和按字符复制的更多信息。如果您以逐字符的方式yank一行,例如0y$,则可以按照您想要的方式复制该行。 pP将根据yank是按字符还是按行进行粘贴,而将粘贴到当前行或其他行(按字符粘贴到当前行,按行粘贴到上方或下方的行)。 - Herbert Sitz
5
如果你经常希望“粘贴”p/P,你可能会想要查看Ingo Karkat的UnconditionalPaste插件。http://www.vim.org/scripts/script.php?script_id=3355 - Peter Rincker
1
我经常想复制一行(dd或yy)并将其视为字符定向。也许删除“\n”会起作用...不确定如何在缓冲区中执行该操作。也许一个脚本会有所帮助。 - wbg
1
vp就是答案... https://dev59.com/IGox5IYBdhLWcg3wLhUA#71490653 - Timothy L.J. Stewart

24

在gvim中的编辑菜单列出以下选项:

  • 粘贴 = "+gP

  • 放置到光标前 = [p

  • 放置到光标后 = ]p

如果你在Windows上运行vim,可以执行以下操作使Ctrl+CCtrl+V按预期工作:

source $VIMRUNTIME/mswin.vim
behave mswin

11
如果你想保留当前行不变,你可以在当前行上面或下面插入;如果你想覆盖当前行,则需要先删除它,这意味着后一行将替换当前行,然后将内容粘贴到新的当前行之前。有多种方法可以实现这个功能:1.使用"_ddP"命令;2.使用"Vp"命令;3.使用"S""命令。最后两个选项有一个有趣的副作用:将前一行的内容放入未命名寄存器中,这使得无法使用相同的内容进行多次粘贴。幸运的是,可以通过使用黑洞寄存器或26个字母寄存器来解决这个问题。另外,需要注意Vim区分“按行”和“按字符”的上下文,不能在字符上下文中粘贴一整行,反之亦然。使用"yy"命令复制整行并保留其按行或按字符的性质,否则可能会无法在同一行的两个字符之间进行粘贴。
ipsum dolor
lorem  sit amet
你应该键入"ayee将你复制的文本放入寄存器"a,将光标放置在需要的位置并键入"aP

“*”不是无名寄存器。“”是无名寄存器。请参阅“:h quotequote”。我想您已经将“clipboard”更改为包括“unnamed”。 - Peter Rincker

6
在插入模式下粘贴,只需按下Control+R。然后输入寄存器,例如Shift++
在命令模式下粘贴,您需要按P,但是您必须确保您的行没有换行符(例如通过0v$hy复制),否则它将出现在光标上方。
视觉模式也是一样的,请参见:如何在垂直选择块中粘贴一行? 在Vim SE。

3
你可以使用 D 键从当前光标位置删除到行尾,然后使用 p 键将其粘贴到新的光标位置。
也就是说,要剪切和粘贴整行,请使用 ^D 和 p 键。

3

Shift + v 可以选择整行文本,但您可能不需要这样做。相反,从行首按下 CTRL + v 会逐个字符选择,然后按 $ 选择到行尾。复制 y 并粘贴 p


3

vp 就是这样,在普通模式下输入 vp


这不是对一个10岁儿童问题的回答吗,stackoverflow搞错了吗?

光标下的字符将被put替换

为了帮助处理许多其他情况,我映射了rr,以便能够快速添加空格或其他1次性字符。

noremap rr i<space><esc>r 在我的~/.vimrc


2

我经常需要将寄存器内容“转换”为特定的(逐个字符/逐行/块状)模式,因此我写了UnconditionalPaste插件。它提供了gcpglp等替代内置黏贴命令的选项,强制执行某个模式(现在还有一些更多变化,如通过逗号或查询字符连接黏贴等)。

使用它,您可以使用gcp/gcP在光标位置之后/之前粘贴,而不管您如何复制文本。


1

(我知道这个帖子很旧,只是留下这个希望能帮助到某些人)

受@wbg上面关于删除换行符的评论的启发,我添加了以下映射:

nnoremap <leader>p :let @"=substitute(@", '\n\+$', '', '')<CR>p

inoremap <leader>p <esc>:let @"=substitute(@", '\n\+$', '', '')<CR>pa

当我有一个包含一些SQL语句(逐行)的文件并且我必须将其复制到代码中时,这非常有用。


我认为这是最有效的答案。谢谢。现在已经在我的.vimrc文件中了。我在命令的末尾添加了一个空格,这样对我来说更有意义。惊讶的是,这个答案在其他地方没有出现过很多次。nnoremap <leader>p :let @"=substitute(@", '\n\+$', '', '')<cr>pa <esc> - Kes

-1
我不确定是否有一个。我试图找到文档,并遇到了以下三个文档: 不幸的是,所有三个文档都只有您列出的两个命令。特别是第三个链接指出:粘贴的命令是p和P...

你是对的。我以为有些事情我不知道。 - Kitcha

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