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?
cpip
, cpi{
.
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?
cpip
, cpi{
.
Respostas:
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:
^C
e 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 y
e 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 clipboard
variável:
unnamed
para usar *
(PRIMARY, ao selecionar)unnamedplus
para usar +
(CLIPBOARD, ^C
)Agora, apenas o uso yy
irá para a área de transferência do sistema, em vez do registro sem nome do Vim, e p
colará 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 clipboard
configuração tem mais algumas opções (como excluir filtros); mas estes são os princípios. Veja :help 'clipboard'
a história completa ;-)
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).
+clipboard
?O Vim requer o +clipboard
sinalizador 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 --version
para +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:
vim-gtk
ou vim-gnome
.vim-X11
e execute em vimx
vez de vim
( mais informações ).gvim
(isso também permitirá o +clipboard
normal vim
).Você também pode usar xclip
,, xcopy
ou xsel
para copiar texto para a área de transferência; veja as seguintes perguntas para soluções:
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
xclip
para acessar a área de transferência da área de trabalho. O Vim na máquina para a qual você está trabalhando ainda precisará do +clipboard
recurso.
Isso requer a ForwardX11Trusted
configuraçã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 -XY
todas 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 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 pbpaste
deve 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 xsel
com bandeiras incompatíveis . Este é realmente estúpido).
Veja também :help clipboard
em Neovim.
"<Space>
para obter um "
. Então, nesse caso, você teria que pressionar "<Space>+y
ou "<Space>*y
copiar.
"
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
, "2y
e "3y
mais tarde "1p
, "2p
e "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
.
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êncialet @*=@"
- copia o registro padrão na seleção principal do X11 ("área de transferência do mouse")let @+=@a
- copiar do registro a
para a área de transferênciaObserve que isso funciona para registros em geral: let @a=@b
cópias registram b
para registrar a
.
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')
:version
no 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.
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.
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.
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.
guioptions+=a
também é mencionado na resposta de Carpetsmoker.
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á.
Se você não consegue descobrir como chegar +clipboard
ao 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
+ v
para 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-copy
e xclip
são programas nos quais você pode canalizar texto e eles o adicionam à área de transferência do sistemaAlém disso, quando isso estiver no seu histórico, você não precisará digitar tudo novamente. Basta selecionar com o modo visual, digite w
e 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.