Copiar / colar seleções de texto entre o tmux e a área de transferência

15

Estou executando a versão mais recente do tmux (do repositório git) e do xclip (0.12) e gostaria de poder usar as ligações de teclado do tipo Emacs para mover o texto copy-mode, as M-wseleções de copy ( ) para a área de transferência e paste ( C-y) de / para o buffer de cópia na área de transferência.

Até agora, consegui colar texto C-ye me movimentar copy-modecom as ligações de teclado do tipo Emacs, mas ainda não consigo copiar o texto de um buffer tmux (por exemplo, em copy-mode)

Encontrei este tópico para copiar todo o buffer para a área de transferência (e vice-versa), mas não parece estar funcionando para mim.

Além disso, na tmux-userslista de emails, disseram-me que as versões recentes do tmux (apenas no repositório git) fornecem um comando chamado copy-pipe. A página do manual diz o seguinte sobre este comando:

Um comando aceita um argumento, copy-pipe, que copia a seleção e a envia para um comando. Por exemplo, o seguinte ligará 'C-q' para copiar a seleção em / tmp e também no buffer de colagem:

       bind-key -temacs-copy C-q copy-pipe "cat >/tmp/out"

Parece que copy-pipedeve ser usado em parte para canalizar a seleção para outro comando. Também parece haver alguns erros de digitação nesta descrição e no comando (o que é temacs-copy?)

De qualquer forma, o que eu gostaria de fazer é:

Copiando:

  1. Entre no modo de cópia
  2. Mover-se para o texto que deseja copiar usando comandos de navegação Emacs (ou seja C-f, C-b, M-f, M-b, C-a, C-eetc, para mover o cursor). Não há prefixo para nenhum deles.
  3. Copie o texto selecionado na área de transferência com: M-w( sem prefixo )

Colagem:

  1. Eu gostaria de poder digitar C-y( sem precisar digitar copy-mode) para colar texto no terminal ( sem prefixo )

Tentei o seguinte para copiar sem sorte:

bind-key -n M-w run "tmux save-buffer - | xclip -i -selection clipboard" 

No entanto, colar funciona muito bem:

bind-key -n C-y run "xclip -o | tmux load-buffer - ; tmux paste-buffer"

O mais estranho é que sei que a xclip -i -selection clipboardparte " " do comando de cópia acima funciona bem, pois posso copiar as coisas para a área de transferência na linha de comando, por exemplo:

echo "Hello world. How are you?" | xclip -i -selection clipboard

Com tudo isso, como posso copiar uma seleção do modo de cópia para a área de transferência?

Amelio Vazquez-Reina
fonte

Respostas:

19

Use o seguinte tmux.confcom copy-pipenas novas versões do tmux (1.8+):

set -g mouse on
# To copy:
bind-key -n -t emacs-copy M-w copy-pipe "xclip -i -sel p -f | xclip -i -sel c "

# To paste:
bind-key -n C-y run "xclip -o | tmux load-buffer - ; tmux paste-buffer"
  1. prefix+[ no modo de cópia
  2. selecione o conteúdo com o mouse (mantenha pressionado)
  3. M-w copiar essa parte na área de transferência do sistema
  4. C-ycole-o dentro do tmux, C-vcole-o dentro de outro aplicativo comum como o navegador da web.
Josh
fonte
Esta resposta merece mais votos, é a melhor para configurações baseadas em Linux.
22614 Louis Kottmann
No tmux 2.0, em run-shellvez derun
roign
@ LouisKottmann: por que apenas baseado em Linux?
Schaiba 5/05
Eu não posso comentar sobre outros sistemas, mas acredito que os usos mac bpaste vez de xclip normalmente
Louis Kottmann
No tmux 2.8, tive que transformá-los em bind -Tcopy-mode M-w send-keys -X copy-pipe "xclip -i -sel p -f | xclip -i -sel c ". bind-key -n C-y run-shell "xclip -o | tmux load-buffer - ; tmux paste-buffer" de acordo com este commit sugerido por starfry
azzamsa 22/01/19
5

Observe que, com o Tmux 2.4 (desde esse commit ), a sintaxe da ligação foi alterada. Parafraseando este comentário no Github para resumir brevemente a alteração:

  1. substitua -tpor-T
  2. substitua vi-<name>por<name>-mode-vi
  3. prefixe o comando com send-keys -X

Eu tinha:

bind-key -n -t vi-copy Enter copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'
bind-key -n -t vi-copy MouseDragEnd1Pane copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'

que eu precisava mudar para:

bind-key -n -T copy-mode-vi Enter send-keys -X copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'
bind-key -n -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'

No changelog :

As tabelas principais sofreram grandes mudanças. As tabelas de teclas de modo não são mais separadas das principais tabelas de teclas. Todas as tabelas de teclas de modo foram removidas, juntamente com o sinalizador -t para ligar e desligar a chave.

As tabelas emacs-edit, vi-edit, emacs-choose e vi-choose foram substituídas por ligações de teclas fixas no prompt de comando e escolha os modos. As opções de teclas de modo e teclas de status permanecem.

As tabelas emacs-copy e vi-copy foram substituídas pelas tabelas copy-mode e copy-mode-vi. Os comandos são enviados usando os sinalizadores -X e -N para enviar chaves. Então, o seguinte:

bind -temacs-copy C-Up scroll-up
bind -temacs-copy -R5 WheelUpPane scroll-up

Torna-se:

bind -Tcopy-mode C-Up send -X scroll-up
bind -Tcopy-mode WheelUpPane send -N5 -X scroll-up

Essas alterações permitem que o analisador de comandos completo (incluindo sequências de comandos) e o conjunto de comandos sejam usados ​​- por exemplo, o prompt de comando normal com edição e histórico agora é usado para pesquisar, saltar, etc., em vez de um personalizado. A ligação Cr padrão é agora:

bind -Tcopy-mode C-r command-prompt -p'search up' "send -X search-backward-incremental '%%'"

Também existem alguns novos comandos disponíveis com send -X, como copy-pipe-and-cancel.

starfry
fonte
2

O -temacs-copynão é um erro de digitação. O traço principal significa que esta é uma opção para o bind-keyscomando (junto com um argumento para a opção). É equivalente a -t emacs-copy, se você gosta mais disso.

O modo de cópia usa um conjunto diferente de ligações e comandos 1 que o "modo normal". O copy-pipecomando está disponível apenas nas tabelas de ligações "mode" alternativas. Quando mode-keysestiver emacs, o modo de cópia usará a emacs-copytabela, portanto, é necessário vincular Mw copy-pipenessa tabela.

bind-key -temacs-copy M-w copy-pipe "xclip -i -selection clipboard"

Cuidado ao criar muitas ligações "sem prefixo". Eles dificultam a digitação dessas chaves associadas a um programa em execução no tmux (por exemplo, quando você deseja digitar Cy em uma instância de modo tty do Emacs em execução no tmux ). Você sempre pode (prefixo) vincular alguma chave send-keys C-y, mas isso pode dificultar a digitação, se você precisar com frequência suficiente.


1 Apenas comandos de movimento e edição estão disponíveis. Com exceção de copy-pipe, esses comandos não aceitam argumentos (é o que a página de manual significa com "Um comando aceita um argumento"; o "in" é provavelmente um erro de digitação ou edição).

Chris Johnsen
fonte
2

Embora outras respostas possam ajudar, veja como faço o mesmo:

  • Shift + selecione o texto com o cursor.
  • Ctrl + Shift + C para copiar o texto para a área de transferência.
Rishabh Agrahari
fonte
Essa é uma resposta justa, mas os problemas começam quando você tem dois ou mais painéis dispostos horizontalmente.
precisa saber é
Entendo, deixe-me saber se você encontrar algo útil para isso.
Rishabh Agrahari