Copiar seleção para uma área de transferência no tmux

22

Se eu selecionar texto com um mouse no tmux no iTerm2 no macOS, o texto selecionado será copiado na minha área de transferência. Não preciso clicar em nenhum botão extra - basta selecionar o texto que você deseja e pronto.

Testei o tmux no terminal.app no ​​macOS, mas ele não funciona lá - tenho que clicar ypara copiar a seleção para a minha área de transferência.

Eu pensei que existe uma ligação do mouse (algo MouseOnSelectionsemelhante a MouseDown1Pane), mas não consegui encontrar nada útil na Web e man tmux.

Gostaria de saber se existe uma maneira de ter um comportamento semelhante no Ubuntu 16.10 - de preferência no terminal Gnome.

Meus arquivos dotux tmux estão disponíveis aqui (link) .

Mateusz Piotrowski
fonte

Respostas:

44

Tmux 2.4+ com ligações no modo de cópia vi e xclip :

set-option -g mouse on
set-option -s set-clipboard off
bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "xclip -se c -i"

Para versões mais antigas do tmux, ligações do modo de cópia do emacs (o padrão) ou plataformas não-X (ou seja, sem xclip), consulte a explicação abaixo.


Explicação: Primeiro, precisamos ativar a opção do mouse para que o tmux capture o mouse e vamos vincular os eventos do mouse:

set-option -g mouse on

O Gnome-terminal não suporta a configuração da área de transferência usando sequências de escape xterm, portanto, devemos garantir que a set-clipboardopção esteja desativada:

set-option -s set-clipboard off

Esta opção pode ser suportada e ativada por padrão no iTerm2 (consulte set-clipboardo manual do tmux), o que explicaria o comportamento lá.

Podemos então vincular a MouseDragEnd1Pane"chave" do modo de cópia , ou seja, quando o primeiro botão do mouse é liberado após clicar e arrastar em um painel, para um comando tmux que pega a seleção atual do modo de cópia (feita pela ligação padrão para MouseDrag1Pane) e o canaliza para um comando shell. Este comando tmux era copy-pipeanterior ao tmux 2.4 e desde então foi alterado para send-keys -X copy-pipe[-and-cancel]. Quanto ao comando shell, precisamos simplesmente de algo que defina o conteúdo da área de transferência do sistema para o que for canalizado para ela; O xclip é usado para fazer isso nos seguintes comandos. Algumas substituições equivalentes "xclip -selection clipboard -i"abaixo em plataformas não-X são "wl-copy"(Wayland), "pbcopy"(macOS), "clip.exe"(Windows, WSL) e "cat /dev/clipboard"(Cygwin, MinGW).

Tmux 2.4+:

# For vi copy mode bindings
bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "xclip -selection clipboard -i"
# For emacs copy mode bindings
bind-key -T copy-mode MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "xclip -selection clipboard -i"

Tmux 2.2 a 2.4:

# For vi copy mode bindings
bind-key -t vi-copy MouseDragEnd1Pane copy-pipe "xclip -selection clipboard -i"
# For emacs copy mode bindings
bind-key -t emacs-copy MouseDragEnd1Pane copy-pipe "xclip -selection clipboard -i"

Antes do tmux 2.2:

O suporte para copiar após arrastar o mouse foi adicionado originalmente no Tmux 1.3, configurando a nova mode-mouseopção para on. O Tmux 2.1 alterou o suporte do mouse para as ligações de teclas familiares do mouse, mas não tinha DragEndligações, que foram introduzidas na 2.2. Portanto, antes da versão 2.2, acredito que o único método de definir a área de transferência do sistema ao arrastar o mouse era através do uso interno de sequências de escape xterm (a set-clipboardopção). Isso significa que é necessário atualizar para pelo menos o tmux 2.2 para obter o comportamento de arrastar e copiar para terminais que não suportam set-clipboard, como o GNOME Terminal.

Josh Brobst
fonte
3
Esta resposta de alta qualidade é o que finalmente fez tudo clicar para mim .. obrigado!
cjauvin
2
Para qualquer pessoa tentando fazer isso em um Mac porque eles mudaram sua funcionalidade terminal e o método padrão como afirma o OP já não funciona (eu estou usando Byobu que tem seu próprio buffer de cópia): substituir a xclip...declaração com um simples pbcopyfaz o truque.
Darrel Holt
Nenhuma das soluções neste segmento funciona para mim.
Yankee
1
Oi Josh, quando eu arquivo-fonte ~ / .tmux.conf, descobriu-se:Unknown key: MouseDragEnd1Pane
Xifeng Li
@XifengLi Qual versão do tmux e SO você está usando? Eu acredito que você precisa pelo menos do tmux 2.2 para as DragEndchaves.
Josh Brobst 11/12
8

Como uma extensão da resposta aceita, as pessoas geralmente acham que perturbador ao soltar o botão do mouse sai do modo de cópia (é o que acontece com copy-pipe-and-cancel). Consulte: https://github.com/tmux/tmux/issues/140 . Portanto, no tmux mais recente (eu uso o 2.6), podemos usar copy-pipejunto com clear selectionpara copiar para a seleção, mas não sair do modo de cópia:

bind-key -T copy-mode-vi MouseDragEnd1Pane send -X copy-pipe "xclip -selection clipboard -i" \; send -X clear-selection
Gabor Marton
fonte
2

Estendendo as duas respostas para copiar do msys2 para a área de transferência do Windows (e limpe a seleção):

# For vi copy mode bindings
bind -Tcopy-mode-vi MouseDragEnd1Pane send -X copy-pipe "cat > /dev/clipboard" \; send -X clear-selection
# For emacs copy mode bindings
bind -Tcopy-mode MouseDragEnd1Pane send -X copy-pipe "cat > /dev/clipboard" \; send -X clear-selection
Shawn Hoover
fonte
Bom ponto. Eu mesmo uso o modo de cópia (estilo emacs) e colei minha própria configuração após o teste. Atualizei a resposta para incluir tanto como na resposta aceita.
Shawn Hoover
0

Ainda outra extensão é sobre o uso da Shiftchave.

Segure Shiftenquanto seleciona o texto com o mouse. Agora você obtém um menu padrão com o botão direito do mouse (mantenha pressionado ou pressione Shiftnovamente) e pode usar Ctrl+Shift+Ce Ctrl+Shift+Vpara copiar e colar. O texto copiado também estará disponível na área de transferência do sistema .

Testado Ubuntu 18.04.1com tmux 2.6.

Fonte: https://forum.upcase.com/t/tmux-ctrl-shift-c-and-ctrl-shift-v-bindings/1208 .

Dušan Maďar
fonte