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.


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.


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.


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"

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."
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.