ligação de chave do tmux ao conteúdo do painel de canais para programar

4

Estou tentando fazer com que essa ligação de chave funcione para canalizar o conteúdo do painel atual para um programa de minha escolha:

bind P command-prompt -I "vim -" \
    "capture-pane -eJ -S - -E -; \
    set-buffer -n PIPE; \
    new-window -n '|%1' 'tmux save-buffer -b PIPE - | %1'; \
    delete-buffer -b PIPE"

- mas sempre resulta no relatório tmux no buffer PIPE . Este texto é geralmente mostrado e sobrescrito rapidamente demais para que eu possa notá-lo; Eu consegui elicitá-lo usando sleep 10 como o nome do comando para canalizar a saída para.

Eu escolhi renomear o buffer nomeado automaticamente criado por capture-pane porque senão a chamada new-window parecia redefinir o buffer atual / padrão do tmux para qualquer coisa que eu copiei pela última vez no modo de cópia. Tanto quanto eu posso dizer, o novo buffer deve ser renomeado PIPE .

Eu tenho uma ligação semelhante, mas mais simples, que gera o conteúdo em um arquivo em vez de um canal, funcionando perfeitamente:

bind H command-prompt -I "tmux_#W.txt" \
    "capture-pane -eJ -S - -E -; \
    save-buffer '%%'; \
    delete-buffer"

Se eu executar os comandos nele um por um, o programa recebe o texto do painel como faria de qualquer outro pipe. O que estou fazendo errado?

    
por echristopherson 05.07.2015 / 11:12

1 resposta

2

Parece que existe uma corrida entre os comandos new-window e delete-buffer : isto é, o buffer "PIPE" é deletado antes de ser canalizado para o vim ou qualquer outro programa que você queira executar.

O seguinte hack feio que dorme um segundo antes de chamar delete-buffer corrige o problema para mim:

bind P command-prompt -I "vim -" \
    "capture-pane -eJ -S - -E -; \
    set-buffer -n PIPE; \
    new-window -n '|%1' 'tmux save-buffer -b PIPE - | %1'; \
    run-sh 'sleep 1 && tmux delete-buffer -b PIPE'"
    
por 05.07.2015 / 12:32

Tags