Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim 如何粘贴光标所在的行?_Vim_Keyboard Shortcuts_Copy Paste - Fatal编程技术网

Vim 如何粘贴光标所在的行?

Vim 如何粘贴光标所在的行?,vim,keyboard-shortcuts,copy-paste,Vim,Keyboard Shortcuts,Copy Paste,命令p粘贴在光标下方,p粘贴在光标上方。在光标所在的行中粘贴什么命令?我不确定是否有。我试图查找文档,并浏览了以下三个文档: 不幸的是,这三个命令都只有您列出的两个命令。特别是,第三个链接指出,要粘贴的命令是p和p。gvim中的编辑菜单列出了以下内容: 粘贴=“+gP” 放在前面=[p 放在…后面 如果在Windows中运行vim,可以执行以下操作以使Ctrl+C和Ctrl+V按预期工作: source $VIMRUNTIME/mswin.vim behave mswin 这完全

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

我不确定是否有。我试图查找文档,并浏览了以下三个文档:


不幸的是,这三个命令都只有您列出的两个命令。特别是,第三个链接指出,
要粘贴的命令是p和p。

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

  • 粘贴=“+gP”

  • 放在前面=[p

  • 放在…后面

如果在Windows中运行vim,可以执行以下操作以使Ctrl+C和Ctrl+V按预期工作:

source $VIMRUNTIME/mswin.vim
behave mswin

这完全取决于要粘贴的寄存器中的数据类型。如果数据是面向行的数据(例如,用yy拖动),则将其粘贴为光标上方或下方的整行。如果数据是面向字符的(例如,用y2w拖动),则将其粘贴在当前行的光标位置或之前


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

如果要保持当前行的原样,可以将其粘贴到行的上方或下方

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

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

  • “\u ddP

  • “\u dd
    删除“黑洞寄存器”中的整个当前行,下面的行现在是当前行

  • p
    将未命名寄存器的内容置于当前行上方

  • Vp

  • V
    将您置于可视行模式,并以可视方式选择整个当前行

  • p
    用未命名寄存器的内容替换所选内容

  • S“

  • S
    删除当前行的内容并将您置于插入模式

  • 放入未命名寄存器的内容

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

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

  • 在第一个解决方案中提到的“黑洞寄存器”起作用,嗯……就像黑洞一样。你放入其中的任何东西都会永远消失,因此你可以继续使用
    p
    p
    ,并有一定程度的信心,即未命名的寄存器在粘贴到粘贴时仍然是相同的

  • Vim允许您访问26个字母寄存器,您可以使用这些寄存器保存宏或…重复粘贴内容

    以第二个解决方案为起点,首先使用
    “ayy
    将整行拉入寄存器
    “a
    ,然后在另一行执行
    V”ap

但以上所有操作都假定要粘贴的文本是实际的行。Vim区分了“行方式”和“字符方式”:它不允许您在字符方式的上下文中粘贴行或以其他方式粘贴行

yy
拖动一整行将保持其行明智性或字符明智性,您将无法在同一行的两个字符之间执行
p
。为此,您需要确保您所拉的不会被Vim解释为行方式。例如,假设您在第一行的第一个字符上,想要将
ipsum dolor
猛拉,并将其放在
lorem
sit
之间的正常位置:

ipsum dolor
lorem  sit amet

您应该键入
“是”
,将被拖动的文本放入寄存器
“a
,将光标放在需要的位置,然后键入
“aP
”,您可以使用D从当前光标位置删除到行尾,使用p删除到新光标位置

也就是说,使用^D和p剪切和粘贴整行。我经常需要将寄存器内容“强制转换”到特定(字符/行/块)模式,为此我编写了。它提供了
gcp
glp
,等等,以替代强制使用特定模式的内置粘贴命令(到目前为止,这个主题还有更多的变体,比如用逗号或查询字符连接的粘贴)


有了它,您只需使用
gcp
/
gcp
在光标位置之后/之前粘贴,而不管您如何拖动文本。

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

要在命令模式下粘贴,请按p键,但必须确保行中没有新行字符(例如,被
0v$hy
拖动),否则它将显示在光标上方

视觉模式也一样,请参见:在Vim SE上(我知道这个线程很旧,只留下这个,希望它可以帮助其他人)

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

nnoremap p:let@“=替换(@“,“\n\+$,”,“,”)p

inoremap:let@“=替换(@“,'\n\+$,'','')pa

当我有一个包含一些SQL(逐行)的文件,并且必须快速插入代码时,这非常有用

  • 在要插入的任何位置将线分成2

  • 在它们之间粘贴部分

  • 按此处所述将3行与j合并()

  • 作品,但枯燥乏味,不得不去思考,去查阅 =>vi和emacs是垃圾软件

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