如何粘贴光标所在的行?

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

这完全取决于您正在粘贴的registry中的数据types。 如果数据是面向行的数据(例如y yed),它将作为整行粘贴在光标上方或下方。 如果数据是面向字符的(例如用y 2 w抽出),那么它将被粘贴在当前行的光标位置或之前。

有关:help linewise-registertypes和put命令之间的相互作用的更多信息,请参阅:help linewise-register

gvim中的编辑菜单列出了以下内容:

  • Paste = + g P

  • 放在前面[ p

  • Put After = ] p

如果您在Windows中运行vim,可以按照以下步骤操作,使Ctrl + CCtrl + V按预期工作:

 source $VIMRUNTIME/mswin.vim behave mswin 

如果要保留当前行,请将其粘贴在行的上方或下方。

如果要覆盖当前行,则必须先将其删除,这意味着下面的行代替它, 然后粘贴到新的当前行上方。

有多种方法可以做到这一点:

  • "_ddP

    1. "_dd删除”黑洞寄存器“中的整个当前行,下面的行现在是当前行。

    2. P将无名寄存器的内容放在当前行之上。

  • Vp

    1. V将您置于VISUAL LINE模式,并可以直观地select整个当前行

    2. p用未命名的寄存器的内容replaceselect

  • S<Cr>"

    1. S删除当前行的内容并将其置于INSERT模式

    2. <Cr>"放入未命名的寄存器的内容

最后两个选项有一个有趣的副作用:前一行的内容被放入未命名的寄存器,这使得不可能做多个具有相同内容的粘贴。

幸运的是,你可以解决这个问题:

  • 第一个解决scheme中提到的“黑洞寄存器”工作得很好,就像一个黑洞。 不pipe你input什么,它永远消失,所以你可以继续使用pP ,并且有一定程度的自信,从粘贴到粘贴,无名寄存器仍然是一样的。

  • Vim让你可以访问26个字母寄存器,你可以用它来保存macros或者重复粘贴东西。

    以第二种解决scheme为出发点,你首先把整行写入registry"a "ayy然后在另一行上做V"ap

但是,所有上述假定您要粘贴的文本是一个实际的行。 Vim在“行式”和“字符式”之间做出了区别:它不会让你在一个字符的上下文或其他方式中粘贴一行。

yy整个行保持其行或明智的性格,并且你将不能在同一行上的两个字符之间。 为此,您需要确保您所抽取的内容不会被Vim逐行解释。 例如,我们假设你在第一行的第一个字符,并且希望把它放在loremsit之间的正常位置:

 ipsum dolor lorem sit amet 

你应该input"ayee把你的被"ayee文本注册"a ,把光标放在需要的位置并input"aP

您可以使用D从当前光标位置删除到行尾,并将p删除到新的光标位置。

这是剪切和粘贴一整行使用^ D和P。

我需要经常“注入”寄存器内容到一个特定的(字符/行/块)模式,我为它写了UnconditionalPaste插件 。 它提供gcpglp等替代内置的粘贴命令,强制某种模式(现在在这个主题上有更多的变体,比如粘贴逗号或查询字符)。

有了它,你可以使用gcp / gcP在光标位置之前/之后粘贴,而不pipe你如何gcP文本。

我不确定是否有一个。 我试图find文档,并运行以下三个文件:

  • Vim命令备忘单
  • Vim编辑器命令
  • 掌握VI编辑器

不幸的是,所有三个只有你列出的两个命令。 特别是,第三个链接指出, The commands to paste are p and P...

要以插入模式粘贴,只需按Control +

要在命令模式下粘贴,你按下P ,但是你必须确保你的线没有新的线条字符(例如被0v$hy抽出),否则它会出现在光标上方。

对于可视模式,请参阅: 如何在垂直select块中粘贴一行? 在Vim SE

(我知道这个线程是旧的,只是离开这个,希望这可能有助于某人)

受到上面关于删除换行符的@ wbg的评论的启发,我将这些添加到了我的映射中:

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

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

当我有一个SQL的文件(一行一行),这是非常有用的,我不得不抽入代码。