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

12

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 em copy-mode , copy ( M-w ) para a área de transferência e cole ( C-y ) de / para o buffer de cópia para a área de transferência.

Até agora consegui colar texto com C-y e mover copy-mode com ligações de teclado semelhantes ao Emacs, mas ainda não consigo copiar texto de um buffer tmux (por exemplo, em copy-mode )

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

Além disso, na lista de e-mail tmux-users , fui informado de que as versões recentes do tmux (apenas no repositório git) fornecem um comando chamado copy-pipe . A man page diz o seguinte sobre este comando:

One command in accepts an argument, copy-pipe, which copies the selection and pipes it to a command. For example the following will bind ‘C-q’ to copy the selection into /tmp as well as the paste buffer:

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

Parece que copy-pipe foi usado em parte para canalizar a seleção para outro comando. Também parece haver alguns erros 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. Mova para o texto que desejo copiar usando os comandos de navegação do Emacs (por exemplo, C-f , C-b , M-f , M-b , C-a , C-e etc. para mover o cursor). Nenhum prefixo para nenhum desses.
  3. Copie o texto selecionado na área de transferência com: M-w ( sem prefixo )

Colando:

  1. Gostaria de poder digitar C-y ( sem ter que inserir copy-mode ) para colar o texto no terminal ( sem prefixo )

Eu 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 curioso é que eu sei que a parte " xclip -i -selection clipboard " do comando copy acima funciona bem, já que eu posso copiar 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?

    
por Amelio Vazquez-Reina 12.03.2013 / 16:40

4 respostas

16

Use o seguinte tmux.conf com copy-pipe nas 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 para copiar essa parte na área de transferência do sistema
  4. C-y o cole dentro do tmux, C-v para colá-lo dentro de outro aplicativo regular, como navegador da web.
por 14.04.2013 / 01:54
3

Por favor, note que, com o Tmux 2.4 (desde este commit ), a sintaxe de ligação foi alterada. Parafraseando este comentário do Github para resumir brevemente a mudança:

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

Eu tive:

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'

Do changelog :

Key tables have undergone major changes. Mode key tables are no longer separate from the main key tables. All mode key tables have been removed, together with the -t flag to bind-key and unbind-key.

The emacs-edit, vi-edit, emacs-choose and vi-choose tables have been replaced by fixed key bindings in the command prompt and choose modes. The mode-keys and status-keys options remain.

The emacs-copy and vi-copy tables have been replaced by the copy-mode and copy-mode-vi tables. Commands are sent using the -X and -N flags to send-keys. So the following:

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

Becomes:

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

These changes allows the full command parser (including command sequences) and command set to be used - for example, the normal command prompt with editing and history is now used for searching, jumping, and so on instead of a custom one. The default C-r binding is now:

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

There are also some new commmands available with send -X, such as copy-pipe-and-cancel.

    
por 05.05.2017 / 10:38
2

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

O modo de cópia usa um conjunto diferente de ligações e comandos 1 que o “modo normal”. O comando copy-pipe está disponível apenas nas tabelas de ligações de “modo” alternativas. Quando mode-keys for emacs , o modo de cópia usará a tabela emacs-copy , então você precisa vincular M-w a copy-pipe nessa tabela.

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

Tenha cuidado ao fazer muitas ligações "sem prefixo". Eles dificultarão a digitação dessas chaves para um programa rodando dentro do tmux (por exemplo, quando você quiser digitar Cy em uma instância do modo tty do Emacs rodando dentro do > tmux ). Você sempre pode (prefixo) ligar alguma chave que faz send-keys C-y , mas isso pode dificultar a digitação se você precisar dela 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 nenhum argumento (é o que a página man significa com ele "Um comando aceita um argumento"; o "in" é provavelmente um erro de digitação ou um erro de edição). / p>     

por 16.03.2013 / 05:38
2

Embora outras respostas possam ajudar, eis 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.

Espero que isso ajude!

    
por 27.06.2018 / 07:23