it-swarm.com.de

Wie kann ich einen Befehl an alle Fenster in tmux senden?

Ich rufe :clear-history gerne in Bereichen mit großem Scrollback auf. Ich möchte jedoch ein Skript erstellen, um diesen Befehl an alle Fenster in den verschiedenen Fenstern zu senden.

Ich weiß, wie ich einen Befehl an alle Fenster senden kann, mit freundlicher Genehmigung dieser question , aber wie sende ich einen Befehl an alle Fenster dieses Fensters?

send-keys und synchronize-panes von der tmux-Manpage kommen mir in den Sinn, aber ich bin nicht sicher, wie ich sie zusammen heiraten soll. Aber vielleicht gibt es einen einfacheren Weg, dies zu tun.

Zusätzliche Beobachtungen:

Wenn Sie ein wenig darüber nachdenken, scheint tmux list-panes -a alle Fenster in der aktuellen Sitzung aufzulisten. Ziemlich nützlich, um damit anzufangen. Wohin gehe ich von hier?

137

Haben Sie versucht, im tmux-Fenster mit mehreren Fenstern zu folgen

Ctrl-B :

setw synchronize-panes on

clear history
257
shailesh garg

Ein bisschen zu spät für die Party, aber ich wollte keine Synchronisierungsfenster setzen, um nur einen Befehl zu senden. Deshalb habe ich eine Wrapper-Funktion um tmux erstellt und eine benutzerdefinierte Funktion namens send-keys-all-panes hinzugefügt.

_tmux_send_keys_all_panes_ () {
  for _pane in $(tmux list-panes -F '#P'); do
    tmux send-keys -t ${_pane} "[email protected]"
  done
}

Um den Befehl tmux zu erstellen, erstelle ich einen Wrapper, um das Aufrufen dieser Funktion zu vereinfachen. Der Wrapper und der obige Code sind alle hier .

Dadurch kann ich tmux send-keys-all-panes <command> oder tmux skap <command ausführen, um <command> an alle Bereiche zu senden.

Beachten Sie, dass tmux einen Alias ​​auf meine Wrapper-Funktion tmux_pp hat.

23
kshenoy

Keine der obigen Antworten funktionierte für mich (tmux v2.3), dies jedoch über die Bash-Befehlszeile:

for _pane in $(tmux list-panes -a -F '#{pane_id}'); do \
  tmux clear-history -t ${_pane}  ; done

Ein verallgemeinertes Skript für tmux-Befehle außer "clear-history" würde dieses Element einfach durch einen Parameter ersetzen, z. 1 US-Dollar Seien Sie vorsichtig, wenn Sie beabsichtigen, ein Skript zu schreiben, um eine Reihe von Tmux-Befehlen zu handhaben, da "-t $ {_ pane}" auf jeden Befehl angewendet werden muss.

Beachten Sie, dass der Parameter -a für tmux list-panes erforderlich ist, um alle Fenster in allen Fenstern aller Sitzungen abzudecken. Andernfalls sind nur die Fenster Ihres aktuellen Tmux-Fensters betroffen. Wenn Sie mehr als eine tmux-Sitzung geöffnet haben und den Befehl nur auf Fenster in der aktuellen Sitzung anwenden möchten, ersetzen Sie -a durch -s (in der Manpage von tmux ist alles enthalten).

Ich habe nicht die Mod-Punkte, um direkt zu jeder der obigen Antworten Stellung zu nehmen. Deshalb haben sie nicht für mich gearbeitet:

Das Problem, das ich mit @ shailesh-gargs Antwort hatte, war, dass die Synchronisierung nur die Befehle betraf, die innerhalb der Fenster ausgegeben wurden, nicht tmux-Befehle, die mit Ctrl-B : ausgegeben wurden und außerhalb der Fenster lagen.

Die drei Probleme, die ich mit @kshenoys Antwort hatte, waren folgende: 

  1. er sendet Tastatureingaben innerhalb eines Bereichs, nicht an die Tmux-Operation dieses Bereichs. Wenn zum Beispiel eine bash-Shell in ausgeführt wurde, verwendet der Bereich einen "clear-history". Diese wären die Tastenanschläge, die in der Bash-Befehlszeile erscheinen würden Ein Workaround wäre, "tmux clear-history" zu senden oder "tmux" an "$ @" zu senden. ", aber ich habe die Antwort wegen meiner anderen Probleme mit der Antwort nicht bearbeitet; 
  2. Ich konnte nicht herausfinden, wie ich ein New-Line-Zeichen senden sollte, ohne die Zeile buchstäblich zu brechen. 
  3. Das Senden von "tmux clear-history" hatte selbst dann keine Auswirkungen.
4
user1404316
tmux send-keys -t <session id> <command> C-m  

Ersetzen Sie die "Sitzungs-ID" und "Befehl" entsprechend.

2
R J

Update Juni 2019

Kurze Darstellung, wie Sie Ihre eigene Bindung für Fenster synchronisieren konfigurieren.

Fügen Sie Folgendes in meinen tmux.conf ein (die Kommentare beziehen sich auf meine Gesamtkonfiguration):

# synchronize all panes in a window
# don't use control S, too easily confused
# with navigation key sequences in tmux (show sessions)
unbind C-S
bind C-Y set-window-option synchronize-panes

Jetzt kann ich die Fähigkeit umschalten, Befehle über mehrere Fenster mit <C-a><C-y> zu synchronisieren.

(Ja, ich habe die Bindungstaste erneut Strg a zugewiesen.).

1
arcseldon

Dies ist meine Dienstprogrammfunktion, die den Befehl nur ausführt, wenn im Fenster nichts ausgeführt wird.

#!/bin/bash

_send_bash_command_to_session() {
    if [[ $# -eq 0 || "$1" = "--help" ]] ; then
        echo 'Usage: _send_bash_command_to_session $session_name what ever command you want: '
        return
    fi
    input_session="$1"
    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 $1
}

Beispiel für eine Sitzung mit dem Namen dev, die eine Python virtualenv in allen Bereichen aktiviert, die sich in bash oder zsh befinden, und die Ausführung des Befehls in Bereichen mit vim oder einer anderen ausführbaren Datei verhindert:

_send_bash_command_to_session dev workon myvirtualenv

oder einfacher zu merken: Um es in der aktuellen Sitzung zu tun:

tmux_set_venv myvirtualenv

Finde meine Konfigurationsdatei mit dieser Funktion. 

0
phcerdan