Como copiar de / para o 'prancheta' do tmux com tubos de shell?

16

Ao trabalhar em um ambiente shell eu corro com bastante frequência a necessidade de copiar 'saída intermediária do pipe' (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 é muitas vezes 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 similarmente conveniente usando o recurso de copiar / colar do tmux?

    
por unthought 23.11.2012 / 16:17

1 resposta

18

tl; dr

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

Explicação & Antecedentes

No tmux, toda a atividade de copiar / colar passa pelo conjunto de buffers em que a parte superior (índice 0) é o texto copiado mais recentemente e será usado para colar quando nenhum índice de buffer for explicitamente fornecido com -b . Você pode inspecionar os buffers atuais com tmux list-buffers ou o atalho padrão tmux-prefix + # .

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

print -l **/* | tmux loadb -

Colocando isso de volta nos editores e tal é bastante óbvio ( prefixo do tmux + ] ou o que você tiver vinculado paste-buffer ), no entanto, acessando a pasta de dentro do shell não é, porque invocar paste-buffer vai escrever a pasta em stdin, que acaba no buffer de edição do seu terminal, e qualquer nova linha na pasta fará com que o shell execute o que foi colado até agora (potencialmente um ótima maneira de arruinar o seu dia).

Existem algumas maneiras de abordar isso:

  1. tmux pasteb -s ' ' : -s substitui todos os finais de linha (separadores) por qualquer separador que você forneça. No entanto, você ainda obtém o comportamento de paste-buffer , o que significa que a pasta acaba no seu buffer de edição do terminal, que pode ser o que você quer, mas geralmente não é.
  2. tmux showb | ... : show-buffer imprime o buffer para stdout e é quase o que é necessário, mas como Chris Johnsen menciona nos comentários , show-buffer executa a codificação octal de caracteres ASCII não imprimíveis e caracteres não-ASCII. Isso infelizmente quebra com freqüência suficiente para ser irritante, mesmo com coisas simples, como strings terminadas com nulo ou caracteres latinos acentuados (por exemplo, (em zsh) print -N á | tmux loadb - ; tmux showb imprime 31tmux saveb - | ...0 ).
  3. save-buffer : load-buffer simplesmente faz o contrário de | xargs -n1 -I{} ... e grava os bytes brutos não modificados em stdin, o que é desejado na maioria dos casos. Você poderia então continuar a montar outro tubo e, por exemplo. passar %code% para linha de processo, etc.
por 24.11.2012 / 02:03