如何在vim中粘贴到新行?

193

我经常需要在vim中将一些内容粘贴到新行。我通常会这样做:

o<Esc>p

这个命令会插入一个新行并进入插入模式,之后退出插入模式,并最终粘贴。

需要三个按键。不是很高效。还有更好的想法吗?


12
3个按键不够高效吗? - gtd
90
如果不是为了达到最大效率,为什么要使用 Vim 呢?1 或 2 会更好 :) - static_rtti
4
如果被复制的内容以换行符结尾,这还会导致额外的换行符。 - Jonathan W.
2
@gtd 普通编辑器使用 <Enter><C-V>,两个按键。 - user4052054
3
@user4052054 不,那不是同样的事情,o/O 可以在你所在的任何位置工作,在普通的编辑器中,你必须先到达行的开头或结尾。此外,如果你要复制整行,那么整个过程只需要一个按键就可以插入一行,这在编码中是更常见的操作。 - gtd
显示剩余2条评论
14个回答

90

: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>

4
我知道这一点,并且我使用它,但这不是我要问的,因为有时你复制的内容根本没有换行符。如果有一个“粘贴到新行”的命令,它将适用于您要粘贴的任何内容,因此您无需考虑它。 - static_rtti
6
好的,:pu[t]将把文本放在当前行之后的新行中,:pu[t]!将把文本放在当前行之前的新行中。我会相应地编辑我的答案。(感谢 :help p。) - Bombe
4
并不比我现有的解决方案更好,但我认为这是对我的问题最好的答案。 - static_rtti
6
尽管敲击键盘的次数一样,但我认为这个感觉更有效率。o<Esc>p 操作起来有点笨拙,而这个不是。 - Mark Story
2
你可以将该命令映射到任何键上,包括p本身::nmap p :pu<CR> 将其放入你的 .vimrc 文件中,然后就可以使用了 :) - Capi Etheriel
你也可以使用 [p 来粘贴到上一行,使用 ]p 粘贴到下一行。有关 [p]p 的更多信息,请参阅 :h ]p - young_souvlaki

70

选项:

1)使用yy将整行复制(包括行末字符)。然后使用p将该行粘贴到当前行的下一行,PShift-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

3
好吧,我想我会创建一个映射表。我只是希望可能有一个标准解决方案 :-/感谢您的回答! - static_rtti
2
@AI:在我看来,使用',p'(','被映射为我的<Leader>)是最好的解决方案。你甚至提供了一个易于使用的函数。 :) 太棒了! - Somebody still uses you MS-DOS

38

在插入模式下,您可以使用<C-R>然后输入要粘贴的缓冲区名称来粘贴缓冲区。默认缓冲区为",因此您可以执行以下操作:

o<C-R>"

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

我发现我经常使用 <C-R>",并在我的 vimrc 文件中将其绑定到 <C-F>

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

4
这很好,因为如果复制的那一行没有缩进,它可以保持正确的缩进。 - CornSmith

36

这种方法仍需要三个按键,但我发现它比按Esc更容易:

o<Alt-p>

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


2
当您尝试使用“d $”在新行中剪切行内内容时,这是非常方便的方法。 - Serhat Cevikel
抱歉,但这不会保留缩进,它会粘贴在行的开头。 - Michael Goldshteyn
1
有人可以详细说明一下在Mac上(没有Alt键)使用这个方法吗? - Li haonan
@Lihaonan,你的问题是8个月前提出的,希望你已经看到了https://dev59.com/E2s05IYBdhLWcg3wB9af。 - m_mlvx

28
使用此插件:https://github.com/tpope/vim-unimpaired ]p 命令在当前行的下面粘贴 [p 命令在当前行的上面粘贴
优点:
  • 适用于所有被复制的文本(单词、行、字符等)
  • 缩进已复制的文本以匹配周围文本的缩进
  • 只需要2个按键而不是3个,操作更加容易
  • 速度快

3
我也喜欢这个。可能值得一提的是,你需要安装 tpope/vim-unimpaired 才能让它正常工作。 - alextes
1
啊,我安装那个已经很久了,都忘记了。谢谢你提醒我! - crogers
1
这个解决方案在我的spacemacs中正常工作。(提醒spacemacs用户) - steve_b
2
这个答案值得成为正确答案,简单、快捷,无需经历额外的麻烦。感谢 @crogers。 - sepisoad

10

就我个人而言,我使用了以下命令来扫描 回车符(CR)

nmap <CR> o<Esc>k

...基于这篇Vim Wikia文章。

这样我就可以直接从正常模式下换行,结合想要粘贴到下一行的需求,我会这样做:

<CR>jp

根据您从Enter中需要的功能,您还可以跳过上面的nmap中的k,这样就只剩下<CR>p了。

我还将jj映射为Esc,这在这种情况下也会有所帮助。对于vim中的重要性来说,Esc离主键盘区太远了。

虽然不比其他解决方案更短,但我认为它感觉不那么笨重,并且它还有其他用途。


7

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

  • o – 插入模式并换行
  • ctrl+o – 在正常模式下执行单个命令
  • p – 粘贴

这是三个按键,但您可以保持在插入模式中,并且o ctrl+o速度相当快,所以我个人将其视为2.5个按键。


1
每输入2.5个按键,加一。 - ipatch

5
如果你要复制整行,然后粘贴整行,请先使用Y命令复制整行或多行,包括换行符,然后使用p命令粘贴。你还可以使用V命令,它是可视化的模式,与普通的v命令可视化模式不同。

3
问题在于,有时您并不想复制整行……我希望有一个解决方案,无论我复制了十行还是两个单词都能起作用。 - static_rtti

3

我有一个映射 inoremap jj <ESC>。这样使用 ojjOjj 插入新行就变得很容易,然后使用 p 粘贴。

所以 ojjp 可以新粘贴一行。虽然 ojjpo<esc>p 多了一次击键,但对我来说更加容易。


2
我找到了一个优雅的解决方案。如果您将yank寄存器放入操作系统的剪贴板中(这本身就很棒),使用以下命令:
set clipboard+=unnamed

你可以使用o<Ctl-v>来完成相同的操作,这样做不仅打字更少,而且相比于o<Esc>p:pu,它还可以保留缩进:因为其他两个选项都会将你放在新行的第一个字符处。

需要注意的是,这可能与操作系统有关。我只知道它适用于最近版本的OS X,但剪贴板只是获取操作系统剪贴板中内容的众多方法之一。


请注意,正确的语法是 o<C-V>,而不是 o<Ctl-v> - kohane15

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接