Como posso copiar texto para a área de transferência do sistema do Vim?

284

Existe uma maneira de copiar um bloco de texto para a área de transferência do sistema, para que eu possa colá-lo em outro programa?

thameera
fonte
12
Isso já foi solicitado e respondido no SO. Você pode encontrar mais e diferentes informações lá.
precisa saber é o seguinte
1
Eu tenho usado este plugin no macvim christoomey / vim-system-copy e realmente o amo. Ele funciona muito bem com movimentos cpip, cpi{.
Filype 25/01
2
O que você realmente precisa é do EasyClip . Ele vai fazer tudo isso e muito mais ...
Scott Wade

Respostas:

322

Para sistemas baseados no X11 (ou seja, Linux e a maioria dos outros sistemas semelhantes ao UNIX ), existem duas áreas de transferência independentes uma da outra:

  • PRIMÁRIO - É copiar na seleção e pode ser colado com o botão do meio do mouse.
  • CLIPBOARD - Isso é copiado (geralmente) ^Ce colado com ^V(É como o MS Windows).

Os sistemas OS X e Windows possuem apenas uma área de transferência.

Para sistemas X11, também existem várias ferramentas que sincronizam essas pranchetas para você; portanto, se eles parecem iguais, você pode ter um deles em execução.

O Vim possui dois registros especiais correspondentes a essas pranchetas:

  • *usa PRIMARY; mnemônico: S tar é S eleito (para copy-on- s eleitos)
  • +usa CLIPBOARD; mnemônico: CTRL PLUS C (para o teclado comum)

No Windows e no OS X, não há diferença entre +e *, uma vez que esses sistemas possuem apenas uma única área de transferência e os dois registros se referem à mesma coisa (não importa qual deles você usa).

Você pode usar esses registros como qualquer registro. Por exemplo, usando a área de transferência PRIMARY *com os comandos ye p:

  • "*yy
  • "*p

Talvez você possa usar isso como combinações de teclas mais convenientes:

noremap <Leader>y "*y
noremap <Leader>p "*p
noremap <Leader>Y "+y
noremap <Leader>P "+p

Se você deseja interagir "automaticamente" com a área de transferência do sistema, em vez de se referir a ela manualmente o tempo todo, defina a clipboardvariável:

  • Configure unnamedpara usar *(PRIMARY, ao selecionar)
  • Defina unnamedpluspara usar +(CLIPBOARD, ^C)

Agora, apenas o uso yyirá para a área de transferência do sistema, em vez do registro sem nome do Vim, e pcolará a área de transferência do sistema.

Você também pode atribuir a esses registros como qualquer outro registro com let:

  • :let @+=42
  • :let @*=42

A clipboardconfiguração tem mais algumas opções (como excluir filtros); mas estes são os princípios. Veja :help 'clipboard'a história completa ;-)

gVim

Se você usa o gVim, pode obter um comportamento de copiar na seleção ao usar :set guioptions+=a.
Isso é ativado por padrão nos sistemas X11 (cópias para PRIMARY), mas não no MS Windows e OSX (pois a seleção de qualquer texto substitui a área de transferência).

Não +clipboard?

O Vim requer o +clipboardsinalizador de recurso para que isso funcione; você pode verificar se o seu Vim tem isso usando :echo has('clipboard')de dentro Vim (se a saída for 0, é não presente, se é 1, é), ou verificar a saída vim --versionpara +clipboard.

A maioria das distribuições Linux é fornecida com uma compilação "mínima" do Vim por padrão, o que não tem +clipboard, mas geralmente você pode instalá-lo:

  • Debian e Ubuntu: Instale vim-gtkou vim-gnome.
  • Fedora: instale vim-X11e execute em vimxvez de vim( mais informações ).
  • Arch Linux: install gvim(isso também permitirá o +clipboardnormal vim).

Você também pode usar xclip,, xcopyou xselpara copiar texto para a área de transferência; veja as seguintes perguntas para soluções:

SSH

Você também pode usar uma área de transferência em máquinas remotas se ativar o encaminhamento do X11 pelo SSH. Isso é especialmente útil com a dica acima, pois você pode usá-lo xclippara acessar a área de transferência da área de trabalho. O Vim na máquina para a qual você está trabalhando ainda precisará do +clipboardrecurso.

Isso requer a ForwardX11Trustedconfiguração e deve ser feito apenas com servidores confiáveis , pois isso fornece ao servidor controle quase completo sobre sua sessão X11:

$ ssh -XY myhost

Para tornar essas configurações persistentes (para que você não precise adicionar -XYtodas as vezes), você pode fazer algo assim no seu ~/.ssh/config:

# Do **NOT** set this globally; it gives the server complete control over
# your X11 session.
Host myhost
    ForwardX11 yes
    ForwardX11Trusted yes

Neovim

Neovim reformulou o suporte da área de transferência. A interface incorporado foi removido e substituído por um sistema que chamar um utilitário externo, tais como xclip, xsel, ou pbcopy/ pbpaste.

Ele deve pegar automaticamente esses utilitários e usá-los. No OS X pbcopy e pbpastedeve estar disponível por padrão, no Linux você provavelmente vai querer instalar xclip, já que é o mais amplamente disponível (na verdade existem duas versões do xselcom bandeiras incompatíveis . Este é realmente estúpido).

Veja também :help clipboardem Neovim.

Martin Tournoij
fonte
6
ssh -Y implica -X, portanto -X pode ser omitido.
Hildred 16/03/2015
Para alguns teclados internacionais, pode ser necessário pressionar "<Space>para obter um ". Então, nesse caso, você teria que pressionar "<Space>+you "<Space>*ycopiar.
Arthur F
1
Um efeito colateral muito interessante de aprender isso (há alguns anos atrás) para mim foi a realização que "pode selecionar muitos registros nomeados. "+não é mágico, é só registrar +. Assim, por exemplo, se você deseja copiar três coisas ao mesmo tempo e cole cada um deles, um por um, você pode "1y, "2ye "3ymais tarde "1p, "2pe "3p. Isso é realmente poderoso e inexistente em quase qualquer outro editor. Outro uso interessante é examinar as macros armazenadas. Por exemplo, se você gravar com qq, mas perceber que precisa corrigi-lo, poderá: em uma linha temporária "qp, corrigi-lo e "qd.
Shahbaz
1
Apenas uma observação: o OS X possui duas pranchetas separadas. Um é acessado usando Cmd-C e Cmd-V e o outro usando as combinações de teclas Ctrl-K e Ctrl-Y do emacs.
usar o seguinte
3
@shahbaz - provavelmente é melhor usar os registros de letras para esse fim, pois os numerados são alterados sempre que o texto é excluído.
evilsoup
18

As outras respostas abordam como copiar texto do seu buffer para a área de transferência do sistema. Outra operação comum é copiar texto de outro registro para a área de transferência. Por exemplo, se você já inseriu algum texto "(o registro padrão), convém carregá-lo na área de transferência.

Você pode fazer isso com :let:

  • let @+=@" - copia o registro padrão para a área de transferência
  • let @*=@" - copia o registro padrão na seleção principal do X11 ("área de transferência do mouse")
  • let @+=@a- copiar do registro apara a área de transferência
  • etc.

Observe que isso funciona para registros em geral: let @a=@bcópias registram bpara registrar a.

wchargin
fonte
17

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

set clipboard=unnamedplus

Isso altera o registro Vim padrão para o +registro, que está vinculado à área de transferência do sistema. De :h clipboard-unnamedplus:

                                        clipboard-unnamedplus
unnamedplus     A variant of the "unnamed" flag which uses the
                clipboard register '+' (quoteplus) instead of
                register '*' for all yank, delete, change and put
                operations which would normally go to the unnamed
                register.  When "unnamed" is also included to the
                option, yank operations (but not delete, change or
                put) will additionally copy the text into register
                '*'.
                Only available with the +X11 feature.
                Availability can be checked with: 
                        if has('unnamedplus')
Quincy Bowers
fonte
Por que isso não funciona para mim quando você puxa e cola entre instâncias do vim (cada uma em um terminal terminador separado)?
thinwybk
Se você estiver no Linux e o Vim tiver sido compilado com o recurso + X11, e tiver o clipboard = unnamedplus set, poderá conseguir puxar uma linha em uma instância do vim e colá-la em outra instância do vim. Você também deve poder colá-lo em qualquer outro aplicativo com CTRL + V ou SHIFT + INSERT. Você pode usar :versionno Vim para ver se + X11 aparece na lista de recursos incluídos. Você também pode verificar se o recurso 'unnamedplus' está disponível com :if has('unnamedplus')⏎ echo 'yes'⏎ endif Se você não estiver no Linux, deverá usar unnamed em vez de unnamedplus.
Quincy Bowers
10

Nas compilações que o suportam, o registro chamado *é a área de transferência do sistema. Para copiar texto do Vim para a área de transferência do sistema, você pode selecionar o texto usando o modo visual e pressionar "*ypara copiá-lo para a área de transferência do sistema.

Por outro lado, use "*ppara colar o texto da área de transferência do sistema no Vim.

200_success
fonte
5

Eu recomendo que você use o Gvim e adicione isso ao seu .vimrc:

source $VIMRUNTIME/mswin.vim
behave mswin

Isso permite o suporte para CtrlC, CtrlX, CtrlVcomo o bloco de notas do Windows.

Observe que isso também adicionará outros atalhos comuns do Windows, como CtrlSpara :w, CtrlApara selecionar tudo, etc.

linrongbin
fonte
0

Se o seu vim não suportar, +clipboardvocê pode usar o plugin fakeclip para Linux, Mac, Windows, tmux, screen, ...

Laktak
fonte
0

Todas as outras respostas cobriram todas as coisas importantes sobre os registros. Eu gostaria de adicionar mais uma coisa que eu uso.

Existe uma maneira no Vim de copiar diretamente o texto visualmente selecionado para a área de transferência. Basta colocar isso no seu arquivo vimrc :

set guioptions+=a

E, com isso sempre que você selecionar visualmente algum texto, ele será copiado para a área de transferência. Para mais informações sobre isso,:help guioptions

BTW, isso é apenas para gVim.

Durga Swaroop
fonte
2
guioptions+=atambém é mencionado na resposta de Carpetsmoker.
Muni
@muru Sim, desculpe. Eu não vi isso antes. Acabei de ver.
Durga Swaroop
0

Você também pode usar um comando global para colocar algum padrão específico na área de transferência. Pode ser útil em situações em que você tem informações espalhadas em um arquivo e o enfrentamento manual é propenso a erros e cansativos.

Primeiro limpe o registro que receberá as informações

:let @a=""

Em seguida, copie todas as linhas que contêm o padrão para ele

:g/pattern/yank A

Finalmente, transferir (copiar) as informações para a área de transferência do sistema

:let @+=@a

se você tentar copiar todas as linhas que contêm um "padrão" diretamente para a área de transferência, elas não funcionarão porque a área de transferência não tem capacidade para acrescentar novo conteúdo; portanto, estamos usando aqui um registro vim normal para armazenar todas as linhas que contêm o "padrão" padrão de uma só vez e depois colocá-lo na área de transferência.

OBS: É necessário clinar o registro antes de usá-lo, e o uso da versão UPPERCASE do registro nos permite anexar conteúdo, caso contrário ele também não funcionará.

SergioAraujo
fonte
0

Se você não consegue descobrir como chegar +clipboardao trabalho, o que eu não consegui por algum motivo, você pode fazer isso.

Supondo que você deseja copiar apenas uma seção do arquivo, eu faço shift+ vpara entrar no modo visual e destacar apenas as linhas que quero copiar. Então eu faço isso.

# Linux Wayland
:'<,'>w !wl-copy

# Linux Xorg
:'<,'>w !xclip -selection clipboard

Explicação

  • '<,'> - significa que você usou o modo visual para selecionar um intervalo (não digita isso)
  • w !{cmd}- escreva o intervalo para o stdin de cmd, veja mais em:help w_c
  • wl-copye xclipsão programas nos quais você pode canalizar texto e eles o adicionam à área de transferência do sistema

Além disso, quando isso estiver no seu histórico, você não precisará digitar tudo novamente. Basta selecionar com o modo visual, digite we pressione para cima e o comando deve ser preenchido automaticamente. Além disso, você também não precisa usar o modo visual. Você pode definir o alcance que desejar.

425nesp
fonte