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?

120
demandé sur Community 2013-05-01 23:56:20

5 réponses

avez - vous essayé de suivre dans la fenêtre tmux avec plusieurs vitres

Ctrl-B :

setw synchronize-panes on

clear history
227
répondu shailesh garg 2014-05-16 21:01:04

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.

19
répondu kshenoy 2017-04-27 05:40:02

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:

  1. 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;
  2. Je n'ai pas pu trouver comment envoyer un caractère de nouvelle ligne sans littéralement la rupture de la chaîne;
  3. même quand je l'ai fait, envoyer "tmux clear-history" n'a eu aucun effet.
3
répondu user1404316 2017-08-04 21:37:51
tmux send-keys -t <session id> <command> C-m  

remplacer" session id "et" commande " en conséquence.

2
répondu R J 2018-02-04 08:28:02

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.

0
répondu phcerdan 2018-06-26 19:12:36