Como vincular vários comandos do tmux a um pressionamento de tecla?

13

Especificamente, estou tentando fazer uma notificação após a conclusão de algum comando. Por exemplo, se eu recarregar meu arquivo de configuração, gostaria de ter alguma confirmação de que funcionou, o que pode ser feito da seguinte maneira:

bind R source-file "$HOME/.tmux.conf" && display-message "Configuration reloaded."

Isso , no entanto, não funciona. Nem tentei outras coisas como formas de encadear comandos.

iconoclasta
fonte
1
Funciona para mim (tmux 1.3 no Debian squeeze) com \;o separador.
Gilles 'SO- stop be evil'
1
Ok, eu achei isso \; faz o trabalho, e que é a essência da resposta que eu escolhi seguir. De alguma forma eu testei \; rápido demais e determinou que não funcionava. Mas estou deixando essa pergunta aqui, pois ela ainda serve para responder à pergunta de como fazer isso.
Iconoclasta

Respostas:

12

Você pode usar a run-shellopção , mas o mais importante é separar os comandos com\;

Nesse caso, algo como:

bind R source-file ~/.tmux.conf \; run-shell "echo 'Reload'"

comando de shell run-shell
(também conhecido como: run)
Execute o comando shell em segundo plano sem criar uma janela. Após a conclusão, qualquer saída para o stdout é exibida no modo de cópia. Se o comando não retornar com êxito, o status de saída também será exibido.

jasonwryan
fonte
Ei, obrigado pela resposta. Não testei isso especificamente, mas acho que não funcionará, pois testei o código na minha pergunta com \; e apenas executou o segundo comando, mas não o primeiro. E não sei por que o shell de execução funcionaria, mas a mensagem de exibição não.
iconoclast
1
Ok, eu tentei testar sua solução e o tmux continua travando, aparentemente (embora não com certeza absoluta) desse comando. Vou continuar tentando, mas eu tenho certeza que não vai funcionar ...
iconoclasta
Funciona no tmux 1.4. Será que "trancar" "modo de cópia" média - que é por design ...
jasonwryan
ok, eu consegui funcionar, sem travar o tmux. Isso me deixou com a pergunta de por que minha tentativa original de usar \; não funcionou:
iconoclast
1
O coração da sua resposta é usar \; - a parte sobre run-shell não é realmente importante, e acho que pelo exemplo que dei à mensagem de exibição é muito melhor. Então, eu estou escolhendo sua resposta sobre a minha, mas você se importaria em editar a resposta para que ela não engane ou confunda outras pessoas. Obrigado!
Iconoclasta
4

Logo após escrever minha pergunta, pensei em algo que poderia funcionar. Eu tentei e funciona, você só precisa suportar vários arquivos para a sua configuração tmux.

Aqui está a solução, especificamente no que diz respeito ao recarregamento da sua configuração. No seu arquivo .tmux.conf, coloque algo como isto:

bind R source-file "$HOME/.tmux/reload.tmux"

No arquivo ~ / .tmux / reload.tmux, coloque algo como o seguinte:

source-file "$HOME/.tmux.conf" 
display-message "Configuration reloaded."

Funciona perfeitamente.

iconoclasta
fonte
1
Esta é realmente a única maneira que funciona. Tudo o resto aqui simplesmente não está funcionando.
Lzap
Sério? ... Já faz um tempo desde que eu testei a outra abordagem, mas ficaria surpreso se o tmux quebrasse isso. Se você tiver certeza absoluta de que não funciona, testarei novamente e, possivelmente, aceitarei esta resposta.
Iconoclasta
Sim, eu peço desculpas, a resposta acima realmente funciona :-)
lzap
1

O uso do método run-shell coloca a saída no buffer de cópia que requer limpeza manual. O uso de um arquivo de configuração intermediário adiciona a sobrecarga de manter um segundo arquivo de configuração. A combinação das duas respostas funciona melhor no meu caso, pois eu queria que a mensagem desaparecesse após um curto intervalo, semelhante a uma caixa de diálogo pop-up em uma GUI, mas mantenha tudo contido em um único arquivo.

bind R source-file ~/.tmux.conf \; display-message "Configuration reloaded"
Chris
fonte
0

Existe um patch que permite scripts completos no tmux, anexando a linguagem tcl a seus internos.

http://ershov.github.io/tmux/

Além disso, permite especificar quantas ações você deseja para pressionamentos de tecla 'modo'.

Usando isso, seu código seria semelhante a:

bind R tcl { source-file "$HOME/.tmux.conf" ; display-message "Configuration reloaded." }

ou ainda mais legível:

bind R tcl {
  source-file "$HOME/.tmux.conf"
  display-message "Configuration reloaded."
}
Yuriy Ershov
fonte