【问题标题】:How to paste in the line where the cursor is?如何粘贴到光标所在的行?
【发布时间】:2012-03-12 03:02:04
【问题描述】:

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

【问题讨论】:

标签: vim keyboard-shortcuts copy-paste


【解决方案1】:

这完全取决于您要粘贴的寄存器中的数据类型。如果数据是面向行的数据(例如用 yy 抽出),它将作为整行粘贴在光标上方或下方。如果数据是面向字符的(用例如 y2w 抽出),那么它将被粘贴到当前光标位置或之前行。

请参阅:help linewise-register,了解有关寄存器类型和 put 命令之间交互的更多信息。

【讨论】:

  • 复制一个单词就可以了。但我说的只是线路。这意味着不能在 Vim 中将一行复制并粘贴到另一行的末尾。不是吗?
  • @Kitcha -- 阅读有关逐行和逐字符复制的更多信息。如果您以字符方式拉动它,您可以按照您想要的方式复制一行,例如,0y$ 而不是逐行的yypP 将粘贴到当前行或不同行,具体取决于 yank 是按字符(粘贴到当前行)还是按行(粘贴到上面或下面的行)。
  • 如果您发现自己通常想要“投射”p/P,您可能需要查看 Ingo Karkat 的 UnconditionalPaste。 vim.org/scripts/script.php?script_id=3355
  • 我经常想复制一行(dd 或 yy)并将其视为面向字符的。也许删除“\ n”会起作用......不知道在缓冲区中时如何做到这一点。也许脚本会有所帮助。
【解决方案2】:

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

  • 粘贴 = "+gP

  • 放在前面 = [p

  • 放在后面 = ]p

如果您在 Windows 中运行 vim,您可以执行以下操作来获取 Ctrl+CCtrl+V 按预期工作:

source $VIMRUNTIME/mswin.vim
behave mswin

【讨论】:

    【解决方案3】:

    如果您想保持当前行不变,您可以粘贴到该行的上方或下方。

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

    有不止一种方法可以做到:

    • "_ddP

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

      2. P将未命名寄存器的内容放在当前行的上方。

    • Vp

      1. V 将您置于 VISUAL LINE 模式并直观地选择整个当前行

      2. p用未命名寄存器的内容替换选择

    • S<C-r>"

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

      2. <C-r>"放未命名寄存器的内容

    最后两个选项有一个有趣的副作用:上一行的内容被放入未命名的寄存器中,这使得无法多次粘贴相同的内容。

    幸运的是,您可以解决这种情况:

    • 第一个解决方案中提到的“黑洞寄存器”有效,嗯……就像一个黑洞。无论您放入其中的任何内容都会永远消失,因此您可以继续使用pP,并确信未命名的寄存器在每次粘贴时仍然相同。

    • Vim 让您可以访问 26 个字母寄存器,您可以使用它们来保存宏或……重复粘贴内容。

      以第二种解决方案为起点,首先将整行拉入寄存器"a"ayy,然后在另一行上执行V"ap

    但以上所有内容都假设您要粘贴的文本是实际行。 Vim 区分了 "line-wise" 和 "character-wise" :它不会让你在字符上下文中粘贴一行。

    yy 拉出整行保持其行或字符明智,您将无法在同一行的两个字符之间p。为此,您需要确保您拉出的内容不会被 Vim 解释为逐行。例如,假设您在第一行的第一个字符上并且想要拉出ipsum dolor 并将其放在loremsit 之间的正常位置:

    ipsum dolor
    lorem  sit amet
    

    您应该输入 "ayee 以将您提取的文本放入寄存器 "a,将光标放在需要的位置并输入 "aP

    【讨论】:

    • "* 不是未命名的寄存器。 "" 是未命名的寄存器。见:h quotequote。我想您已将'clipboard' 更改为包含unnamed
    【解决方案4】:

    要在插入模式下粘贴,您只需按 Control+R。然后输入寄存器,例如Shift++.

    要在命令模式下粘贴,请按 P,但是您必须确保您的行没有换行符(例如被0v$hy 拉出),否则它会出现在光标上方。

    视觉模式也是如此,请参阅:How to paste a line in a vertical selection block? at Vim SE

    【讨论】:

      【解决方案5】:

      Shift + v 将选择整行,但您不想这样做。相反,从将按字符选择的行的开头按 CTRL + v,然后按 $ 选择到行尾。拉出 y 并粘贴 p

      【讨论】:

        【解决方案6】:

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

        即用^D和p剪切粘贴整行

        【讨论】:

          【解决方案7】:

          我经常需要将寄存器内容“转换”为某种(按字符/按行/按块)模式,为此我写了UnconditionalPaste plugin。它提供了gcpglp 等替代内置粘贴命令的替代方案,这些命令强制执行某种模式(现在这个主题还有更多变体,比如用逗号或查询字符连接的粘贴)。

          有了它,您可以使用gcp / gcP 在光标位置之后/之前粘贴,无论您如何拉动文本。

          【讨论】:

            【解决方案8】:
            1. 在要插入的任何地方将行分成 2 行

            2. 粘贴它们之间的部分

            3. 按照此处所述将 3 行与 j 合并 (Delete newline in Vim)

            好用,但是很乏味,还得想,查一下 => vi 和 emacs 都是垃圾软件

            【讨论】:

              【解决方案9】:

              (我知道这个帖子很旧,就留下这个,希望这可以帮助某人)

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

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

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

              当我有一个包含一些 SQL 的文件(逐行)并且我必须拉入代码时,这很有用。

              【讨论】:

                【解决方案10】:

                我不确定有没有。我试图查找文档,并遇到了以下三个文档:

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

                【讨论】:

                • 你是对的。我还以为有什么我不知道的。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多