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?
Comentários
Resposta
Para X11 sistemas baseados (ou seja, Linux e muitos outros UNIX sistemas semelhantes) existem duas pranchetas independentes uma da outra:
- PRIMÁRIA – Isso é cópia na seleção e pode ser colado com o botão do meio do mouse.
- CLIPBOARD – Isso é copiado com (geralmente)
^C
e colado com^V
(é como o MS Windows).
OS X e Os sistemas Windows têm apenas uma área de transferência.
Para X11 sistemas também existem várias ferramentas que sincronizam essas pranchetas para você; então, se elas parecerem iguais, você pode ter uma delas em execução.
O Vim tem dois registros especiais ters correspondentes a estas pranchetas:
-
*
usa PRIMARY; mnemônico: S tar é S eleger (para cópia em- s eleger) -
+
usa CLIPBOARD; mnemônico: CTRL MAIS C (para o atalho de teclado comum)
No Windows & OS X não há diferença entre +
e *
, uma vez que esses sistemas têm apenas um área de transferência e ambos os registros referem-se à 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 PRIMÁRIA *
com os comandos y
e p
:
-
"*yy
-
"*p
Talvez você possa usar isto como atalhos de teclado mais convenientes:
noremap <Leader>y "*y noremap <Leader>p "*p noremap <Leader>Y "+y noremap <Leader>P "+p
Se você deseja ” automaticamente ” fazer interface com o sistema “na área de transferência em vez de se referir a ela manualmente o tempo todo, você pode definir a variável clipboard
:
- Defina-o como
unnamed
para usar*
(PRIMÁRIO, na seleção) - Defina-o como
unnamedplus
para usar+
(CLIPBOARD,^C
)
Agora, apenas usar yy
irá para a área de transferência do sistema, em vez do registro sem nome do Vim “, e p
irá colar o sistema “s área de transferência.
Você também pode atribuir a esses registros como qualquer registro com let
:
-
:let @+=42
-
:let @*=42
O clipboard
configuração tem mais algumas opções (como filtros de exclusão); mas estes são os princípios básicos. Veja :help "clipboard"
para a história completa 😉
gVim
Se você usar o gVim, poderá obter o comportamento de cópia na seleção quando usando :set guioptions+=a
.
Isso é habilitado por padrão em sistemas X11 (cópias para PRIMARY), mas não em MS Windows & OSX (já que selecionar qualquer texto sobrescreveria sua área de transferência).
Não +clipboard
?
O Vim requer o +clipboard
sinalizador de recurso para que isso funcione; você pode verificar se seu Vim tem isso usando :echo has("clipboard")
de dentro do Vim (se a saída for 0
, ela “ não presente, se “s 1
, está) ou verificando a saída de vim --version
para +clipboard
.
A maioria das distribuições Linux vem com um ” mínimo ” compilação Vim por padrão, que não tem +clipboard
, mas geralmente você pode instalá-lo:
- Debian & Ubuntu: Instalar
vim-gtk3
. - Fedora: instale
vim-X11
e executevimx
em vez devim
( mais informações ). - Arch Linux: install
gvim
(isso ativará+clipboard
paravim
normal também).
Você também pode use xclip
, xcopy
ou xsel
para copiar texto para a área de transferência; veja o seguinte perguntas para soluções:
- Defina comandos personalizados para os registros * e +
- Como posso copiar em uma sessão SSH sem + clipe placa?
SSH
Você também pode usar uma área de transferência em máquinas remotas se habilitar o encaminhamento X11 por SSH. Isso é especialmente útil com a dica acima, pois você pode usar xclip
para acessar a área de transferência de sua área de trabalho. O Vim na máquina que você está procurando ainda precisará do +clipboard
recurso.
Isso requer a ForwardX11Trusted
configuração e deve ser feito apenas com servidores confiáveis , pois isso dá 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 em 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
O Neovim renovou o suporte da área de transferência. A interface integrada foi removida e substituída por um sistema que chama um utilitário externo, como xclip
, xsel
ou pbcopy
/ pbpaste
.
Deve autom pegar esses utilitários de forma atômica e usá-los. No OS X, pbcopy
e pbpaste
deve estar disponível por padrão, no Linux você provavelmente deseja instalar xclip
, já que é o mais amplamente disponível (na verdade existem duas versões de xsel
com sinalizadores incompatíveis . é realmente estúpido).
Veja também :help clipboard
em Neovim.
Comentários
- ssh -Y implica -X, portanto -X pode ser omitido.
- Um efeito colateral muito interessante de aprender isso (alguns anos atrás) para mim foi a constatação de que
"
pode selecionar muitos registros nomeados."+
não é mágico, ‘ s basta registrar+
. Então, por exemplo, se você deseja copiar três coisas ao mesmo tempo e colar cada uma delas uma por uma, você pode"1y
,"2y
e"3y
e l ater"1p
,"2p
e"3p
. Isso é realmente poderoso e inexistente em quase qualquer outro editor. Outro uso interessante é olhar para as macros armazenadas. Por exemplo, se você gravar comqq
, mas perceber que precisa corrigi-lo, você pode: em uma linha temporária"qp
, corrigir ele, e"qd
. - Apenas uma observação: o OS X tem duas pranchetas separadas. Um é acessado usando Cmd-C e Cmd-V e o outro usando os atalhos de teclado emacs Ctrl-K e Ctrl-Y.
- @shahbaz – provavelmente melhor usar os registradores de letras para tal propósito, uma vez que os numerados são alterados sempre que o texto é excluído.
- Copie & e cole conforme descrito na pergunta destina-se ao desktop. É verdade que a instalação do pacote
gvim
ao lado devim
oferece funcionalidades de área de transferência. mas em navegadores de arquivos são oferecidos dois editores de texto para abrir arquivos! E isso parece feio. É por isso que é melhor instalar apenas os pacotesvim
evim-gui-common
. Posteriormente, são fornecidas as funcionalidades da área de transferência sem a necessidade de instalargvim
. Isso está no Linux Debian 10.
Resposta
De http://vim.wikia.com/wiki/Accessing_the_system_clipboard
set clipboard=unnamedplus
Isso muda o registro Vim padrão para +
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")
Comentários
- Por que isso não funciona para mim quando yank & cola entre instâncias do vim (cada uma em um terminal terminator separado)?
- Se você estiver no Linux e o Vim tiver sido compilado com o recurso + X11, e você tiver o conjunto clipboard = unnamedplus, deverá ser capaz de puxar uma linha em uma instância do vim e colá-la em outra instância de vim. Você também deve conseguir colá-lo em qualquer outro aplicativo com CTRL + V ou SHIFT + INSERT. Você pode usar
: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ê estiver não no Linux, então você deve usar sem nome em vez de sem nome plus.
Resposta
As outras respostas cobrem como copiar texto de 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á puxou algum texto para "
(o registro padrão), você pode querer carregar esse registro na área de transferência.
Você pode faça isso com :let
:
-
let @+=@"
— copia o registro padrão para a área de transferência -
let @*=@"
— copia o registro padrão para a seleção primária X11 (“mouse área de transferência “) -
let @+=@a
— copiar do registroa
para a área de transferência - etc.
Observe que isso funciona para registros em geral: let @a=@b
copia o registro b
para registrar a
.
Resposta
Ativado compilações que o suportam, o registro denominado *
é a área de transferência do sistema. Para copiar texto do Vim para a área de transferência do sistema, você pode selecione o texto usando o modo visual e pressione "* y para copiá-lo para a área de transferência do sistema.
Por outro lado, use "* p para colar texto da área de transferência do sistema no Vim.
Resposta
Se você não consegue “descobrir como fazer +clipboard
funcionar, o que eu não pude por algum motivo, então você pode fazer isso.
Supondo que você deseja apenas copiar uma seção do arquivo, eu shift
+ v
para ir no modo visual e destaque apenas as linhas que desejo copiar. Então eu faço isso.
# Linux Wayland :"<,">w !wl-copy # Linux Xorg :"<,">w !xclip -selection clipboard
Explicação
-
"<,">
– significa você usou o modo visual para selecionar um intervalo (você não o digita) -
w !{cmd}
– escreva o intervalo no stdin decmd
, veja mais em:help w_c
-
wl-copy
exclip
são programas para os quais você pode enviar texto e eles vão adicioná-lo à área de transferência do sistema
Além disso, uma vez que isso está no seu histórico, você não precisa digitar tudo novamente. Basta selecionar com o modo visual, digitar w
e pressionar para cima e o comando deve ser preenchido automaticamente. Além disso, você não precisa usar o modo visual. Você pode definir o intervalo que quiser.
Comentários
- Votos positivos (sobre a outra resposta semelhante) porque esta dá uma explicação. A propósito, uma nota para mim ou para outros leitores: ao usar
xclip
, você NÃO precisa adicionar esse parâmetro-selection clipboard
, que é muito loooong para digitar. O:'<,'>w !xclip
padrão copiaria o conteúdo para o ” principal “, ou seja, cópia selecione a área de transferência, que pode ser colada com o botão do meio do mouse.
Resposta
Eu recomendo que você use o Gvim, e adicione isso ao seu .vimrc
:
source $VIMRUNTIME/mswin.vim behave mswin
Isso ativa o suporte para Ctrl C , Ctrl X , Ctrl V como o bloco de notas no Windows.
Observe que isso também adicionará alguns outros atalhos comuns do Windows, como Ctrl S para :w
, Ctrl A para selecionar tudo, etc.
Resposta
Eu estava lutando com a área de transferência do sistema e vim
dentro de tmux
.
Foi resolvido usando xsel
ou xclip
, como neste exemplo:
1.) visu almente selecione um bloco de texto no modo normal: V<motionkey>
2.a) com xsel
execute ex: :"<,">w !xsel -b
2.b) com xclip
execute ex: :"<,">w !xclip -selection clipboard
3.) cole em outro programa
… e agora nmap isto como preferido.
Estas opções (-b ou -selection clipboard) basicamente significam que o programa (xsel ou xclip) é enviado para o fundo e espera por outro programa para cole o conteúdo, para que possa “interferir”.
(em manjaro com i3, xfce4-terminal, tmux)
Resposta
Este é o comportamento Eu queria quando se tratava da área de transferência do sistema:
- Arrancar uma linha com nova linha funciona
- Arrancar uma linha sem nova linha funciona
- Arrancar o que quer que seja visual trabalhos selecionados
- Cortar trabalhos
- Cortar uma linha com trabalhos de nova linha
- Cortar uma linha sem trabalhos de nova linha
Por trabalhos Quer dizer: ainda consigo usar p
para colar enquanto estou no vim e também posso usar a área de transferência do sistema. Basicamente, quero que copiar e colar funcione conforme o esperado e não fiz ” não quero bagunçar a área de transferência do sistema mais do que o necessário.
Minha técnica era mapear os comandos comuns de puxar, cortar e excluir para usar a área de transferência do sistema adicionando essas linhas ao meu ~/.vimrc
:
" use system clipboard " https://anuragpeshne.github.io/essays/vim/7.html noremap y "*y noremap yy "*yy noremap Y "*y$ noremap x "*x noremap dd "*dd noremap D "*D
O insight principal de https://anuragpeshne.github.io/essays/vim/7.html a postagem do blog é:
Mapeamento recursivo é ruim, sempre use mapeamento não recursivo. (noremap)
Comentários
- O que
"
fazer? A primeira resposta já explicou para que serve*
, (referindo-se à área de transferência principal), mas eu não ‘ não vejo nenhuma explicação em qualquer lugar para para que serve"
e por que isso faz o comando funcionar. - Ele ‘ não é imediatamente óbvio porque você ‘ provavelmente é usado para a citação que está sendo usada para contornar palavras, como
"foo"
; no entanto, para vim"*
é realmente o nome do ” register ” (um vim conceito) que se conecta à área de transferência do sistema. Se você abrir o vim e digitar:registers
, poderá ver os nomes de outros registros como:""
,"0
,"1
e assim por diante. Achei este artigo útil para aprender sobre registros: brianstorti.com/vim-registers
Resposta
Se o seu vim não suportar +clipboard
, você pode usar o fakeclip plugin para Linux, Mac, Windows, tmux, screen, …
Resposta
Todas as outras respostas foram cobertas todas as coisas importantes sobre os registros. Gostaria de adicionar mais uma coisa que eu uso.
Existe uma maneira no Vim de copiar diretamente o selecionado visualmente texto na área de transferência. Basta colocar isso em seu arquivo vimrc :
set guioptions+=a
E, com isso, sempre que você selecionar visualmente algum texto, ele será copiado para o seu prancheta. Para obter mais informações sobre isso, :help guioptions
A propósito, isso é apenas para gVim.
Comentários
-
guioptions+=a
também é mencionado na ‘ resposta do Carpetsmoker. - @muru Sim, desculpe . Eu não ‘ não vi isso antes. Acabei de ver.
Resposta
Você também pode usar um comando global para colocar algum padrão específico no prancheta. Pode ser útil em situações em que você tem informações espalhadas em um arquivo e o enfrentamento manual está sujeito a erros e é cansativo.
Limpe primeiro o registro que receberá as informações
:let @a=""
Em seguida, copie todas as linhas contendo o padrão para ele
:g/pattern/yank A
Finalmente, transferindo (copiando) as informações para a área de transferência do sistema
:let @+=@a
se você tentar copiar todas as linhas contendo um “padrão” diretamente para a área de transferência, não funcionará porque a área de transferência não tem a capacidade de adicionar novos , portanto, estamos usando aqui um registro normal do vim para armazenar todas as linhas contendo o padrão de uma vez e depois colocá-lo na área de transferência.
OBS: É necessário limpar o registro antes de usá-lo, e o uso da versão em MAIÚSCULAS do registro nos permite acrescentar conteúdo, caso contrário, também não funcionará.
Resposta
MacVim Cmd + x/c/v
para cortar / copiar / colar
Se você usar MacVim, os Cmd+x/c/v
usuais são definidos em $ VIMRUNTIME / macmap.vim que é fornecido por padrão e, portanto, está disponível sem configuração:
vnoremap <special> <D-x> "+x vnoremap <special> <D-c> "+y cnoremap <special> <D-c> <C-Y> nnoremap <special> <D-v> "+gP cnoremap <special> <D-v> <C-R>+ execute "vnoremap <script> <special> <D-v>" paste#paste_cmd["v"] execute "inoremap <script> <special> <D-v>" paste#paste_cmd["i"]
No entanto, usá-los pode levar a um usuário do vim que não conhece o caminho do vim e se perdem em um computador / ambiente estranho.
cpip
,cpi{
.sed
:).sed -n 5p file
; apenas 5ª linha.sed -n -e 5p -e 8p file
; apenas 5ª e 6ª linhas.sed -n 5,8p file
; linhas entre 5 e 8. Ele irá imprimir as linhas no console. Você pode copiar facilmente selecionando o texto.