Comment lier plusieurs commandes tmux à une seule touche?

13

Plus précisément, j'essaie de donner une notification une fois une commande terminée. Donc, par exemple, si je recharge mon fichier de configuration, j'aimerais avoir une confirmation que cela a fonctionné, ce qui pourrait être fait quelque chose comme ceci:

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

Cela , cependant, ne fonctionne pas. Je n'ai pas non plus essayé d'autres choses pour enchaîner les commandes.

iconoclaste
la source
1
Cela fonctionne pour moi (tmux 1.3 sur Debian Squeeze) avec \;comme séparateur.
Gilles 'SO- arrête d'être méchant'
1
D'accord, j'ai trouvé que \; fait le travail, et qui est l'essence de la réponse que je choisis ci - dessous. D'une certaine manière, j'ai testé \; trop rapidement et a déterminé que cela ne fonctionnait pas. Mais je laisse cette question ici car elle sert toujours à répondre à la question de savoir comment faire cela.
iconoclaste

Réponses:

12

Vous pouvez utiliser l' run-shelloption , mais l'essentiel est de séparer les commandes avec\;

Dans ce cas, quelque chose comme:

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

run-shell shell-command
(alias: run)
Exécutez shell-command en arrière-plan sans créer de fenêtre. Une fois terminé, toute sortie vers stdout s'affiche en mode copie. Si la commande ne retourne pas, l'état de sortie s'affiche également.

jasonwryan
la source
Hé, merci pour la réponse. Je n'ai pas testé cela spécifiquement mais je ne pense pas que cela fonctionnera, car j'ai testé le code dans ma question avec \; et il a juste exécuté la deuxième commande mais pas la première. Et je ne sais pas pourquoi run-shell fonctionnerait mais display-message ne fonctionnerait pas.
iconoclaste le
1
D'accord, j'ai essayé de tester votre solution et tmux continue de se bloquer, apparemment (mais pas avec une certitude absolue) à partir de cette commande. Je vais continuer d'essayer, mais je suis sûr que cela ne fonctionnera pas ...
iconoclaste
Il fonctionne sur tmux 1.4. Est-ce que «verrouiller» signifie «mode de copie» - c'est par conception ...
jasonwryan
ok, je l'ai fait fonctionner, sans verrouiller tmux. Cela m'a laissé avec la question de savoir pourquoi ma tentative initiale d'utiliser \; n'a pas fonctionné:
iconoclaste le
1
Le cœur de votre réponse est d'utiliser \; - la partie sur run-shell n'est pas vraiment importante, et je pense que pour l'exemple que j'ai donné, display-message est beaucoup mieux. Je choisis donc votre réponse plutôt que la mienne, mais cela vous dérangerait-il de modifier la réponse afin qu'elle n'induise pas en erreur ou ne déroute pas les autres. Merci!
iconoclaste
4

Juste après avoir composé ma question, j'ai pensé à quelque chose qui pourrait fonctionner. Je l'ai essayé et cela fonctionne, il vous suffit de mettre en place plusieurs fichiers pour votre configuration tmux.

Voici la solution, en particulier en ce qui concerne le rechargement de votre configuration. Dans votre fichier .tmux.conf, mettez quelque chose comme ceci:

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

Dans le fichier ~ / .tmux / reload.tmux, mettez quelque chose comme ceci:

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

Cela fonctionne parfaitement.

iconoclaste
la source
1
C'est en fait la SEULE façon dont cela fonctionne. Tout le reste ici ne fonctionne tout simplement pas.
lzap
Vraiment? ... Cela fait un moment que je n'ai pas testé l'autre approche, mais je serais surpris si tmux cassait ça. Si vous êtes absolument sûr que cela ne fonctionne pas, je vais tester à nouveau et éventuellement accepter cette réponse à la place.
iconoclaste du
Oui, je m'excuse, la réponse ci-dessus fonctionne vraiment :-)
lzap
1

L'utilisation de la méthode run-shell place la sortie dans le tampon de copie qui nécessite un effacement manuel. L'utilisation d'un fichier de configuration intermédiaire ajoute la surcharge de gestion d'un deuxième fichier de configuration. La combinaison des deux réponses fonctionne mieux dans mon cas, car je voulais que le message disparaisse après un court intervalle, semblable à une boîte de dialogue contextuelle dans une interface graphique, mais gardez tout contenu dans un seul fichier.

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

Il y a un correctif permettant des scripts à part entière à l'intérieur de tmux, attachant le langage tcl à ses internes.

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

En outre, il permet de spécifier autant d'actions que vous le souhaitez pour les frappes de mode.

En utilisant cela, votre code ressemblerait à:

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

ou encore plus lisible:

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