Como colar em uma nova linha com vim?


144

Costumo colar algumas coisas em uma nova linha no vim. O que eu costumo fazer é:

o<Esc>p

O que insere uma nova linha e me coloca no modo de inserção, depois sai do modo de inserção e, finalmente, cola.

Três pressionamentos de tecla. Não é muito eficiente. Alguma ideia melhor?


8
3 teclas não são eficientes?
GTD

60
1 ou 2 seria melhor :) Por que usar o vim se não for para obter a máxima eficiência?
static_rtti

2
Também resulta em uma nova linha extra se o conteúdo copiado terminar em uma nova linha.
27618 Jonathan W.

1
@gtd Um editor normal trabalha com <Enter> <CV>. Duas teclas.
user4052054

1
@ user4052054 não, isso não faz a mesma coisa, o / O funciona onde quer que você esteja na linha, em um editor normal você precisa chegar primeiro ao início ou ao fim da linha. Além disso, se você estiver copiando uma linha inteira, tudo se tornará um pressionamento de tecla para inserir uma linha, o que é uma proposição muito mais comum na codificação.
Gtd

Respostas:


71

Logo após :help pele diz:

:[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).

Infelizmente, não é mais curto que a sua solução atual, a menos que você a combine com algum mapa do teclado, conforme sugerido em uma resposta diferente. Por exemplo, você pode mapeá-lo para qualquer chave (par p):

:nmap p :pu<CR>

2
Eu sei disso e uso, mas não é o que estou perguntando, porque às vezes o que você está copiando simplesmente não tem LF nele. Se houvesse um comando "colar em uma nova linha", ele funcionaria independentemente do conteúdo que você está prestes a colar, para que você não precise pensar nisso.
static_rtti

5
Ok, :pu[t]colocará o texto em uma nova linha após a linha atual, :pu[t]!colocará o texto em uma nova linha antes da linha atual. Vou editar minha resposta de acordo. (Hooray for :help p.)
Bombe

2
Não é realmente melhor do que minha solução atual, mas acho que é a melhor resposta para minha pergunta.
static_rtti

4
Enquanto o mesmo número de pressionamentos de tecla, acho que isso parece mais eficiente. o <Esc> p parece desajeitado, enquanto isso não acontece.
Mark História

2
Você pode mapear o comando para qualquer tecla, incluindo a própria p: :nmap p :pu<CR>Coloque-o em seu .vimrc arquivo e temos que ir :)
Capi Etheriel

55

Opções:

1) Use yypara puxar a linha inteira (incluindo o caractere de fim de linha). pcolará a linha em uma nova linha após a atual e P( Shift- P) colará acima da linha atual.

2) Faça um mapeamento: então são apenas uma ou duas chaves:

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

3) A versão da função do mapeamento (realmente desnecessário, mas apenas por completo):

: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
Bem, acho que vou fazer um mapeamento. Eu só esperava que houvesse uma solução padrão: - / Obrigado pela sua resposta!
static_rtti

2
@ AI: Usando o ', p' (',' é mapeado como meu <Leader>) é a melhor solução na minha opinião. Você até forneceu uma função fácil de usar. :) Ótimo!
Alguém ainda usa o MS-DOS

30

Você pode colar um buffer no modo de inserção usando <C-R>seguido pelo nome do buffer a colar. O buffer padrão é ", então você faria

o<C-R>"

Descobri que uso com <C-R>"muita frequência e vinculei isso ao <C-F>meu vimrc:

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

2
Isso é ótimo porque mantém o recuo correto se a linha copiada não foi recuada.
CornSmith 15/05/19

24

Isso ainda usa três pressionamentos de tecla, mas acho mais fácil que o Esc:

o<Alt-p>

Como você está no modo de inserção após pressionar o, o modificador Alt permitirá que você use um comando como se não estivesse.


2
Maneira bastante útil quando você tenta o sth puxão você cortar dentro da linha com "d $" em uma nova linha
Serhat Cevikel

Desculpe, mas isso não mantém o recuo, ele cola no início da linha.
Michael Goldshteyn

Alguém pode elaborar esse método para mac (sem alt)?
Li HaoNan

@Lihaonan Sua pergunta é de 8 meses atrás, espero que você já tenha visto stackoverflow.com/q/7501092/5407634
m_mlvx 28/07

12

Usando este plugin: https://github.com/tpope/vim-unimpaired

]ppastas na linha abaixo

[ppastas na linha acima

vantagens:

  • funciona em todo o texto arrancado (palavra, linha, caractere etc.)
  • recua o texto colado para corresponder ao recuo do texto ao seu redor
  • 2 teclas pressionadas em vez de 3 e muito mais "fáceis"
  • velozes

1
O meu favorito também. Vale a pena mencionar que você precisa tpope/vim-unimpairedpara que isso funcione 😉.
Alext7 /

1
ah eu instalei isso há tanto tempo que esqueci. Obrigado pela lembrança!
crogers 11/09/19

9

Pessoalmente, nmappedi Enter (CR) assim:

nmap <CR> o<Esc>k

... com base neste artigo da Vim Wikia.

Dessa forma, eu posso criar novas linhas diretamente do modo normal, e combinando isso com o desejo de colar em uma nova linha abaixo, eu faria:

<CR>jp

Você também pode pular k no nmap acima, dependendo da funcionalidade que preferir do Enter , para que seja<CR>p .

Também mapeei o jj para Esc , o que também ajudaria neste caso. Esc está muito longe da linha inicial para ver se é significativo no vim.

Não é mais curto que as outras soluções, mas acho que parece menos desajeitado do que algumas delas, e também tem outros usos.


5

Se você estiver copiando uma linha inteira e colando uma linha inteira, use Ypara puxar a linha ou linhas, incluindo quebra de linha, em primeiro lugar e pcolar. Você também pode usar V, que é o modo de linha visual , em contraste com o vmodo simples para visual.


3
O problema é que, às vezes, você simplesmente não deseja copiar uma linha inteira ... Gostaria de uma solução que funcione, se copiei dez linhas ou duas palavras.
static_rtti

3

Eu tenho mapeamento inoremap jj <ESC>. Portanto, é fácil inserir uma nova linha com ojje Ojje depois p.

então ojjpcole uma nova linha nova. ele tem mais um golpe, o<esc>pmas ojjpé fácil para mim.


2

Encontrei uma solução elegante para isso. Se você estiver colocando o registro ianque na área de transferência do seu sistema operacional (o que é ótimo de qualquer maneira), com

set clipboard+=unnamed

do que você pode fazer o<Ctl-v>.

Além de ter menos traços, isso melhora em ambos o<Esc>pe :puporque preserva o recuo: as outras opções iniciam o caractere zero na nova linha.

Advertência é que isso pode ou não ser dependente do SO. Tudo o que sei é que ele funciona na versão recente do OS X, mas a área de transferência é apenas uma das muitas maneiras de puxar a área de transferência do sistema operacional.


1

Se você também deseja terminar no modo de inserção, é possível colar enquanto estiver no modo de inserção usando CTRL-R ". https://stackoverflow.com/a/2861909/461834

Ainda são três pressionamentos de tecla, mas não há escapatória, e você salva um pressionamento de tecla se quiser finalizar a inserção mesmo assim.


1

Eu uso o seguinte mapeamento na minha configuração do Neovim:

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

Uma pequena explicação:

  • m`: define uma marca na posição atual do cursor.
  • o<Esc>p: crie uma nova linha abaixo e cole o texto nesta linha
  • O<Esc>P: crie uma nova linha acima e cole o texto nessa linha
  • ``: coloca o cursor na posição original

Consulte :h markpara obter mais informações sobre marcas no Vim.


1

Se você quiser permanecer no modo de inserção, pode fazer o ctrl+o p

  • o - insira o modo e vá para a nova linha
  • ctrl+o - execute um único comando como no modo normal
  • p - colar

São três pressionamentos de tecla, mas você permanece no modo de inserção e também o ctrl+oé bastante rápido, então eu o trato pessoalmente como pressionamentos de tecla 2,5.


0

Essa solução parece aplicar-se apenas quando o bloco de texto copiado inicia em uma nova linha (em vez de pegar um trecho de texto em algum lugar dentro de uma linha), mas você sempre pode iniciar sua cópia no último caractere que deseja pegar e navegar. até o último caractere no final da linha antes do início do bloco de cópia desejado. Quando quiser colá-lo, coloque o cursor no final da linha em que deseja colar o texto e pressione p. Se eu não estraguei a explicação, isso deve fornecer o efeito que você está procurando.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.