【发布时间】:2012-03-12 03:02:04
【问题描述】:
命令p 粘贴在光标下方,P 命令粘贴在光标上方。粘贴到光标所在行的命令是什么?
【问题讨论】:
标签: vim keyboard-shortcuts copy-paste
命令p 粘贴在光标下方,P 命令粘贴在光标上方。粘贴到光标所在行的命令是什么?
【问题讨论】:
标签: vim keyboard-shortcuts copy-paste
这完全取决于您要粘贴的寄存器中的数据类型。如果数据是面向行的数据(例如用 yy 抽出),它将作为整行粘贴在光标上方或下方。如果数据是面向字符的(用例如 y2w 抽出),那么它将被粘贴到当前光标位置或之前行。
请参阅:help linewise-register,了解有关寄存器类型和 put 命令之间交互的更多信息。
【讨论】:
0y$ 而不是逐行的yy。 p 或 P 将粘贴到当前行或不同行,具体取决于 yank 是按字符(粘贴到当前行)还是按行(粘贴到上面或下面的行)。
p/P,您可能需要查看 Ingo Karkat 的 UnconditionalPaste。 vim.org/scripts/script.php?script_id=3355
gvim 中的 编辑 菜单列出了以下内容:
粘贴 = "+gP
放在前面 = [p
放在后面 = ]p
如果您在 Windows 中运行 vim,您可以执行以下操作来获取 Ctrl+C 和 Ctrl+V 按预期工作:
source $VIMRUNTIME/mswin.vim
behave mswin
【讨论】:
如果您想保持当前行不变,您可以粘贴到该行的上方或下方。
如果要覆盖当前行,则必须先将其删除,这意味着下一行将代替它,然后粘贴到新的当前行上方。
有不止一种方法可以做到:
"_ddP
"_dd删除“黑洞寄存器”中的整行当前行,以下行现在是当前行。
P将未命名寄存器的内容放在当前行的上方。
Vp
V 将您置于 VISUAL LINE 模式并直观地选择整个当前行
p用未命名寄存器的内容替换选择
S<C-r>"
S 删除当前行的内容并将您置于INSERT模式
<C-r>"放未命名寄存器的内容
最后两个选项有一个有趣的副作用:上一行的内容被放入未命名的寄存器中,这使得无法多次粘贴相同的内容。
幸运的是,您可以解决这种情况:
第一个解决方案中提到的“黑洞寄存器”有效,嗯……就像一个黑洞。无论您放入其中的任何内容都会永远消失,因此您可以继续使用p 和P,并确信未命名的寄存器在每次粘贴时仍然相同。
Vim 让您可以访问 26 个字母寄存器,您可以使用它们来保存宏或……重复粘贴内容。
以第二种解决方案为起点,首先将整行拉入寄存器"a 和"ayy,然后在另一行上执行V"ap。
但以上所有内容都假设您要粘贴的文本是实际行。 Vim 区分了 "line-wise" 和 "character-wise" :它不会让你在字符上下文中粘贴一行。
用yy 拉出整行保持其行或字符明智,您将无法在同一行的两个字符之间p。为此,您需要确保您拉出的内容不会被 Vim 解释为逐行。例如,假设您在第一行的第一个字符上并且想要拉出ipsum dolor 并将其放在lorem 和sit 之间的正常位置:
ipsum dolor
lorem sit amet
您应该输入 "ayee 以将您提取的文本放入寄存器 "a,将光标放在需要的位置并输入 "aP。
【讨论】:
"* 不是未命名的寄存器。 "" 是未命名的寄存器。见:h quotequote。我想您已将'clipboard' 更改为包含unnamed。
要在插入模式下粘贴,您只需按 Control+R。然后输入寄存器,例如Shift++.
要在命令模式下粘贴,请按 P,但是您必须确保您的行没有换行符(例如被0v$hy 拉出),否则它会出现在光标上方。
视觉模式也是如此,请参阅:How to paste a line in a vertical selection block? at Vim SE
【讨论】:
Shift + v 将选择整行,但您不想这样做。相反,从将按字符选择的行的开头按 CTRL + v,然后按 $ 选择到行尾。拉出 y 并粘贴 p。
【讨论】:
您可以使用 D 从当前光标位置删除到行尾,并使用 p 删除新光标位置。
即用^D和p剪切粘贴整行
【讨论】:
我经常需要将寄存器内容“转换”为某种(按字符/按行/按块)模式,为此我写了UnconditionalPaste plugin。它提供了gcp、glp 等替代内置粘贴命令的替代方案,这些命令强制执行某种模式(现在这个主题还有更多变体,比如用逗号或查询字符连接的粘贴)。
有了它,您可以使用gcp / gcP 在光标位置之后/之前粘贴,无论您如何拉动文本。
【讨论】:
在要插入的任何地方将行分成 2 行
粘贴它们之间的部分
按照此处所述将 3 行与 j 合并 (Delete newline in Vim)
好用,但是很乏味,还得想,查一下 => vi 和 emacs 都是垃圾软件
【讨论】:
(我知道这个帖子很旧,就留下这个,希望这可以帮助某人)
受@wbg 上面关于删除换行的评论的启发,我将这些添加到我的映射中:
nnoremap <leader>p :let @"=substitute(@", '\n\+$', '', '')<CR>p
inoremap <leader>p <esc>:let @"=substitute(@", '\n\+$', '', '')<CR>pa
当我有一个包含一些 SQL 的文件(逐行)并且我必须拉入代码时,这很有用。
【讨论】:
我不确定有没有。我试图查找文档,并遇到了以下三个文档:
不幸的是,这三个都只有您列出的两个命令。特别是,第三个链接指出The commands to paste are p and P...
【讨论】: