如何用 vim 粘贴新行?

我经常需要在 vim 中粘贴一些东西,我通常做的是:

o<Esc>p

这将插入一个新行,并将我置于插入模式,而不是退出插入模式,最后粘贴。

敲三下键盘,效率不高,有更好的主意吗?

73125 次浏览

: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 p :pu<CR>

如果要复制一整行然后粘贴一整行,那么首先使用 Y来拖拽该行或该行,包括换行符,然后使用 p来粘贴。您还可以使用 V,这是可视化的 台词模式,相比之下,普通的 v为可视化模式。

选择:

1)使用 yy拉整行(包括行尾字符)。然后,p将粘贴到一个新的行后,当前的一个和 P(换挡-P)将粘贴到上面的当前行。

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

:nmap ,p o<ESC>p
:nmap <F4> o<ESC>p

3)映射的函数版本(实际上不必要,但只是为了完整性) :

:nmap <F4> :call append(line('.'), @")<CR>


" This one may be a little better (strip the ending new-line before pasting)
:nmap <F4> :call append(line('.'), substitute(@", '\n$', '', ''))<CR>


:help let-register
:help :call
:help append()
:help line()
:help nmap

可以使用后跟要粘贴的缓冲区名称的 <C-R>在插入模式下粘贴缓冲区。默认的缓冲区是 ",因此可以这样做

o<C-R>"

我发现我经常使用 <C-R>"并将它绑定到我的 vimrc 中的 <C-F>:

inoremap <C-F> <C-R>"

我个人是这样绘制 输入(CR)的:

nmap <CR> o<Esc>k

基于 这个 Vim Wikia 的文章。

这样我就可以在普通模式下直接制作换行符,然后把它和粘贴到下面的换行符结合起来:

<CR>jp

您也可以在上面的 nmap 中跳过 K,这取决于您更喜欢 进来的哪些功能,因此它就是 <CR>p

我还将 jj 映射到 埃斯克,这对本例也有帮助。埃斯克在 Vim 中的重要性远远超出了主行的范围。

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

我有映射 inoremap jj <ESC>。所以很容易插入新的线与 ojjOjj,然后 p

所以 ojjp粘贴新的换行。它有一个更多的行程然后 o<esc>p但是 ojjp对我来说很容易。

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

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

o<Alt-p>

由于您在按 o 后处于插入模式,Alt 修饰符将允许您使用命令,就像您没有一样。

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

set clipboard+=unnamed

比你能做 o<Ctl-v>

除了笔画更少之外,这对 o<Esc>p:pu都有改进,因为它保留了缩进: 其他两个选项都是从新行的字符0开始。

需要注意的是,这可能与操作系统有关,也可能与操作系统无关。我所知道的是,它工作在最近的 OS X 版本,但剪贴板只是众多方式之一,以获得在操作系统剪贴板扬。

如果还希望以插入模式结束,则可以使用 CTRL-R "在插入模式下粘贴。https://stackoverflow.com/a/2861909/461834

仍然有三次击键,但没有转义,如果您想以 insert 结束,还可以保存一次击键。

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

nnoremap <leader>p m`o<ESC>p``
nnoremap <leader>P m`O<ESC>p``

一个小小的解释:

  • 在当前光标位置设置一个标记。
  • o<Esc>p: 在下面创建一个新行并粘贴该行中的文本
  • O<Esc>P: 在上面新建一行并粘贴该行中的文本
  • 把光标放在原来的位置

有关 Vim 中标记的更多信息,请参见 :h mark

使用这个插件: https://github.com/tpope/vim-unimpaired

在线上粘贴 ]p

在线上粘贴 [p

优点:

  • 对所有拉出的文本(单词、行、字符等)起作用
  • 缩进粘贴的文本以匹配文本的缩进 在它周围
  • 2次击键而不是3次,而且更“简单”的击键
  • 很快

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

  • o-插入模式并转到新行
  • 运行单个命令 就像正常模式一样
  • p-粘贴

这是三个键击,但你留在插入模式,而且 o ctrl+o是相当快的,所以我个人对待它作为2.5键击。

如果希望粘贴 new line并保持缩进,请创建以下映射:

nnoremap <leader>p oq<BS><Esc>p

先决条件: 你有领导者映射,你有 set autoindent在你的 .vimrc

说明: 使用‘ o’创建一个新行,输入‘ q’,然后后退(保持缩进) ,并且‘ esc’将您带回到最终粘贴的正常模式。