Use a área de transferência do sistema no modo vi-copy no tmux

51

Estou executando o tmux 1.6 e estou tentando configurá-lo para usar combinações de teclas no estilo vi, bem como usar a área de transferência do sistema ao copiar no modo interativo:

set-window-option -g mode-keys vi

bind-key -t vi-copy 'v' begin-selection
bind-key -t vi-copy 'y' "copy-selection && run \"tmux save-buffer | xclip -selection clipboard\""

Simplificando, eu gostaria de poder C+ [e depois usar vpara começar a selecionar o texto para copiar; quando ypressionado, copie a seleção para a seleção tmux e, em seguida, exporte-a para a área de transferência do sistema usando xclip.

Infelizmente, quando tento fazer isso, vejo o seguinte:

.tmux.conf: 14: unknown command: copy-selection && run "tmux save-buffer | xclip -selection clipboard"

Existe uma maneira de fazer isso na configuração do tmux?

Naftuli Kay
fonte

Respostas:

87

Isso também foi respondido aqui , mas demorei um pouco para entender como usá-lo, então vou explicar para qualquer pessoa que estivesse confusa.

Esta é basicamente a configuração que você deseja:

(para versões tmux <2.5 )

bind -t vi-copy y copy-pipe 'xclip -in -selection clipboard'

(para versões do tmux > = 2.5 )

bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 'xclip -in -selection clipboard'

Em seguida, pressione Ctrl+b [para entrar no modo de cópia. Em seguida, pressione Spaceseguido de quaisquer teclas de movimento vi para fazer uma seleção. Em seguida, em vez de pressionar Enter, pressione ye a seleção será copiada para a área de transferência.

Nota: isso pressupõe que você esteja usando as ligações padrão do tmux com as teclas vi.

O Tmux possui tabelas de ligação de teclas diferentes para modos diferentes. Portanto, bind-key -t vi-copy ydefine a ação da ychave no modo de cópia. Inicialmente, fiquei confuso porque estava acostumado a bater Enterdepois de fazer uma seleção. Enteré realmente apenas a ligação de chave padrão para o copy-selectioncomando (quando no modo de cópia). O copy-pipecomando permite vincular uma nova chave para canalizar a seleção para um comando, que neste caso é xclip.

Você pode ver todas as ligações de teclas para o modo de cópia executando list-keys -t vi-copy.

Ben Davis
fonte
Muito obrigado, tive que baixar e compilar o tmux 1.9a, mas não foi tão difícil e agora funciona!
Naftuli Kay
3
Se ele não funciona apenas verifique que xclipestá realmente instalado em seu sistema (não é instalado por padrão no Ubuntu, você precisa sudo apt-get install xclippara obtê-lo)
ecerulm
3
Para OSX, substitua xclippor pbcopy. Para Cygwin no Windows, substitua-o por putclip(da cygutils-extraembalagem).
SnoringFrog
5
A seguinte ligação desta entrada de blog também funciona muito bem no Tmux 2.6 e não tem a desvantagem de colocar caracteres aparentemente aleatórios na tela ao copiar:bind -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "xclip -i -f -selection primary | xclip -i -selection clipboard"
Matthias Braun
11
Este foi não trabalhar para mim até que eu removi esta linha de .tmux.conf: set -g mouse on. Isto é suposto para permitir "modo mouse" , mas mesmo depois de removê-lo tudo sobre o meu mouse funciona bem (obras roda de rolagem, obras de seleção mouse) ...
ndemou
11

A versão atualizada para Ben Davis responde

compatível com tmux 2.4

bind -T copy-mode-vi y send -X copy-pipe "xclip -selection c"
jruz
fonte
4
Acho que funciona um pouco melhor com copy-pipe-and-cancele não copy-pipe. Isso é feito no tmux 2.5
wreckgar23
6

Você está enfrentando alguns problemas técnicos:
as ligações do "modo especial" (por exemplo vi-copy)…

  1. use um conjunto diferente de comandos (ou seja, run-shellaka runnão está disponível) e
  2. não tem a capacidade de vincular vários comandos (que normalmente podem ser separados por ;- o &&separador de comandos do shell não está disponível).

O tmux 1.8 possui copy-pipe, o que poderia ajudar:

bind-key -t vi-copy y copy-pipe 'xclip -selection clipboard >/dev/null'

(Existe uma ligação como esta listada na FAQ .)

Chris Johnsen
fonte
11
Eu tenho o tmux 1.8 e isso parece não funcionar. Ugh, eu odeio entradas de área de texto enviadas no Enter. De qualquer forma, adicionei essa ligação de chave, mas quando faço <prefixo> -y e pressiono [espaço], o conteúdo não é copiado para a área de transferência.
Ben Davis
Apenas descobri. Não entendi como a tabela de ligação de teclas "vi-copy" funcionava.
Ben Davis
5

Dê uma olhada no plugin tmux-yank para tmux. https://github.com/tmux-plugins/tmux-yank

Ele fornece uma maneira automatizada de copiar / colar do tmux para a área de transferência do sistema. Funciona em sistemas OSX / Linux / Cygwin.

bergercookie
fonte
Isso funcionou muito bem para mim, obrigado pelo link!
Bryan Henry
2

Para o macOS, você pode adicionar esta linha a .tmux.conf

bind -t vi-copy y copy-pipe 'pbcopy'

bumaociyuan
fonte
usuários do macOS, para tmux> = 2.5:bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 'pbcopy'
Dai
1

Foi isso que acabou trabalhando para mim usando o tmux 2.2 e tendo instalado o xclip. Para cópia no estilo Vim, adicione o seguinte ao arquivo .tmux.conf

bind Escape copy-mode
bind -t vi-copy 'v' begin-selection
bind -t vi-copy 'y' copy-selection
# Vim style copy to clipboard
bind-key -t vi-copy y copy-pipe "xclip -selection c > /dev/null"
bind-key p run "xclip -o -sel clip | tmux load-buffer - ; tmux paste-buffer"

Aqui, no modo de cópia, PREFIX v inicia a seleção e PREFIX y copia para a área de transferência. PREFIXO p pode ser usado para colar no terminal.

OrigamiEye
fonte