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.
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?
Haben Sie versucht, im tmux-Fenster mit mehreren Fenstern zu folgen
Ctrl-B :
setw synchronize-panes on
clear history
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.
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:
tmux send-keys -t <session id> <command> C-m
Ersetzen Sie die "Sitzungs-ID" und "Befehl" entsprechend.
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.).
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.