Como copiar de / para a 'área de transferência' do tmux com tubos de proteção?

17

Ao trabalhar em um ambiente shell, eu frequentemente encontro a necessidade de copiar 'saída de tubo intermediário' (por exemplo, de / para editores já em execução, para outros shells, outras máquinas etc.).

Quando em um ambiente de janelas, um método fácil (e genérico) para resolver isso geralmente é através da área de transferência do sistema, por exemplo:

  • X11: ... | xsel -i/xsel -o | ...
  • OS X: ... | pbcopy/pbpaste | ...

Como posso obter um comportamento igualmente conveniente usando o recurso de copiar / colar do tmux?

impensado
fonte

Respostas:

20

tl; dr

  • ... | tmux loadb -
  • tmux saveb - | ...

Explicação e Antecedentes

No tmux, todas as atividades de copiar / colar passam pela pilha de buffers, onde o topo (índice 0) é o texto copiado mais recentemente e será usado para colar quando nenhum índice de buffer for explicitamente fornecido -b. Você pode inspecionar os buffers atuais com tmux list-buffersou o atalho padrão tmux-prefix+ #.

Existem duas maneiras de canalizar para um novo buffer tmux no topo da pilha, set-bufferusando um argumento de string e load-bufferusando um argumento de arquivo. Para canalizar para um buffer que você geralmente deseja usar load-buffercom stdin, por exemplo:

print -l **/* | tmux loadb -

Colar isso de volta nos editores e isso é bastante óbvio ( tmux-prefix+ ]ou o que você quiser paste-buffer), no entanto, acessar a pasta de dentro do shell não é, porque a chamada paste-buffergravará a pasta no stdin, que termina na edição do seu terminal buffer e qualquer nova linha na pasta fará com que o shell execute o que foi colado até agora (potencialmente uma ótima maneira de arruinar o seu dia).

Existem algumas maneiras de abordar isso:

  1. tmux pasteb -s ' ': -ssubstitui todas as terminações de linha (separadores) por qualquer separador que você fornecer. No entanto, você ainda obtém o comportamento, o paste-bufferque significa que a pasta acaba no buffer de edição do terminal, que pode ser o que você deseja, mas geralmente não é.
  2. tmux showb | ...: show-bufferimprime o buffer em stdout e é quase o necessário, mas, como Chris Johnsen menciona nos comentários , show-bufferexecuta a codificação octal de caracteres ASCII não imprimíveis e caracteres não ASCII. Infelizmente, isso quebra com freqüência suficiente para ser irritante, com coisas simples, como seqüências terminadas nulas ou caracteres latinos acentuados (por exemplo, print -N á | tmux loadb - ; tmux showbimpressões em zsh \303\241\000).
  3. tmux saveb - | ...: save-bufferfaz o inverso load-buffere grava os bytes brutos sem modificação no stdin, o que é desejado na maioria dos casos. Você poderia então continuar montando outro tubo, e por exemplo. passar | xargs -n1 -I{} ...para linha de processo sábio, etc.
impensado
fonte
11
tmux show-bufferfará codificação octal de caracteres de controle C0 e bytes não ASCII (por exemplo, caracteres latinos acentuados, etc.). Você pode usar tmux save-buffer -se quiser os bytes brutos (geralmente é o que você deseja).
31712 Chris Chrissen
@ ChrisJohnsen Muito obrigado por entender isso, eu atualizei a resposta de acordo.
unstought