Comment envoyer une commande à tous les panneaux de tmux?
j'aime appeler :clear-history
sur des vitres avec un énorme scrollback. Cependant, je veux script un moyen d'envoyer cette commande à tous les panneaux dans les différentes fenêtres.
je sais comment envoyer une commande à toutes les fenêtres, grâce à cette question , mais comment envoyer une commande à toutes les vitres de laquelle fenêtre ainsi?
send-keys
et synchronize-panes
de la tmux man viennent à l'esprit, mais je ne suis pas sûr de la façon de se marier ensemble. Mais peut-être il ya un moyen plus simple de faire cela.
Observations Supplémentaires:
en y réfléchissant un peu, tmux list-panes -a
semble énumérer toutes les parties de la session en cours. Très utile pour commencer. Où dois-je aller d'ici?
5 réponses
avez - vous essayé de suivre dans la fenêtre tmux avec plusieurs vitres
Ctrl-B :
setw synchronize-panes on
clear history
un peu en retard à la fête, mais je ne voulais pas mettre et désactiver synchronize-panes juste pour envoyer une commande, donc j'ai créé une fonction wrapper autour de tmux et ajouté une fonction personnalisée appelée send-keys-all-panes
.
_tmux_send_keys_all_panes_ () {
for _pane in $(tmux list-panes -F '#P'); do
tmux send-keys -t ${_pane} "$@"
done
}
je crée aussi un wrapper autour de la commande tmux pour simplifier l'appel de cette fonction (pour la commodité). L'enveloppe et le code ci-dessus sont tous ici .
cela me permet d'exécuter tmux send-keys-all-panes <command>
ou tmux skap <command
pour envoyer <command>
à tous les panneaux.
notez que tmux est aliasé à ma fonction wrapper tmux_pp.
aucune des réponses ci-dessus n'a fonctionné pour moi (tmux v2.3), mais cela a fait, de la ligne de commande de bash:
for _pane in $(tmux list-panes -a -F '#{pane_id}'); do \
tmux clear-history -t ${_pane} ; done
un script plus généralisé, pour les commandes tmux autres que 'clear-history' remplacerait simplement cet élément par un paramètre, par exemple. 1$. Soyez prudent si vous avez l'intention d'écrire un script pour gérer une série de commandes tmux, "- t ${_pane}" doivent être appliquées à chacun.
notez que le paramètre -a
de tmux list-panes
est nécessaire pour couvrir tous les volets de toutes les fenêtres dans toutes les sessions. Sans cela, seules les vitres de votre fenêtre tmux actuelle seront affectées. Si vous avez plus d'une session tmux ouverte et que vous voulez seulement appliquer la commande aux fenêtres de la session courante, remplacez -a
par -s
(tout est dans la page de manuel tmux).
Je n'ai pas les points mod pour commenter directement sur chacune des réponses ci-dessus, donc voici pourquoi ils ne travaillaient pas pour moi:
le le problème que j'avais avec la réponse de @shailesh-garg était que la synchronisation ne touchait que les commandes émises dans les fenêtres, pas les commandes tmux émises en utilisant Ctrl-B :
qui sont à l'extérieur des vitres.
les trois problèmes que j'ai eu avec la réponse de @kshenoy étaient que:
- il envoie des touches à l'intérieur d'une vitre, pas à l'opération tmux de ce volet, donc par exemple, si on avait un shell bash exécute dans le volet et l'on a utilisé le script d'envoi "claire-histoire", ceux serait les frappes qui apparaîtraient dans la ligne de commande de bash. Une solution de rechange serait d'envoyer "tmux clear-history" ou de pré-pend "tmux " à"$@", mais je n'ai pas édité la réponse à cause de mon autre des problèmes avec la réponse;
- Je n'ai pas pu trouver comment envoyer un caractère de nouvelle ligne sans littéralement la rupture de la chaîne;
- même quand je l'ai fait, envoyer "tmux clear-history" n'a eu aucun effet.
tmux send-keys -t <session id> <command> C-m
remplacer" session id "et" commande " en conséquence.
c'est ma fonction utilitaire pour le faire, n'exécutant la commande que lorsqu'il n'y a rien dans le volet.
#!/bin/bash
_send_bash_command_to_session() {
if [[ $# -eq 0 || "" = "--help" ]] ; then
echo 'Usage: _send_bash_command_to_session $session_name what ever command you want: '
return
fi
input_session=""
input_command="${@:2}"
for _pane in $(tmux list-panes -s -t ${input_session} -F '#{window_index}.#{pane_index}'); do
# only apply the command in bash or zsh panes.
_current_command=$(tmux display-message -p -t ${input_session}:${_pane} '#{pane_current_command}')
if [ ${_current_command} = zsh ] || [ ${_current_command} = bash ] ; then
tmux send-keys -t ${_pane} "${input_command}" Enter
fi
done
}
tmux_set_venv() {
_current_session=$(tmux display-message -p '#{session_name}')
_send_bash_command_to_session ${_current_session} workon
}
exemple ciblant une session appelée dev, permettant un virtualenv python dans tous les panes qui sont dans bash
ou zsh
, en évitant d'exécuter la commande dans les panes avec vim ou tout autre exécutable:
_send_bash_command_to_session dev workon myvirtualenv
ou plus facile à retenir: le faire dans la session actuelle:
tmux_set_venv myvirtualenv
trouver mon fichier de configuration avec cette fonction.