Colar no modo de inserção?

385

É possível colar no modo de inserção no Vim?

Amir Rachum
fonte

Respostas:

465

Enquanto estiver no modo de inserção, pressione CTRL-R {register}

Exemplos:

  • CTRL-R * irá inserir no conteúdo da área de transferência
  • CTRL-R " (o registro sem nome) insere a última exclusão ou puxão.

Para encontrar isso no tipo de ajuda do vim :h i_ctrl-r

david
fonte
13
Sim, só recentemente aprendi sobre CTRL-R e é extremamente útil.
Dan
16
CTRL-R *funciona apenas no GVIM ou em versões compiladas para interagir com x. Digite vim --versione procure +xterm_clipboard. Se você não tiver isso, precisará de uma versão diferente do vim. ( vim.wikia.com/wiki/Accessing_the_system_clipboard )
Conrad.Dean
10
Na verdade, você só precisa +clipboard, mas, se tiver, +xterm_clipboarddeve fazê-lo de qualquer maneira. Em alguns sistemas operacionais xterm_clipboardnão é aplicável.
Andrew Marshall
11
Hmm, eu uso o C-r + para colar da área de transferência do sistema no Windows (usando o GVim portable)? Nunca ouvi falar de * registrar.
kitsu.eb 08/09/12
6
@ kitsu.eb Nos sistemas X, o *registro é colável com o clique do meio do mouse, enquanto +é a tradicional copiar / colar. standards.freedesktop.org/clipboards-spec/clipboards-latest.txt
amc
235

Se você não quer Vim para mangle formatação no incoming texto colado, você também pode querer considerar o uso: :set paste. Isso impedirá que o Vim remarque seu código. Quando terminar de colar, :set nopasteretornará ao comportamento normal.

Também é possível alternar o modo com uma única tecla, adicionando algo como set pastetoggle=<F2>ao seu .vimrc. Mais detalhes sobre a alternância da indentação automática estão aqui .

James Snyder
fonte
47
:set nopastedesativará o modo colar
James Snyder
24
@JamesSnyder :set paste!Provavelmente, a pasta definida está muito próxima do seu histórico de comandos, então você pode simplesmente pressionar ':', depois clicar com a seta para cima e adicionar um '!'.
Rafael Barbosa
6
Apenas curioso - o que é melhor ou diferente sobre :set paste! Thanks :)
Michael Durrant
33
o !no final do comando vimativa e desativa o comando. Dessa forma, você não precisa digitar; :set nopastepode rolar o histórico e executar o mesmo comando ( :set paste!) novamente.
에이 바
3
@blockloop Você deve habilitá-lo ao colar e desativá-lo logo depois.
NieDzejkob 16/09
125

Não, não diretamente. O que você pode fazer é sair rapidamente do modo de inserção para uma única operação no modo normal Ctrl-Oe colar a partir daí, que terminará colocando você de volta no modo de inserção.

Combinação de teclas: Ctrl-O p

EDIT: Interessante. Parece que existe uma maneira como várias outras pessoas listaram.

JaredPar
fonte
2
ctrl-r "não funciona para mim (OS X, vi em um terminal) ctrl-o p o fez..
Bob
4
Esta é a maneira mais rápida e fácil de lembrar.
pinpox
Que tal esc + p?
sitilge 21/09/17
2
Definitivamente mais rápido do que esc + p + ie definitivamente mais fácil de escrever do queCTRL-R + "
lucidbrot
Na verdade, isso às vezes se comporta de maneira diferente CTRL-R ". Por exemplo, embora as configurações do vimrc possam mudar isso, colar algo em uma nova linha usando CTRL-O pfaz com que o recuo diminua.
Noname
30

Enquanto estiver no modo de inserção, você pode usar Ctrl-R {register}, onde o registro pode estar:

  • + para a área de transferência,
  • * para a área de transferência X (último texto selecionado em X),
  • " para o registro sem nome (última exclusão ou puxão no Vim),
  • ou vários outros (veja :h registers).

Ctrl-R {register} insere o texto como se tivesse sido digitado.

Ctrl-R Ctrl-O {register} insere o texto com o recuo original.

Ctrl-R Ctrl-P {register} insere o texto e o recua automaticamente.

Ctrl-Opode ser usado para executar qualquer comando do modo normal antes de retornar ao modo de inserção;
Ctrl-O "+ptambém pode ser usado, por exemplo.

Para obter mais informações, consulte a documentação com :h i_ctrl-r

Zaz
fonte
4
Essa resposta parece ser a mais abrangente. É muito claro e, na minha opinião, o mais útil. Responde à pergunta do OP e depois a alguns, de forma concisa.
Devvyn
26

Você pode usar isso para colar da área de transferência com Ctrlv:

set pastetoggle=<F10>
inoremap <C-v> <F10><C-r>+<F10>

E isso para puxar a seleção visual para a área de transferência com Ctrlc:

vnoremap <C-c> "+y

Se você também deseja usar a área de transferência por padrão para puxar / colar clássico do vim ( y/ p) no modo normal, aqui está uma opção de configuração que faz isso:

set clipboard=unnamedplus

Com essas configurações, você pode, por exemplo, puxar primeiro no modo normal e depois colar Ctrlvno modo de inserção. Além disso, você pode colar texto de diferentes instâncias do vim e aplicativos diferentes.

Outra opção é:

set clipboard=unnamed

Depois, você poderá selecionar algo arrastando o mouse no seu ambiente X e colá-lo no vim posteriormente. Mas (por algum motivo), você não poderá puxar algo ( y) no Vim eshiftinsert em outro lugar posteriormente, o que provavelmente é bastante limitador.

Documentos do Vim sobre isso: http://vim.wikia.com/wiki/Accessing_the_system_clipboard

Para colar a partir de registros personalizados, você pode seguir as outras respostas :). Esta resposta é principalmente sobre a integração do Vim com a área de transferência do sistema.


Observe que, para set clipboard=unnamedpluse set clipboard=unnamedpara o trabalho, você precisa usar gvim ou vimx ( vim-X11): são compilados +xterm_clipboard. Opcionalmente, você pode colocar isso no seu .bashrcalias vimcom vimx:

if [ -e /usr/bin/vimx ]; then
    alias vim='/usr/bin/vimx'; # vim with +xterm_clipboard
fi

Você pode descobrir se o seu vim possui ou não +xterm_clipboardas informações fornecidas por vim --version.

clima
fonte
7
Era exatamente isso que eu estava procurando. É também a única resposta razoável aqui. É assim que se espera que as coisas funcionem. Alguém sabe por que o comportamento padrão :set pastee o bizantino <leader><leader> * ysão remotamente desejáveis? Para não parecer muito comprometido, estou genuinamente curioso sobre o que a filosofia vim reflete ou se é apenas um infortúnio histórico.
Ésquilo
Sua resposta me permitiu usar Shift + Insert no Gvim também com inoremap <S-Insert> <F12><C-r>+<F12>(eu uso F12 como pastetoggle). Obrigado.
sromero
20

Se você configurar o Vim para usar a área de transferência do sistema ( :set clipboard=unnamed), qualquer texto que você copiar no Vim poderá ser colado usando Shift+ Insert. Shift+ Inserté simplesmente uma combinação de teclas de colar em todo o sistema operacional ( Ctrl+ Inserté a 'cópia' correspondente).

Vai
fonte
11
Não sabia sobre o S-Insert :)
BandGap
Isso funciona ao contrário? Irá pcolar o texto na área de transferência?
Zaz 12/02
Antes de usar Shift + Insertpara colar o texto, precisamos estar no modo de inserção.
Jdhao
18

Você também pode usar o botão do meio do mouse para colar no modo de inserção (somente Linux).

lcltj
fonte
106
Do que você fala esse mouse?
21711 Jim Mitchener
19
Quais são esses sistemas operacionais não-linux de que você fala?
de Bruno Bronosky
-1: esta resposta depende muito das configurações de hardware e terminal. Por fim, os botões do mouse enviam uma sequência predefinida para o terminal, e o terminal analisa essa sequência para executar um determinado comando. O problema é que isso pode variar bastante, dependendo das configurações do terminal. Para melhorar essa resposta, forneça pelo menos a versão do terminal, SO e a versão e modelo do mouse que você está usando.
Melvynkim
A colagem do botão do meio do mouse é bastante comum em todos os aplicativos Linux, não limitada pelas versões do terminal ou do SO.
Lcltj 21/05
Não funciona no Arch Linux + urxvt. Adiciona apenas nova linha.
Zygimantus
5

Você pode entrar no -- INSERT (past) --modo via:

  • Combinação de teclado: y p

ou

  • :set pastee entrando no modo de inserção ( :set nopastepara desativar)

Uma vez no -- INSERT (past) --modo, basta usar a função de colar do sistema (por exemplo, CtrlShiftvno Linux, Cmdvno Mac OS).

Essa estratégia é muito útil ao usar o vim over ssh.

rudolph9
fonte
4

Sim. No Windows Ctrl+ Ve no Linux, pressione os dois botões do mouse quase simultaneamente.

No Windows, acho que essa linha no meu _vimrc provavelmente faz isso:

source $VIMRUNTIME/mswin.vim

No Linux, não me lembro como fiz. Parece que eu provavelmente excluí alguma linha do arquivo .vimrc padrão.

Programador do Windows
fonte
Posso votar mais de uma vez ?? Eu só quero colar quando vier de outra janela - por isso estou sempre no mouse. Brilhante!
dave
No Linux, você cola pressionando o botão do meio do mouse. Se você possui um mouse com dois botões e pressiona os botões esquerdo e direito, ele precisa de "Emulate3Buttons" ou semelhante para funcionar dessa maneira.
quer
0

Colar no modo de inserção

Um mapa personalizado parece apropriado nesse caso. Isto é o que eu uso para colar itens arrancados no modo de inserção:

inoremap <Leader>p <ESC>pa

Minha Leaderchave aqui é \; isso significa que pressionar \pno modo de inserção colaria os itens / linhas arrancados anteriormente.

Sheharyar
fonte
0

Basta adicionar o mapa:

" ~/.vimrc
inoremap <c-p> <c-r>*

reinicie o vim e quando pressionar Crtl+pno modo de inserção, o texto copiado será colado

itsnikolay
fonte