Estou tentando descobrir uma maneira decente de copiar o que tenho em um buffer tmux na minha área de transferência. Eu tentei algumas coisas diferentes, como
bind-key p select-pane -t 2 \; split-window 'xsel -i -b' \; paste-buffer
o que me aproxima bastante, tudo o que preciso fazer é pressionar control-d após executar o prefixo-p.
Eu tentei consertar isso fazendo
bind-key p select-pane -t 2 \; split-window 'xsel -i -b << HERE\; tmux paste-buffer\; echo HERE'
Mas isso simplesmente não funciona. De fato, se eu juntar isso a apenas
bind-key p select-pane -t 2 \; split-window 'xsel -i -b << HERE'
não faz nada, então estou assumindo que a janela dividida não gosta de << em um comando shell.
Alguma ideia?
Edit: Você pode pular o select-pane -t 2
se quiser, não é realmente importante. Eu apenas uso um layout específico e o painel 2 é o que eu prefiro dividir quando faço outra coisa, de modo que entre minhas ligações envolvendo divisões por padrão.
keyboard-shortcuts
tmux
clipboard
xclip
Poderes Digitais
fonte
fonte
Respostas:
Aqui, os documentos precisam de novas linhas. Por exemplo, em um script de shell, você pode escrever
Eu não acho que o tmux permita que você coloque novas linhas lá, e mesmo que isso acontecesse, essa não seria uma boa abordagem. E se os dados em si contiverem
HERE
sozinhos em uma linha (por exemplo, porque você está copiando seus.tmux.conf
)?Sugiro escrever o conteúdo do buffer em um arquivo temporário. Não testado:
Há uma condição de corrida se você usar este comando em duas instâncias tmux separadas. Não sei como resolver isso.
fonte
mktemp
o que está amplamente disponível$PPID
em um shell lançado pelo tmux). Mas como você obtém o nome do arquivo variável (no entanto, ele é construído) no argumento desave-buffer
? Acho que,save-buffer - | …
como na resposta de Grauwolf , que acaba com um arquivo temporário?Isso deve funcionar:
fonte
TMUX
variáveis de ambiente.C-p
seria:bind C-p run "xclip -o | tmux load-buffer - ; tmux paste-buffer"
- sem problemas de citação ou limite de linha de comando.copy-mode
?xclip -o
opção não trabalhou para mim, então eu mudei parabind C-c run "tmux save-buffer - | xclip -selection c"\; display-message "Buffer copied to clipboard"
Uma solução mais simples para Mac OS-X
Isso se baseia na resposta de Alex e usa coisas que não existiam na época.
Se você estiver usando homebrew (e se não estiver, por que não está?), Poderá fazer o seguinte:
Então no seu
~/.tmux.conf
:Para copiar o buffer do tmux (você já deve ter copiado algo usando o tmux) na área de trabalho do Mac, use
<tmux-key> Control-c
. Agora estará disponível paraCommand-v
oupbpaste
Para colar algo da área de trabalho do Mac, use
<tmux-key> Control-v
.fonte
tmux show-buffer
que causou problemas de quebra de linhatmux save-buffer -
resolvidos.-
final detmux save-buffer -
?save-buffer
to stdout. Você pode substituir-
por um nome de arquivo e ele será salvo lá. Isso impede que você grave (e precise limpar) um arquivo.O
copy-pipe
comando foi adicionado a partir da versão 1.8. Ele copia uma seleção para o buffer tmux e a envia para um comando. Agora não há necessidade de uma ligação de prefixo. Aqui está um exemplo:Agora, quando você tiver selecionado algum texto
copy-mode
, ycopiará esse texto para o buffer tmux, bem como para a área de transferência do SO. No entanto, não ajuda se você deseja obter texto da área de transferência para o buffer tmux.fonte
reattach-to-user-namespace
não é necessário.bind-key -T copy-mode-vi y send-keys -X copy-pipe "xclip"
e para o OS X:bind-key -T copy-mode-vi y send-keys -X copy-pipe "reattach-to-user-namespace pbcopy"
Você pode tentar o plugin tmux-yank . Permite copiar diretamente para a área de transferência do sistema (OS X e Linux) e algumas outras vantagens, como puxar a linha de shell atual.
fonte
Depois de tentar uma solução diferente, aqui está minha configuração final:
o uso de save-buffer em vez de show-buffer fornece os dados reais sem os dados, como mostra as quebras de linha quando você está dividido.
Também uso isso para iniciar a seleção / cópia no modo de cópia tmux:
Acho que seria possível mesclar a seleção de cópias com a tecla 'y' E movê-la para a área de transferência x.
fonte
Aqui está uma tentativa de uma resposta abrangente.
Primeiro um pouco de história
Quando esta pergunta foi feita pela primeira vez (junho de 2011), a cópia de texto do Tmux para a área de transferência tinha que ser um processo de duas etapas, primeiro copie o texto selecionado para o buffer do Tmux e, em seguida, copie o texto do buffer do Tmux para a área de transferência do sistema.
Em 1.8 (março de 2013),
copy-pipe
foi adicionado o comando que permite copiar o texto selecionado diretamente na área de transferência do sistema (ou outro destino).Então, em 2.4 (abril de 2017), as tabelas principais foram alteradas significativamente, tornando obsoletas muitas das respostas nesta página.
Respondendo à pergunta original
Linux :
Mac :
Se você estiver usando o homebrew , instale-o
reattach-to-user-namespace
executando o seguinte comando em um terminal:Depois, no seu ~ / .tmux.conf:
O método mais curto (copie e cole uma seleção diretamente de e para a área de transferência do tmux> 2.4)
Nota: existem duas versões para Linux porque o Linux possui uma área de transferência primária e secundária (também conhecida como seleção).
Linux :
Mac :
Customizando esses comandos
Se você não deseja que o comando lhe diga o que ele fez na linha de status, remova o
display-message
(assim como o\;
que vem antes dele).Se você estiver usando o modo de cópia no estilo Emacs em vez de vi, substitua qualquer instância de
copy-mode-vi
porcopy-mode
Se você estiver executando o Linux e quiser usar, em
xsel
vez dexclip
substituirxclip -r
porxsel -i -p
exclip -o
comxsel -o -p
O
-r
inxclip -r
é opcional, ele remove a última nova linha. É útil para copiar comandos, quando você os cola, eles não serão executados imediatamente.Se você estiver encapsulando o SSH, consulte https://unix.stackexchange.com/a/354581/14252
Referências:
> /dev/null
copiar o buffer tmux para a área de transferência, o tmux não responderá aos atalhosfonte
bind-key C-p run-shell "xclip -o | tmux load-buffer - ; tmux paste-buffer"
ainda é válido? fortmux>2.4
Não gosto de pressionar teclas adicionais, então queria algo mais ambicioso. Entre no modo de cópia com [, realce o texto à direita e pressione] para copiar o texto na área de transferência.
Além disso, o tmux gosta de incluir novas linhas nas expressões que quebram (e estranhamente essas novas linhas estão no lugar errado ! Elas não estão onde a expressão está quebrada na tela). Então, eu queria que C-] copiasse a expressão removendo as novas linhas.
No tmux 1.6, tentei o seguinte:
mas isso não funcionou porque o tmux não parece feliz em vincular coisas complexas à tabela vi-copy. Então acabei fazendo isso:
Isso leva a coisas estranhas (] ou C-] agirão engraçadas na próxima vez que você as usar, mas apenas uma vez) se você sair do modo de cópia de outra maneira além de] ou C-]. Isso poderia ser corrigido com mais algumas ligações, imagino, mas isso faz o que quero na maioria das vezes.
fonte
Existe uma solução no Arch Wiki usando
xclip
:https://wiki.archlinux.org/index.php/Tmux
fonte
save-buffer
arquivo com segurança em um diretório compartilhado? Caso contrário, colocá-lo/tmp
é uma falha de segurança. Há um uso inútilcat
e a remoção do arquivo temporário está ausente. Então é uma questão dexsel
vsxclip
, que é equivalente aqui, e você tem minha solução (escrita indenpendentemente).Uma solução para o Mac OS X. Siga estas 2 etapas:
Use a solução alternativa de Chris Johnsen: https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard
Adicione este código à sua configuração tmux (~ / .tmux.conf)
fonte
Uma variante ligeiramente modificada da resposta aceita, que eu preparei.
Também prefiro usar a área de transferência do sistema (Ctrl-C, Ctrl-V), além da
primary
área de transferência padrão do xclip (aquela que você obtém com a seleção do mouse e os cliques do meio do mouse). Para escolher a área de transferência do sistema, você precisa passar o-selection clipboard
argumento paraxclip
.Além disso, ao copiar um buffer para uma área de transferência, gosto da capacidade de escolher qual buffer quero copiar. Ele é feito usando
choose-buffer
e, em seguida, passando tamponar o argumento parasave-buffer
usar-b %%
.ATUALIZAÇÃO: De alguma forma, com o tmux 1.8 e duas das minhas instalações do openSUSE 12.2, vejo um travamento quando
tmux run-shell
é invocado com axclip
leitura de stdin sobre um pipe. Em vez disso, decidixsel
tentar e isso parece funcionar. Essas são as ligações de teclas equivalentes usandoxsel
. Eu também costumava&&
encadear os comandos em pasta para obter mais robustez.fonte
Esta é minha resposta bastante demorada que deve corrigir dois grandes problemas com o uso do xclip para copiar o buffer de uma sessão remota (ssh) tmux:
1. xclip sem resposta
Para mim, a resposta de Grauwolf com
xclip
não funcionou (torna o painel tmux totalmente irresponsivo). Eu descobri o porquê na página Tmux do wiki do Arch :Portanto, a ligação deve ser:
Agora, isso funcionará se a sua sessão do tmux for local.
2. xclip incapaz de se conectar ao X
Se você estiver usando o tmux over ssh -X , há grandes chances de isso não funcionar diretamente.
Isso ocorre porque a variável shell
$DISPLAY
precisa ser definida corretamente.Solução completa
Então, para mim, a solução de trabalho completa é colocar as seguintes linhas no meu
~/.tmux.conf
:Para colar do primário:
Eu não entendo completamente por que
$DISPLAY
não está definido corretamente durante a fonte.tmux.conf
, então é por isso que tenho que extraí-lo comtmux show-env
esed
.Se você possui tmux> = 1.8, pode adaptar este comando com
copy-pipe
:fonte
/home/linux/.tmux.conf:11: invalid or unknown command: bind-key C-y run "tmux save-buffer - | xclip -i -selection clipboard -d `tmux show-env | sed -n 's[0/0] PLAY=//p'` >/dev/null
sed
comando que você mostra não é o mesmo que eu escrevi ... Foi isso que você escreveu no seu.tmux.conf
?sed
? O comando deve ser:sed -n s/^DISPLAY=//p
. Alternativamente, você poderia usarcut
:tmux show-env DISPLAY | cut -d'=' -f2
. Também pode valer a pena conferir sua versão do tmux.Para ligações no estilo emacs, existem algumas opções diferentes. (O estilo Vi deve ser semelhante?) A ligação típica para fazer "seleção de cópia" no emacs é Mw, portanto, seria muito conveniente ter a mesma ligação no tmux.
1 - Seria ideal, mas não funciona (devido à limitação do tmux?)
2 - Comprometimento que funciona bem para mim : aceite usar uma combinação de teclas diferente para o emacs-copy no tmux. Use, por exemplo, CMw. (Essa ligação será definida "globalmente" - não apenas no modo de cópia - mas apenas útil no modo de cópia)
fonte
Muitas dessas respostas não funcionaram no meu Ubuntu 14.04 no zsh como está. Não tenho certeza se meu shell teve algo a ver com isso, mas aqui está minha versão de trabalho do uso dessa estratégia para copiar e dessa estratégia para colar.
Algumas notas:
-sel clip -i
. Essa linha combina o buffer do yank para o tmux e o envia para o xclip.-sel clip -o
Isso funciona muito bem agora para minha configuração do vim / zsh / tmux.
fonte
-sel clip -i
resolve o problema. Embora, eu não entendo por que você precisa especificar prancheta novamente para colá-lo (padrão]
funciona para mim)E a versão melhorada da resposta @ Leif poderia ser:
Dessa forma, não há consequências se você sair do modo de cópia de outra maneira, além de], o código acima está envolto em tundle / tmux-yank, um plugin tmux para copiar texto do tmux na área de transferência do sistema, ele tem como alvo tmux> = 1.6 no OS X e Linux.
fonte
No OS-X com tmux versão 2.2 ou posterior, o seguinte funcionará:
fonte
Eu uso
copyq
um gerenciador de área de transferência de várias linhas. (Funciona com Windows, OSX, Linux.)Adicione as seguintes linhas em
~/.tmux.conf
:cygwin
exigecopyq.exe
localização em~/.bashrc
:fonte