Como fazer com que o vim cole da (e copie para) a área de transferência do sistema?

771

Diferentemente de outros editores, o vim armazena o texto copiado em sua própria área de transferência. Portanto, é muito difícil copiar algum texto de uma página da Web e colá-lo no arquivo de trabalho atual. Acontece que eu tenho que abrir o gedit ou digitá-lo manualmente.

Posso colar o vim de e para a área de transferência do sistema?

Santosh Kumar
fonte
7
Copiar "+ y Paste" + p Funciona exatamente como puxar e colar, exceto se você especificar o registro antes.
Banjocat 28/10/2015
2
Para usar os seguintes comandos, verifique se você fez o sudo apt-get install vim-gnome que adicionará essa funcionalidade ao vim embutido do uso da área de transferência do sistema.
Harnirvair Singh
2
@Harnirvair Para muitos conjuntos de leitores aqui, vim-gnomeprovavelmente é um exagero ou simplesmente não está disponível em seus sistemas operacionais / distros, enquanto eu suspeito vim-gtke, de preferência, vim-gtk3é mais provável que exista e puxe menos dependências, enquanto ainda fornece integração com a área de transferência (pelo menos para os que ainda estão no X11; Não tenho certeza de como tudo isso interage com Wayland).
underscore_d
3
Por padrão no Fedora - não há acesso clipboard (Você precisa gvim), superuser.com/questions/194747/...
icc97

Respostas:

881

Os registros "*e "+são para a área de transferência do sistema ( :help registers). Dependendo do seu sistema, eles podem fazer coisas diferentes. Por exemplo, em sistemas que não usam o X11 como OSX ou Windows, o "*registro é usado para ler e gravar na área de transferência do sistema. Nos sistemas X11, ambos os registros podem ser usados. Veja :help x11-selectionmais detalhes, mas basicamente "*é análogo à seleção PRIMARY do X11 (que geralmente copia as coisas selecionadas com o mouse e cola com o botão do meio do mouse) e "+é análogo à seleção CLIPBOARD do X11 (que é a área de transferência apropriada).

Se tudo isso passou pela sua cabeça, tente usar "*yyou "+yycopiar uma linha na área de transferência do seu sistema. Supondo que você tenha as opções de compilação apropriadas, um ou outro deve funcionar. Você pode remapear isso para algo mais conveniente para você. Por exemplo, você pode colocar vnoremap <C-c> "*yseu ~ / .vimrc para selecionar visualmente e pressionar Ctrl+ cpara puxar a área de transferência do sistema.

Esteja ciente de que copiar / colar da área de transferência do sistema não funcionará se :echo has('clipboard')retornar 0. Nesse caso, o vim não é compilado com o +clipboardrecurso e você terá que instalar uma versão diferente ou recompilar. Algumas distribuições linux fornecem uma instalação mínima do vim por padrão, mas geralmente se você instalar o pacote vim-gtkou vim-gtk3, poderá obter os recursos extras.

Você também pode querer dar uma olhada na 'clipboard'opção descrita em :help cb. Nesse caso, você pode :set clipboard=unnamedou :set clipboard=unnamedplusfazer com que todas as operações de puxar / excluir copiem automaticamente para a área de transferência do sistema. Isso pode ser um inconveniente em alguns casos em que você está armazenando outra coisa na área de transferência, uma vez que a substituirá.

Para colar, você pode usar "+pou "*p(novamente, dependendo do seu sistema e / ou seleção desejada) ou pode mapeá-los para outra coisa. Eu os digito explicitamente, mas geralmente me encontro no modo de inserção. Se você estiver no modo de inserção, ainda poderá colá-los com o recuo adequado usando <C-r><C-p>*ou <C-r><C-p>+. Veja :help i_CTRL-R_CTRL-P.

Também vale mencionar a pasteopção do vim ( :help paste). Isso coloca o vim em um "modo de colagem" especial que desativa várias outras opções, permitindo colar facilmente no vim usando o emulador de terminal ou o atalho de colagem familiar do multiplexador. Simplesmente digite :set pastepara habilitá-lo, cole seu conteúdo e digite :set nopastepara desativá-lo. Como alternativa, você pode usar a pastetoggleopção para definir um código de chave que alterna o modo ( :help pastetoggle). Eu recomendo o uso de registradores em vez dessas opções, mas se eles ainda forem muito assustadores, isso pode ser uma solução conveniente enquanto você aperfeiçoa seus recursos do vim.

Veja :help clipboardpara informações mais detalhadas.

Conner
fonte
104
Isso é muito informativo, mas você pode resumir quais teclas são necessárias para colar na área de transferência do sistema ... por exemplo, com o que alguém está fazendo "*p? Pressiono Shift- ', depois Shift-8, depois p, etc.?
T. Jones Brian
11
Sim, digite esses três caracteres em sequência. Muitos comandos no vim utilizam o que é conhecido como "modo pendente do operador", em que uma tecla é pressionada e, em seguida, o vim espera por mais teclas. Tome ddpor exemplo. O primeiro dentra no modo pendente do operador, depois o segundo dtermina o comando e exclui a linha. Se você digitar dG, no entanto, Gele o excluirá no final do arquivo, em vez de apenas excluir a linha. Os registradores usam esse mesmo princípio para permitir que vários comandos os usem.
Conner
4
Ai! Se eu tivesse visto esse post antes de hoje! Isso é tudo o que eu queria saber sobre copiar e colar da área de transferência do sistema. O "<Cr> <Cp> * ou <Cr> <Cp> +" é ouro puro.
21414 Keith Pinson
55
Uma ênfase: você precisa instalar o vim-gtkpacote (no Debian, pelo menos), para obter o vim que é compilado +xterm_clipboard. Levei 40 minutos para descobrir isso, e apenas alguns segundos para sudo apt-get install vim-gtk.
Dominykas Mostauskis
3
@DominykasMostauskis vim-gnometambém funciona e foi +xterm_clipboardativado.
quer
155

Você pode copiar para o vim usando o atalho do gnome-terminal para colar. Faça o arquivo no modo de inserção e use

Ctrl+ Shift+ v.

Lembre-se de

 :set paste 

para evitar mexer com o recuo.

neel
fonte
20
essa bagunça com recuo se existem várias linhas como python loop
Moj
11
Use uma alternância de pasta para o modo de inserção. Por exemplo, set pastetoggle = <F2> Em seguida, no modo de inserção, pressione <F2> e insira o código python.
Jan Weitz
Sim copie com Ctrl + Shift + c e colar em outr arquivo r
Neel
1
se tabulações / espaços em branco, eols etc. forem mostrados como um caractere visível (através da opção listchars), esses caracteres substitutos serão copiados em vez dos caracteres ocultos.
precisa saber é o seguinte
2
Esta deve ser a resposta selecionada dada a sua resposta concisa
Aidin
41

Linux

No meu sistema Linux, os registros +e são *mapeados para uma seleção X11, que pode ser colada com o botão do meio do mouse. Quando :set clipboard=unnamede :set clipboard=unnamedplussão usados, os registradores são mapeados para a área de transferência e podem ser colados com CTRL-V.

As especificidades parecem um pouco dependentes da configuração e do sistema, portanto sua milhagem definitivamente varia. Definitivamente, você deve apontar na direção certa.

Veja também

http://vim.wikia.com/wiki/Accessing_the_system_clipboard

Todd A. Jacobs
fonte
2
Apenas *mapeia para o registro primário X11 (que normalmente é colado pelo mouse). +mapeia para o registro da área de transferência do X11 normalmente colado por atalhos.
ZyX 15/07/12
@ZyX Não está no meu sistema, mas sua milhagem pode certamente variar. É melhor configurar explicitamente o comportamento que você deseja, se desejar uma experiência consistente entre plataformas e versões de software.
27412 Todd A. Jacobs
Eu acredito que isso significa que você tem um gerenciador de área de transferência como o klipper / glipper, eles são capazes de sincronizar dois buffers. Isso não muda o fato de que vim usos *para primário e +para área de transferência registros X11, você pode ver isso na fonte vim: estes valores são definidos lá e nunca modificado, e clip_stare clip_plussão sempre utilizados para *e +registros, respectivamente.
ZyX 15/07/12
41

Para o meu, essa configuração funciona para copiar e colar

" copy and paste
vmap <C-c> "+yi
vmap <C-x> "+c
vmap <C-v> c<ESC>"+p
imap <C-v> <ESC>"+pa
lis2
fonte
no que você colou?
precisa saber é o seguinte
Este IMHO é uma solução melhor que configurar o clibboard para sem nome - para não mexer com a área de transferência do SO com todas as ações x / dd / y etc. E em um Mac, pode ser uma idéia melhor alterar o modificador C (ctrl) para D para mapear as combinações cmd + c / x / v.
Mindex 07/12
34

Estas seriam as linhas que você precisa no seu vimrc para este propósito:

set clipboard+=unnamed  " use the clipboards of vim and win
set paste               " Paste from a windows or from vim
set go+=a               " Visual selection automatically copied to the clipboard
Danniel Little
fonte
2
Eu gosto da sua solução. Eu gostaria de uma explicação melhor.
zhon
excelente. usar registros sempre me faz hesitar e ter que pensar. Isto é muito melhor
JonnyRaa
Minha versão do vim tem + área de transferência e esta opção não funciona para mim. Estou usando o Byobu (que usa o Tmux sob o capô).
GGhe
Eu tive que adicionar a área de transferência do conjunto + = unnamedplus para o Fedora
hakunin
29

Eu acredito que esta pergunta merece uma resposta mais objetiva e gráfica:

Como entrar no modo de colagem

  • ESC
  • : definir colar
  • pressione i
  • SHIFT+ Insert(com um texto copiado na sua área de transferência)


Saindo do modo de colagem

  • ESC
  • : definir nopaste
  • pressione i

Você colou o texto e pode digitar novamente.

ivanleoncz
fonte
1
Eu fiz isso funcionar, mas :set nopastenão faz nada. O que isso deve fazer? Por que eu preciso disso?
Marko Avlijaš
1
Bem, na verdade, faz. Ao executar :set nopaste, você está dizendo ao editor que não deseja mais colar. E quando você bate i, você está retornando ao modo de edição :).
precisa saber é o seguinte
2
Para ser sincero com você, Marko, eu não sei.
Ivanleoncz 30/04
1
SHIFT + Insert foi feito para mim, obrigado!
Melissa Loos
1
Isso funcionou como um encanto para mim. Toda vez que volto ao vim, sempre acabo tendo que parecer algo assim.
benjaminadk
17

prancheta

Há um registro especial para armazenar esta seleção, é o registro "*. Nada é colocado aqui, a menos que as informações sobre o texto selecionado estejam prestes a mudar (por exemplo, com um clique esquerdo do mouse em algum lugar) ou quando outro aplicativo deseja cole o texto selecionado e, em seguida, o texto é colocado no registro "*. Por exemplo, para cortar uma linha e fazer a seleção atual / colocá-la na CLIPBOARD:

    "*dd

Da mesma forma, quando você deseja colar uma seleção de outro aplicativo, por exemplo, clicando no botão do meio do mouse, a seleção é colocada no registro "* primeiro e depois em 'colocar' como qualquer outro registro. Por exemplo, para colocar a seleção (conteúdo do CLIPBOARD):

    "*p

registra E354

> There are nine types of registers:                      
> 1. The unnamed register ""
> 2. 10 numbered registers "0 to "9
> 3. The small delete register "-
> 4. 26 named registers "a to "z or "A to "Z
> 5. four read-only registers ":, "., "% and "#
> 6. the expression register "=
> 7. The selection and drop registers "*, "+ and "~ 
> 8. The black hole register "_
> 9. Last search pattern register "/

Colar da área de transferência

1. Clipboard: Copy
2. Vim insertmode, middle mouse key

Verifique o suporte da área de transferência X11 no terminal

Quando você gosta de executar o Vim em um terminal, precisa procurar uma versão do Vim que foi compilada com o suporte da área de transferência. Verifique o suporte da área de transferência do X11, no console, digite:

% vim --version

Se você vir "+ xterm_clipboard", estará pronto.

http://vim.wikia.com/wiki/Accessing_the_system_clipboard

O servidor X mantém três seleções, chamadas:

PRIMÁRIO, SECUNDÁRIO e CLIPBOARD

A seleção PRIMARY é convencionalmente usada para implementar copiar e colar através do botão do meio do mouse. As seleções SECONDARY e CLIPBOARD são usadas com menos frequência pelos programas aplicativos.

http://linux.die.net/man/1/xsel

The Demz
fonte
12

Tentei as sugestões acima e nenhuma delas funcionou no meu ambiente. (Windows PuTTY clone sobre ssh)

Apareceram alguns buscas adicionais: /unix/110684/copy-paste-into-sshd-vim-from-local-windows-clipboard

Um dos comentários sugeriu o uso de SHIFT+INSERTqual fez o truque para colar da área de transferência da área de trabalho no buffer do Vim. Ctrl-Cjá estava trabalhando para copiar para a área de transferência da área de trabalho do Vim.

Comunidade
fonte
2
estou trabalhando no vim dentro da ferramenta cmder [windows 8.1]. quando você entra em cmder settings> keys e macros> paste, lá tenho o comando shift + insert para colar com várias linhas e ctrl + v para colar com uma única linha.
Zubair Alam
1
para mim, um simples clique direito funciona como um encanto !! Basta clicar com o botão direito!
Fr0zenFyr
2
Como você está usando um terminal, o ssh vim não pode alcançar a área de transferência do sistema nativo por SSL. SHIFT+INSERTfunciona porque é a opção de colar para o seu terminal (ou, no seu caso, PuTTY); no entanto, o recuo provavelmente estará errado. Confira o último parágrafo da minha resposta sobre a pasteopção de corrigir isso.
Conner
1
@jinksPadlock. obrigado .. sim .. eu posso copiar / colar via mouse .. estava tentando descobrir como fazer isso "apenas pelo teclado". A cópia do Windows para o VIM é possível apenas pelo teclado usando o Putty, mas não na direção inversa. No bash para windows .. não é possível fazê-lo em qualquer direção ATM. Compilou uma lista de recursos para apontar as pessoas na direção certa e também para nós .. se você tem alguma coisa a add..maybe você pode adicioná-los aqui: stackoverflow.com/questions/45271895/...
alpha_989
1
@ alpha_989 depois, melhor do que nunca;) Não consigo adicionar ao jinksPadlock ', pois atualmente não tenho um sistema operacional Windows em meus dedos. SHIFT+INSfunciona de um host linux para o ssh vim, assim como o terceiro clique do mouse.
tuk0z
10

Não tinha + área de transferência, então eu vim com esta solução alternativa usando o xsel:

Adicione ao seu ~ / .vimrc:

vnoremap <C-C> :w !xsel -b<CR><CR>

rotestein
fonte
1
Obrigado por esta ótima idéia! Acabei usando:vnoremap <C-C> :w !xclip -i -sel c<CR><CR>
andy
6

Uma observação rápida para pessoas cuja instalação do vim não suporta os registros * e +. Não é necessário fazer o download de uma nova instalação do vim para colar da área de transferência. Aqui está um método alternativo:

1) Instale o parcellite (um gerenciador de área de transferência com pouca memória);

2) No seu arquivo .vimrc, adicione o seguinte:

command Clip r !parcellite -c

3) Reinicie o vim.

Agora, quando você digita: Clip como um comando ex, o conteúdo da área de transferência será colado no cursor. Você também pode mapear o novo comando para uma tecla de função para poder fazer isso com um toque de tecla.

lovecraftian
fonte
4

Isso funciona para mim: Ctrl+ Shift+V

Boseam
fonte
3
A resposta de @ neel já afirmou isso. Isso deve ser apenas um comentário, ou melhor, uma votação positiva, se você quiser dizer que também funcionou para você.
ericbn 7/09/16
3

A solução mais simples para isso, que também funciona entre diferentes máquinas Linux, sshé:

  1. Verifique se suportes vim X-11 da área de transferência: vim --version | grep clipboard. Se ele relatar -clipboarde -xterm_clipboardvocê deve instalar vim-gtkou vim-gnome(gvim no arch linux)

  2. Adicione as seguintes linhas ao seu .vimrc:

set clipboard=unnamedplus
set paste
  1. Se você fizer login em uma máquina diferente via ssh, use a opção -Y: ssh -Y machine

Agora, copiar e colar deve funcionar exatamente como esperado em uma única máquina e em diferentes máquinas, usando apenas ypara arrancar e pcolar. Nota: modifique .vimrcem todas as máquinas em que você deseja usar esse recurso.

chao
fonte
Eu acho que o servidor X também deve estar disponível no servidor para que isso funcione. sim! pode ser instalado pelo vim-gtk. Eu acho que o xvfb será uma opção alternativa para a execução do servidor X.
Ajaeb.KP
3

Corri para esse problema em um meados de 2017 Macbook Pro running vimdentro iTerm2como meu ambiente de desenvolvimento primário.

Como outras respostas sugeriram, corri vim --versione notei que ela retorna -clipboard, o que significa que a versão da vimque foi enviada com a minha máquina não foi compilada com a opção da área de transferência.

O homebrewpacote para vimparece compilar com a clipboardopção, portanto, a correção para mim foi:

  1. Corre brew install vim
  2. Adicionar set clipboard+=unnamedao meu ~/.vimrcarquivo
  3. Feche e reabra iTerm2
NM Pennypacker
fonte
3

Copiar para área de transferência do SO

Selecione o texto no modo visual, pressione "*y

Colar da área de transferência do SO

pressione "*p

Muhammed Ozdogan
fonte
2

Seguindo a resposta de Conner, que foi ótima, mas C-R C-p + e C-R C-p *no modo de inserção é um pouco inconveniente. Idem "*pe "+pdo modo de comando.

um guru do VIM sugeriu o seguinte para mapear o C-vque C-r C-p +faz.

Você poderia ter :inoremap <C-v> <C-o>"+papenas no modo de inserção

se você realmente deseja substituir o modo visual em blocos (não recomendado por ele, pois o modo visual é bom), você pode ter map <C-v> "+p

barlop
fonte
2

Se você estiver usando o vim no MAC OSX, infelizmente ele vem com a versão mais antiga e não cumpre as opções da área de transferência. Felizmente, o homebrew pode facilmente resolver esse problema.

instale o vim:

brew install vim --with-lua --with-override-system-vim

instale a versão gui do vim:

brew install macvim --with-lua --with-override-system-vim

reinicie o terminal para entrar em vigor.


acrescente a seguinte linha a ~/.vimrc
set clipboard=unnamed

agora você pode copiar a linha no vim yye colá-la em todo o sistema.

anônimo
fonte
2

Se você estiver usando um mouse, primeiro

 :set paste 

Em seguida, right click mouseo conteúdo do buffer será colado

Mohammed Rafeeq
fonte
1

Na parte superior da configuração :set clipboard=unnamed, você deve usar o mvim -vque pode obter brew install macvimse estiver usando o vim no Terminal.app no ​​Mac OS X 10.9. O vim padrão não suporta a opção da área de transferência.

Nobu
fonte
1

Também vale a pena mencionar que, no OSX usando o Vim, você pode selecionar o texto com o mouse, Cmd-C para copiar para a área de transferência do sistema OSX, e o texto copiado estará disponível na área de transferência fora do Vim.

Em outras palavras, o OSX trata como se fosse uma janela comum, e é aqui que o botão "Comando" da Apple, muito difamado, é útil.

B-30

B-30
fonte
1
Isso também é válido para qualquer emulador de terminal meio decente em qualquer outro sistema operacional. A Apple não tem nenhuma vantagem aqui.
underscore_d
1

Com base na resposta @ lis2, uso uma configuração mais simples que não forçará o modo Inserir no final:

" Copy and paste
if has('clipboard') && !has('gui_running')
  vnoremap <C-c> "+y
  vnoremap <C-x> "+d
  vnoremap <C-v> "+p
  inoremap <C-v> <C-r><C-o>+
endif

Lembre-se de que todos esses substituem os mapeamentos padrão do Vim:

  • v_CTRL-C: parar o modo visual
  • v_CTRL-X: subtrair [contagem] do número
  • v_CTRL-V: modo visual em blocos
  • i_CTRL-V: insira literalmente o próximo dígito, que também é mapeado para i_CTRL-Q

Como alternativa, pode-se usar as teclas inspirados no "puxão", "Excluir" e "put" Vim verbos: <C-y>, <C-d>e <C-p>respectivamente. Eles substituiriam apenas um mapeamento padrão:

  • i_CTRL-P: busca reversa da palavra-chave para conclusão
ericbn
fonte
1

As outras soluções são boas se você deseja alterar seu vimrc, etc ... No entanto, eu queria uma maneira simples de copiar do vim para o teclado do sistema. Isto é o que eu vim com.

  • Selecione o texto que deseja copiar no modo visual v
  • Pressione :(ele será expandido automaticamente para mostrar :'<,'>)
  • Digite y * ou y + (dependendo do seu sistema) para puxar o texto selecionado para a área de transferência do sistema
NateW
fonte
1

O que você realmente precisa é do EasyClip . Ele fará exatamente isso e muito mais ...

Scott Wade
fonte
1

Como o vim 8, o botão direito do mouse ativa o modo visual por padrão. Isso evita a cópia e colagem "normais" (chame-o de "defeito por design" https://github.com/vim/vim/issues/1326 ). Corrija-o fazendo:

echo "set mouse-=a" >> ~/.vimrc .

Saia e reinicie o vim.

dr0i
fonte
1

Com o Vim 8+ no Linux ou Mac, agora você pode simplesmente usar a pasta nativa do SO ( ctrl+shift+Vno Linux, cmd+Vno Mac). Não pressione ipara inserir o modo.

Ele colará o conteúdo da área de transferência do sistema operacional, preservando os espaços e as guias sem adicionar a inserção automática. É equivalente ao velho :set paste, i, ctrl+shift+V, esc, :set nopastemétodo.

Você nem precisa mais dos recursos +clipboardou do +xterm_clipboardvim instalados. Esse recurso é chamado de "pasta entre colchetes". Para obter mais detalhes, consulte Desativando o recuo automático ao colar texto no vim

wisbucky
fonte
0

Quando eu uso meu Debian vim que não está integrado ao Gnome (vim --version | grep clip # não mostra suporte à área de transferência), posso copiar para a área de transferência depois de pressionar a tecla Shift e selecionar o texto com o mouse, como qualquer outro outro programa de maldições. Como imaginei em um comentário do @Conner, é o terminal (gnome-terminal no meu caso) que desliga os relatórios de eventos do mouse quando detecta minha pressão Shift. Eu acho que programas baseados em maldições podem receber eventos de mouse depois de enviar uma certa sequência de Escape para o terminal.

enguia ghEEz
fonte
1
Isso está usando seu terminal, não o vim.
Conner
0

Se você estiver no Windows e desejar colar o conteúdo da área de transferência do sistema usando p, digite este comando.

:set clipboard = unnamed

Isso resolveu meu problema.

Vincent Matthew
fonte
0

Existem duas maneiras simples de fazer isso. Crie seu arquivo no modo de inserção e 1) pressione o botão do meio (a roda de rolagem) do mouse ou 2) Ctrl + Shift + V

user1898814
fonte
0

Para alguns teclados internacionais, pode ser necessário pressionar "+ Spacepara obter a ".

Então, nesse caso, você teria que pressionar "Space+you "Space*ycopiar.

E "Space+pou " Space*ppara colar.

Arthur F
fonte
0

Usei a resposta do NM Pennypacker e instalei o vim via homebrew para um MacBook Pro de 2011:

brew install vim

Agora também posso usar o "* register para copiar e colar texto no vim. Eu nem precisei alterar algo no meu arquivo ~ / .vimrc ou no $ PATH. O Homebrew adicionou links simbólicos em / usr / local / bin, por exemplo vim -> ../Cellar/vim/8.1.2350/bin/vim.

A alternativa, que funcionou antes, é copiar algumas linhas de texto no vim, marcando-o com o mouse e usando copiar e colar (cmd + c, cmd + v) em um mac. Esta opção funciona apenas se o texto que você deseja copiar e colar tiver tamanho menor que o tamanho da janela do vim. Se você deseja copiar todo o texto no vim marcando a janela inteira ou usando cmd + a, isso copiará outras partes do console, escritas antes de iniciar o vim, o que é muito irritante.

Então, estou feliz por ter encontrado o novo método usando o registro da área de transferência.

feli_x
fonte