Obtendo o tmux para copiar um buffer para a área de transferência

114

Eu estou tentando descobrir uma maneira decente de copiar o que eu 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

que me deixa bastante perto, tudo o que tenho que fazer é pressionar Ctrl-d depois de fazer 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. Na verdade, se eu emparelhar isso para apenas

bind-key p select-pane -t 2 \; split-window 'xsel -i -b << HERE'

não faz nada, por isso suponho que a janela dividida não goste < < em um comando shell.

Alguma idéia?

Editar: Você pode pular o select-pane -t 2 , se quiser, não é realmente importante. Acabei de usar um layout específico e o painel 2 é o que eu prefiro dividir quando faço outra coisa, de modo que entra em meus bindings envolvendo splits por padrão.

    
por Digital Powers 27.06.2011 / 22:14

16 respostas

24

Aqui, os documentos precisam de novas linhas. Por exemplo, em um script de shell, você pode escrever

cat <<EOF >somefile; echo  done
file contents
EOF

Eu não acho que o tmux permite que você coloque novas linhas lá, e mesmo que isso acontecesse, isso não seria uma boa abordagem. E se os dados em si contiverem HERE sozinho em uma linha (por exemplo, porque você está copiando seu .tmux.conf )?

Sugiro gravar o conteúdo do buffer em um arquivo temporário. Não testado:

bind-key p save-buffer ~/.tmux-buffer \; run-shell "xsel -i -b <~/.tmux-buffer && rm ~/.tmux-buffer"

Há uma condição de corrida se você usar esse comando em duas instâncias do tmux separadas. Eu não sei como resolver isso.

    
por 27.06.2011 / 22:47
91

Isso deve funcionar:

# move x clipboard into tmux paste buffer
bind C-p run "tmux set-buffer \"$(xclip -o)\"; tmux paste-buffer"
# move tmux copy buffer into x clipboard
bind C-y run "tmux save-buffer - | xclip -i"
    
por 10.07.2011 / 17:11
40

Uma solução mais simples para o Mac OS-X

Isso se baseia na resposta de Alex e usa coisas que não existiam na época.

Se você está usando homebrew (e se você não está, por que não está?), então você pode faça isso:

brew install reattach-to-user-namespace

Em seguida, no seu ~/.tmux.conf :

set-option -g default-command "reattach-to-user-namespace -l zsh" # or bash...
bind C-c run "tmux save-buffer - | reattach-to-user-namespace pbcopy"
bind C-v run "reattach-to-user-namespace pbpaste | tmux load-buffer - && tmux paste-buffer"

Para copiar o buffer do tmux (você já deve ter copiado algo usando o tmux) para o Mac pasteboard, use <tmux-key> Control-c . Agora ele estará disponível para Command-v ou pbpaste

Para colar algo da pasta do Mac, use <tmux-key> Control-v .

    
por 23.02.2012 / 04:37
38

O comando copy-pipe foi adicionado a partir da versão 1.8. Ele copia uma seleção para o buffer tmux e canaliza para um comando. Agora não há necessidade de uma ligação de prefixo. Aqui está um exemplo:

bind -t vi-copy y copy-pipe "xclip"

# For OS X users:
bind -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"

Agora, quando você tiver algum texto selecionado em copy-mode , y copiará esse texto para o buffer do tmux, bem como para a área de transferência do OS. No entanto, não ajuda se você deseja obter texto da área de transferência para o buffer do tmux.

    
por 01.04.2013 / 21:11
15

Você pode querer tentar plugin do tmux-yank . Ele permite copiar diretamente para a área de transferência do sistema (OS X e Linux) e alguns outros itens, como puxar a linha shell atual.

    
por 28.08.2014 / 14:03
8

Depois de tentar uma solução diferente, aqui está minha configuração final:

# move x clipboard into tmux paste buffer
bind C-p run "xclip -o | tmux load-buffer -
# move tmux copy buffer into x clipboard
bind C-y run "tmux save-buffer - | xclip -i -selection clipboard"

usando save-buffer em vez de show-buffer fornece os dados reais sem os dados como mostrado com quebras de linha quando você está em divisões.

Eu também uso isso para começar a seleção / cópia no modo de cópia do tmux:

bind-key -t vi-copy 'v' begin-selection
bind-key -t vi-copy 'y' copy-selection

Eu acho que seria possível mesclar a seleção de cópia com a tecla 'y' E movê-la para a área de transferência x.

    
por 19.04.2012 / 21:18
6

Eu não gosto de ter teclas extras, então queria algo mais ambicioso. Entre no modo de cópia com [ destaque o texto correto e pressione] para copiar o texto para a área de transferência.

Além disso, o tmux gosta de incluir novas linhas nas expressões que envolvem (e, estranhamente, essas novas linhas estão no lugar errado ! Elas não estão onde a expressão foi envolvida na tela). Então eu queria que C-] copiasse a expressão removendo as novas linhas.

No tmux 1.6 eu tentei isso:

bind [ copy-mode
bind -t vi-copy ] run "tmux send-keys Enter; tmux show-buffer | xclip -i -selection clipboard;"
bind -t vi-copy C-] run "tmux send-keys Enter; tmux show-buffer | perl -pe 's/\n//' | xclip -i -selection clipboard;"

mas isso não funcionou porque o tmux não parece feliz em ligar coisas complexas à tabela do vi-copy. Então acabei fazendo isso em vez disso:

bind [ copy-mode \;                                                        \
    bind -n ] run                                                          \
    "tmux send-keys Enter;                                                 \
     tmux show-buffer | xclip -i -selection clipboard;                     \
     tmux unbind -n C-];                                                   \
     tmux unbind -n ]" \;                                                  \
    bind -n C-] run                                                        \
    "tmux send-keys Enter;                                                 \
     tmux show-buffer | perl -pe 's/\n//' | xclip -i -selection clipboard; \
     tmux unbind -n C-];                                                   \
     tmux unbind -n ]"

Isto 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 pode ser corrigido com mais ligações, imagino, mas isso faz o que eu quero na maior parte do tempo.

    
por 02.08.2012 / 21:36
5

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), copiar texto do Tmux para a área de transferência tinha que ser um processo de duas etapas, primeiro copiar o texto selecionado para o buffer do Tmux e copiar o texto do buffer do Tmux para a área de transferência do sistema .

Na versão 1.8 (março de 2013), o comando copy-pipe foi adicionado, permitindo que você copie o texto selecionado diretamente para a área de transferência do sistema (ou outro destino).

Em seguida, em 2.4 (abril de 2017), as tabelas de chaves foram significativamente alteradas tornando obsoletas muitas das respostas nesta página.

Respondendo a pergunta original

Linux :

bind-key C-y run-shell "tmux save-buffer - | xclip -i -r > /dev/null" \; display-message "Copied tmux buffer to selection"
bind-key C-Y run-shell "tmux save-buffer - | xclip -i -r -selection clipboard > /dev/null" \; display-message "Copied tmux buffer to clipboard"
bind-key C-p run-shell "xclip -o | tmux load-buffer - ; tmux paste-buffer"

Mac :

Se você estiver usando o homebrew , instale o reattach-to-user-namespace executando o seguinte comando em um terminal:

brew install reattach-to-user-namespace

Em seguida, no seu ~ / .tmux.conf:

bind-key C-y run-shell "tmux save-buffer - | reattach-to-user-namespace pbcopy" \; display-message "Copied tmux buffer to clipboard"
bind-key C-p run-shell "reattach-to-user-namespace pbpaste | tmux load-buffer - ; tmux paste-buffer"

O Método Shorter (copie e cole uma seleção diretamente de e para a área de transferência para o tmux > 2.4)

Nota: existem duas versões para o Linux porque o Linux possui uma área de transferência primária e secundária (também conhecida como seleção).

Linux :

bind-key -T copy-mode-vi y send-keys -X copy-pipe "xclip -r" \; display-message "Copied to selection"
bind-key -T copy-mode-vi Y send-keys -X copy-pipe "xclip -r -selection clipboard" \; display-message "Copied to clipboard"
bind-key C-p run-shell "xclip -o | tmux load-buffer - && tmux paste-buffer"

Mac :

bind-key -T copy-mode-vi y send-keys -X copy-pipe "reattach-to-user-namespace pbcopy" \; display-message "Copied to clipboard"

Personalizando esses comandos

Se você não quiser que o comando diga o que ele fez na linha de status, basta remover o display-message (assim como o \; que vem antes dele).

Se você estiver usando o modo de cópia do estilo Emacs em vez de vi, substitua qualquer instância de copy-mode-vi apenas por copy-mode

Se você estiver executando o Linux e desejar usar xsel em vez de xclip replace xclip -r com xsel -i -p e xclip -o com xsel -o -p

O -r em xclip -r é opcional e remove a última nova linha. É útil para copiar comandos e, quando você colá-los, eles não serão executados imediatamente.

Se você estiver realizando um tunelamento sobre o SSH, consulte o link

Referências:

  • link
    • Sem > /dev/null , a cópia do buffer do tmux para a área de transferência fará com que o tmux não responda a atalhos
  • link
    • personalizações do Mac
por 09.12.2017 / 21:45
4

Há uma solução no Wiki do Arco usando xclip :

# move tmux copy buffer into x clipboard
bind-key C-y save-buffer /tmp/tmux-buffer \; run-shell "cat /tmp/tmux-buffer | xclip"

link

    
por 27.06.2011 / 22:51
3

Uma solução para o Mac OS X. Siga estes dois passos:

  1. Use a solução alternativa de Chris Johnsen: link

  2. Adicione este código à sua configuração do tmux (~ / .tmux.conf)

# paste clipboard into tmux buffer
bind v run-shell "reattach-to-user-namespace -l zsh -c 'tmux set-buffer \"$(pbpaste)\"; tmux paste-buffer'"
# put tmux buffer into x clipboard
bind y run-shell "reattach-to-user-namespace -l zsh -c 'tmux show-buffer | pbcopy'"

    
por 07.09.2011 / 05:45
3

Uma variante ligeiramente modificada da resposta aceita, que eu criei.

Eu também prefiro usar a área de transferência do sistema (Ctrl-C, Ctrl-V) além da área de transferência padrão primary do xclip (aquela que você obtém com a seleção do mouse e os cliques médios do mouse). Para escolher a área de transferência do sistema, você precisa passar o argumento -selection clipboard para xclip .

Além disso, ao copiar um buffer em uma área de transferência, gosto da capacidade de escolher qual buffer eu quero copiar. Isso é feito usando choose-buffer e, em seguida, passando o buffer do argumento para save-buffer usando -b %% .

# Copy into clipboard
bind C-c choose-buffer "run \"tmux save-buffer -b %% - | xclip -i -selection clipboard\""
# Paste from clipboard
bind C-v run "xclip -o -selection clipboard | tmux load-buffer - ; tmux paste-buffer"
# Copy into primary
bind C-y choose-buffer "run \"tmux save-buffer -b %% - | xclip -i \""
# Paste from primary
bind C-p run "xclip -o | tmux load-buffer - ; tmux paste-buffer"

UPDATE: 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 xclip lendo stdin sobre um pipe. Em vez disso, decidi experimentar o xsel e isso parece funcionar. Essas são as ligações de chave equivalentes usando xsel . Também usei && para encadear os comandos na pasta para obter mais robustez.

# Copy into clipboard
bind C-c choose-buffer "run \"tmux save-buffer -b '%%' - | xsel -i -b\""
# Paste from clipboard
bind C-v run "xsel -o -b | tmux load-buffer - && tmux paste-buffer"
# Copy into primary
bind C-y choose-buffer "run \"tmux save-buffer -b '%%' - | xsel -i\""
# Paste from primary
bind C-p run "xsel -o | tmux load-buffer - && tmux paste-buffer"
    
por 09.04.2013 / 05:15
3

Esta é a minha resposta bastante longa que deve corrigir dois problemas principais com o uso do xclip para copiar o buffer de uma sessão do tmux remota (ssh):

1. Xclip irresponsivo

Para mim, a resposta do Grauwolf com xclip não funcionou (torna o painel tmux totalmente irresponsável). Descobri porque na página do Tmux do wiki do Arch :

xclip could also be used for that purpose, unlike xsel it works better on printing raw bitstream that doesn't fit the current locale. Nevertheless, it is neater to use xsel instead of xclip, because xclip does not close STDOUT after it has read from tmux's buffer. As such, tmux doesn't know that the copy task has completed, and continues to wait for xclip's termination, thereby rendering tmux unresponsive. A workaround is to redirect STDOUT of xclip to /dev/null

Portanto, a ligação deve ser:

bind-key C-y run "tmux save-buffer - | xclip -i -sel clip > /dev/null"

Agora, isso funcionará se sua sessão do tmux for local.

2. xclip incapaz de se conectar a X

Se você estiver usando o tmux sobre o ssh -X , há grandes chances de que o não funcione diretamente.

Isso porque a variável do 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 :

set-option -g update-environment "DISPLAY"
bind-key C-y run "export DISPLAY='tmux show-env | sed -n 's/^DISPLAY=//p''; tmux save-buffer - | xclip -i -selection clipboard >/dev/null"
# Or more concise:
bind-key C-y run "tmux save-buffer - | xclip -i -selection clipboard -d 'tmux show-env | sed -n 's/^DISPLAY=//p'' >/dev/null

Para colar do primário:

bind-key C-p run "xclip -d 'tmux show-env | sed -n s/^DISPLAY=//p' -o | tmux load-buffer - && tmux paste-buffer"

Não entendo totalmente por que $DISPLAY não está definido corretamente ao pesquisar .tmux.conf , por isso preciso extraí-lo com tmux show-env e sed .

Se você tem tmux > = 1.8, você pode adaptar este comando com copy-pipe :

bind-key -t vi-copy y copy-pipe 'xclip -in -selection clipboard -d 'tmux show-env | sed -n s/^DISPLAY=//p' >/dev/null'
    
por 29.03.2017 / 15:36
2

I am trying to figure out a decent way to copy what I have in a tmux buffer into my clipboard. I have tried a couple of different things like

Para ligações de estilo emacs, existem algumas opções diferentes. (Estilo Vi deve ser similar?) A ligação típica para fazer "seleção de cópia" no emacs é M-w, então seria muito conveniente ter a mesma ligação no tmux.

1 - Seria ideal, mas não funciona (devido à limitação do tmux?)

unbind-key -t emacs-copy M-w
bind-key -t emacs-copy M-w copy-selection\; \
  run-shell "tmux save-buffer - | xsel --input --clipboard"

2 - Compromisso que funciona bem para mim : Aceite usar um atalho diferente para o emacs-copy no tmux. Use por exemplo C-M-w. (Esta ligação que será definida "globalmente" - não apenas no modo de cópia - mas apenas útil no modo de cópia)

bind-key -n C-M-w send-keys M-w\; \
 run-shell "tmux save-buffer - | xsel --input --clipboard" 
    
por 09.02.2013 / 00:36
2

Muitas dessas respostas não funcionaram para o meu Ubuntu 14.04 no zsh como estão. Não tenho certeza se o meu shell tinha alguma coisa a ver com isso, mas aqui está a minha versão de trabalho de usar esta estratégia para cópia e esta estratégia para colar.

    bind-key -t vi-copy 'v' begin-selection
    bind-key -t vi-copy 'y' copy-pipe "xclip -sel clip -i"
    bind-key ] run-shell "xclip -sel clip -o | tmux load-buffer - ; tmux paste-buffer" 

Algumas notas:

  • para copy-pipe, eu precisava especificar minha área de transferência com -sel clip -i . Essa linha combina o buffer do yank para o tmux e o envia para o xclip.
  • para colá-lo, precisei especificar novamente a área de transferência com -sel clip -o

Isso funciona lindamente agora para a configuração do vim / zsh / tmux.

    
por 10.06.2014 / 23:06
0

E a versão melhorada da resposta do @Leif poderia ser:

tmux bind-key '[' run "tmux copy-mode;
tmux bind-key -n ']' run \"tmux send-keys Enter; tmux save-buffer - | xclip -i -selection clipboard;
tmux unbind-key -n ']'\";
tmux bind-key -n q run \"tmux unbind -n ']'; tmux send-keys q\";
tmux bind-key -n C-c run \"tmux unbind -n ']'; tmux send-keys C-c\""

Desta forma, não há consequências se você sair do modo de cópia de outra maneira além de], o código acima é empacotado em tundle / tmux-yank um plugin do tmux para copiar texto do tmux para a área de transferência do sistema, ele atinge o tmux > = 1.6 no Mac OS X e Linux.

    
por 05.07.2015 / 21:00
0

No OS-X com o tmux versão 2.2 ou posterior, o seguinte funcionará:

bind-key -t emacs-copy MouseDragEnd1Pane copy-pipe "pbcopy"
bind-key -t vi-copy MouseDragEnd1Pane copy-pipe "pbcopy"
    
por 02.05.2016 / 21:49