如何使用vim粘贴新行?

如何使用vim粘贴新行?,vim,editor,Vim,Editor,我经常不得不在vim的新行上粘贴一些东西。我通常做的是: o<Esc>p op 插入新行并将我置于插入模式,然后退出插入模式,最后粘贴 三次按键。效率不高。有更好的主意吗?在之后不久:help p它说: :[line]pu[t] [x] Put the text [from register x] after [line] (default current line). This always works |linewise|, t

我经常不得不在vim的新行上粘贴一些东西。我通常做的是:

o<Esc>p
op
插入新行并将我置于插入模式,然后退出插入模式,最后粘贴


三次按键。效率不高。有更好的主意吗?

之后不久:help p
它说:

:[line]pu[t] [x]    Put the text [from register x] after [line] (default
                    current line).  This always works |linewise|, thus
                    this command can be used to put a yanked block as
                    new lines.

:[line]pu[t]! [x]   Put the text [from register x] before [line]
                    (default current line).
不幸的是,它并不比您当前的解决方案短,除非您按照另一个答案中的建议将它与一些键盘映射相结合。例如,您可以将其映射到任何键(甚至
p
):

:nmap:pu

如果要复制整行,然后粘贴整行,请首先使用
Y
拖动一行或多行,包括换行,然后使用
p
粘贴。您还可以使用可视线模式
V
,而普通
V
用于可视模式。

选项:

1) 使用
yy
拖动整行(包括行尾字符)
p
然后将该行粘贴到当前行之后的新行上,
p
(Shift-p)将粘贴到当前行上方

2) 做一个映射:然后它只有一个或两个键:

:nmap ,p o<ESC>p
:nmap <F4> o<ESC>p
:nmap,p op
:nmap op
3) 映射的函数版本(实际上不需要,但只是为了完整性):

:nmap:callappend(行('.'),@”)
“这一行可能会好一点(粘贴前去掉结尾的新行)
:nmap:callappend(行('.')、替换(@“、'\n$”、''))
:帮助注册
:帮助:打电话
:help append()
:帮助热线()
:帮助nmap

您可以在插入模式下粘贴缓冲区,方法是使用
后跟要粘贴的缓冲区的名称。默认缓冲区是
,您可以这样做

o<C-R>"
o”
我发现我经常使用
,并将其绑定到我的vimrc中的

inoremap <C-F> <C-R>"
inoremap”
就我个人而言,我将Enter(CR)映射如下:

nmap <CR> o<Esc>k
nmap正常
…基于Vim Wiki的一篇文章

通过这种方式,我可以直接从正常模式生成换行符,并将其与希望粘贴到下面的换行符相结合,我会这样做:

<CR>jp
jp
您也可以在上面的nmap中跳过k,这取决于您喜欢从Enter中选择什么功能,因此它将只是
p

我还将jj映射到了Esc,这在这种情况下也会有所帮助。就其在vim中的重要性而言,Esc离主行太远了


不比其他解决方案短,但我确实认为它比其中一些解决方案感觉不那么笨重,而且它还有其他用途。

我有mapping
inoremap jj
。因此很容易插入带有
ojj
ojj
的新行,然后插入
p


因此,
ojjp
粘贴新行。它比
op
多了一个笔划,但是
ojjp
对我来说很容易。

这个解决方案似乎只适用于复制的文本块从新行开始的情况(而不是在一行中的某个地方抓取文本片段),但您始终可以从要抓取的最后一个字符开始复制,然后导航到所需复制块开始之前的行尾的最后一个字符。然后,当您要粘贴它时,将光标放在要粘贴文本的行尾并点击p。如果我没有搞砸解释,这将提供您想要的效果。

这仍然使用三次击键,但我发现它比Esc更容易:

o


由于您在点击o后处于插入模式,Alt修饰符将允许您像不使用命令一样使用命令。

我找到了一个很好的解决方案。如果您将yank寄存器放在操作系统的剪贴板中(无论如何都很好),使用

比你能做的还要多

除了减少笔划之外,这在
op
:pu
上都有所改进,因为它保留了缩进:其他两个选项都从新行的字符零开始


需要注意的是,这可能与操作系统有关,也可能与操作系统无关。我所知道的是,它可以在最新版本的OS X上工作,但剪贴板只是在操作系统剪贴板中拖动的众多方法之一。

如果您还想在插入模式下结束,可以在插入模式下使用
CTRL-R”
进行粘贴


仍然有三次击键,但没有转义,如果仍要以insert结束,则保存一次击键。

我在Neovim配置中使用以下映射:

nnoremap <leader>p m`o<ESC>p``
nnoremap <leader>P m`O<ESC>p``
nnoremap p m`op``
nnoremap P m`Op``
一点解释:

  • m`
    :在当前光标位置设置一个标记
  • op
    :在下面新建一行,并将文本粘贴到此行中
  • OP
    :在上面新建一行,并将文本粘贴到此行中
  • `
    :将光标放在原始位置
有关Vim中标记的更多信息,请参见
:h mark

使用此插件:

]p
粘贴在下面的行上

[p
粘贴在上面的行上

优点:

  • 适用于所有拉伸文本(字、行、字符等)
  • 缩进粘贴的文本以匹配文本的缩进 围绕着它
  • 2次击键而不是3次,而且“更容易”的击键
  • 快速

如果要保持插入模式,可以执行
o ctrl+o p

  • o
    –插入模式并转到新行
  • ctrl+o
    –运行单个命令 像在正常模式下一样
  • p
    –粘贴

这是三次击键,但您仍处于插入模式,而且
o ctrl+o
相当快,因此我个人将其视为2.5次击键。

如果您希望粘贴到
新行中,并且仍然保持缩进,请创建此映射:

nnoremap p oqp

先决条件:您已经映射了引线,并且在
.vimrc
中设置了自动缩进

说明:a
<CR>jp
set clipboard+=unnamed
nnoremap <leader>p m`o<ESC>p``
nnoremap <leader>P m`O<ESC>p``