如何用vim粘贴新行?


144

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

o<Esc>p

这将插入新行,并使我进入插入模式,然后退出插入模式,最后进行粘贴。

三个按键。不是很有效。还有更好的主意吗?


8
3次击键效率不高?
gtd

60
1或2会更好:)为什么不使用vim以获得最大效率?
static_rtti 2011年

2
如果复制的内容以换行符结尾,则还会产生一个额外的换行符。
乔纳森·W

1
@gtd普通编辑器可用于<Enter> <CV>。两次击键。
user405205​​4

1
@ user405205​​4不,那不会做同样的事情,无论您在哪里在线都可以进行O / O工作,在常规编辑器中,您必须先到达行首或结尾。此外,如果您要复制整行,那么整个事情就变成了插入行的一个按键,这是编码中更为常见的主张。
gtd

Answers:


71

不久后,: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>

2
我知道这一点,并且使用了它,但这并不是我要的,因为有时您要复制的内容中没有任何LF。如果存在“粘贴到新行”命令,则无论您要粘贴的内容如何,​​它都将起作用,因此您不必考虑它。
static_rtti

5
好的,:pu[t]将文本放在当前行之后的新行中,:pu[t]!将文本放在当前行之前的新行中。我将相应地编辑答案。(万岁:help p
。–孟买,

2
确实没有比我当前的解决方案更好,但是我认为这是对我问题的最佳答案。
static_rtti

4
尽管击键次数相同,但我认为这样做更有效率。o <Esc> p感觉笨拙,而事实并非如此。
Mark Story

2
您可以将命令映射到任何键,包括p本身::nmap p :pu<CR>将其放入.vimrc文件中,然后就可以离开了:)
Capi Etheriel 2012年

55

选项:

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

2
好吧,我想我会做一个映射。我只是希望可能会有一个标准的解决方案:-//感谢您的回答!
static_rtti

2
@AI:我认为使用',p'(','映射为我的<Leader>)是最好的解决方案。您甚至提供了易于使用的功能。:)太好了!
有人仍在使用您MS-DOS

30

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

o<C-R>"

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

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

2
这很棒,因为如果复制的行没有缩进,它可以使缩进正确。
康史密斯

24

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

o<Alt-p>

由于您在按o后处于插入模式,因此Alt修饰符将使您可以像以前那样使用命令。


2
当您尝试yank sth时,用一种很方便的方法在新行中用“ d $”在行内进行了剪切
Serhat Cevikel

抱歉,但这不能使缩进,而是将其粘贴在行的开头。
Michael Goldshteyn's

谁能为Mac(no alt)阐述这种方法?
李haonan

@Lihaonan您的问题来自8个月前,希望您已经看到了stackoverflow.com/q/7501092/5407634
m_mlvx

12

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

]p粘贴在下面的行

[p粘贴在上面的行

优点:

  • 适用于所有带阴影的文本(单词,行,字符等)
  • 缩进粘贴的文本以匹配其周围的文本的缩进
  • 2次击键,而不是3次击键
  • 快速

1
我也是最喜欢的 可能值得一提的是您确实需要tpope/vim-unimpaired此功能😉。
alextes's

1
啊,我很久以前安装了它,我忘了。感谢您的提醒!
crogers

9

我个人已经将Enter(CR)映射为 :

nmap <CR> o<Esc>k

...基于 Vim Wikia文章。

这样,我可以直接从普通模式制作换行符,并将其与想要粘贴到下面的换行符结合起来:

<CR>jp

您还可以在上面的nmap中跳过k,具体取决于您希望从Enter中获得什么功能,因此<CR>p

我还将jj设置为Esc,这在这种情况下也将提供帮助。Esc与vim相比有多么重要,离它的起始行太远了。

不短于其他解决方案,但我确实认为它不如其中一些笨拙,并且还有其他用途。


5

如果要复制整行然后粘贴整行,请首先使用Y来拉动一行或多行(包括换行符)并p粘贴。您也可以使用V,这是视觉线条模式,与普通v视觉模式相反。


3
问题是,有时您根本不想复制整行...无论我复制了十行还是两个单词,我都希望有一个可行的解决方案。
static_rtti

3

我有映射inoremap jj <ESC>。所以很容易用ojj和插入新行Ojj,然后p

因此,ojjp粘贴新换行符。然后o<esc>p又有一个中风,但ojjp对我来说很容易。


2

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

set clipboard+=unnamed

比你能做的多o<Ctl-v>

除了减少笔划之外,这还改善了笔划,o<Esc>p并且:pu保留了缩进:这两个其他选项都将您从新行的零字符处开始。

请注意,这可能取决于操作系统,也可能不取决于操作系统。我所知道的是,它可以在最新版本的OS X上运行,但是剪贴板只是在OS剪贴板中获取抽签的众多方式之一。



1

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

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

一点解释:

  • m`:在当前光标位置设置一个标记。
  • o<Esc>p:在下面创建新行并将文本粘贴到此行中
  • O<Esc>P:在上方创建新行并将文本粘贴到此行
  • ``:将光标置于原始位置

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


1

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

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

这是三个按键,但是您仍处于插入模式,而且o ctrl+o速度也很快,因此我个人将其视为2.5个按键。


0

仅当复制的文本块在换行符处开始(而不是在一行中的某处抓取文本片段)时,此解决方案才似乎适用,但是您始终可以在要抓取的最后一个字符处开始复制,然后导航到所需复制块开始之前的行末尾的最后一个字符。然后,当您要粘贴它时,将光标放在要粘贴文本的行的末尾,然后按p。如果我还没有搞清楚解释,那应该可以提供您想要的效果。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.