Binden einer tmux-Taste an mehrere Befehle


37

Ich starte das multipane tmux-Fenster, um mehrere Serverparameter zu überwachen. Mit Strg-S kann ich mit einem anderen Monitor-Befehl ein neues Fenster öffnen.

Jetzt möchte ich Strg-Q binden, um ein weiteres Multipane- Fenster mit mehreren Monitoren zu öffnen . Wie binde ich einen Schlüssel an mehrere Befehle? Ich habe versucht, sie zu verketten; und \; - Nichts hilft. Bitte geben Sie an, was ich anstelle von ... unten verwenden soll.

Ist es möglich, wenn ich ein neues Fenster öffne, die von ihm überlappten Hintergrundbefehle auszusetzen?

    tmux new-session "monitor1" \;\
            split-window -v "monitor2" \;\
            select-pane -U \;\
            split-window -v -h -p 60 "monitor3" \;\
            bind-key -n C-s new-window "monitor4" \;\
            bind-key -n C-q "..."

Antworten:


37

Todd Freed hat recht, der "richtige" Weg, dies zu tun, ist die Verwendung \;. Art von. Aber es gibt einen Haken.

Sie fügen eine Folge von tmux-Befehlen zusammen, indem Sie tmux die Konjunktion geben ;. In einer Datei, die von tmux stammt, könnte man also sagen

new-session "monitor1" ; split-window -v "monitor2"

wenn Sie das aus irgendeinem Grund alles in einer Zeile haben wollten. Jetzt können Sie diese einzeilige zusammengesetzte Anweisung auch tmuxvon einer Shell an den Befehl übergeben, aber das ;muss maskiert werden, damit die Shell es als ein weiteres Argument für interpretiert tmux. Somit ist das Äquivalent des Obigen aus der Schale

$ tmux new-session "monitor1" \; split-window -v "monitor2"

In ähnlicher Weise benötigt der bind-keyBefehl tmux eine Reihe von Argumenten, bei denen es sich um den Befehl tmux handelt, und Argumente, die ausgeführt werden, wenn die Taste gedrückt wird. Wenn Sie sich C-qaus einer von tmux bereitgestellten Datei an die obige Sequenz binden möchten, würden Sie sagen

bind-key -n C-q new-session "monitor1" \; split-window -v "monitor2"

Hier haben wir das Kommando ; von tmux umgangen , so dass tmux es nicht als Ende des bind-keyBefehls interpretiert , sondern als weiteres Argument, bind-keyum es zu veranlassen, einen zusammengesetzten Befehl als gebundenen Wert des C-qSchlüssels zu bilden.

Was passiert also, wenn wir tmux dazu bringen wollen, das von der Shell aus zu tun? Eine ganze Menge zu entkommen.

$ tmux bind-key -n C-q new-session "monitor1" \\\; split-window -v "monitor2"

Zuerst müssen wir das \ und das ;jeweils aus der Shell entfernen , wodurch die Shell die beiden Zeichen \;als Argument an übergibt tmux. Dies entgeht dann dem ;Befehl tmux, wodurch die gesamte zusammengesetzte Anweisung als Bindung von zugewiesen wird C-q.


Nun, wenn Sie ein komplexes tmux-Setup wie dieses wiederholt verwenden, würde ich vorschlagen, dass Sie eine tmux-Datei erstellen, um diese zu speichern:

# In split-windows.tmux:
new-session "monitor1"
split-window -v "monitor2"
bind-key -n C-s new-window "monitor4"
# ...etc...

Und dann:

$ tmux source split-windows.tmux  # (or even make an alias for this)

Es wird viel einfacher sein, so zu bleiben.


3
Um das Binden von Tasten für mehrere Befehle über die Befehlszeile zu vereinfachen, können Sie auch die folgenden Zeichenfolgen umgehen \;:$ tmux bind-key -n C-q new-session "monitor1" '\;' split-window -v "monitor2"
Tim Heap

12

Die eigentliche Antwort lautet also: Sie verketten Befehle mit einem Backslash, gefolgt von einem Semikolon.

bind-key C send-keys foo \; send-keys bar

Du würdest das in deine tmux.conf schreiben oder von der tmux ":" Eingabeaufforderung ausführen


Dies war großartig und funktionierte für die Verwendung von verschachtelten tmux-Sitzungen und das Navigieren durch die verschachtelten tmux-Fenster.
Paul

1
Dies funktioniert nicht über die Shell-Befehlszeile. Dh `tmux bind-key C send-keys foo \; send-keys bar "hat den Effekt," foo "an" C "zu binden, druckt aber sofort" bar ".
Lqueryvg

Ja, das würden Sie in tmux ausführen. Zur Verdeutlichung aktualisiert.
Todd befreit

Nett! Das funktioniert total ... muchas gracias!
Brad Parks

Kein Tee ; in einfachen Anführungszeichen muss nicht entkommen
elig

2

Sie können dies mit einer kleinen Problemumgehung tun. Ähnlich wie bei der Antwort, in der vorgeschlagen wird, ein Skript auszuführen (das Ihren Fall gut behandelt), kann dies im Allgemeinen durch Verwenden von "run-shell" und Aufrufen von tmux selbst als Shell-Befehl erfolgen.

bind-key z run-shell "tmux send-keys "xyz" ; tmux clear-history; clear" 

Dieser Befehl sendet 'xyz'-Schlüssel, den Befehl tmux' clear-history 'und ruft dann die integrierte' clear'-Shell auf.

Die gesamte Zeichenfolge ist nur eine Befehlsfolge mit mehreren Shell-Befehlen.


1

Sie können den Tastenkombinationen Ihrer .tmux.confDatei so etwas hinzufügen :

bind q send-keys "/home/jackhab/bin/tmux-new-session.sh" \; send-keys "Enter"

Und in können tmux-new-session.shSie haben:

#! /usr/bin/env bash
tmux new-session "monitor1"
tmux split-window -v "monitor2"
tmux select-pane -U
tmux split-window -v -h -p 60 "monitor3"
...
exit

1

Alles, was hier gezeigt wird, wird nicht funktionieren, weil das so ist

bind q send-keys "command1" \; send-keys "command2"

Führt den Befehl2 sofort aus und q ist nur an die Sendetasten "Befehl1" gebunden.

Hier ist die Lösung:

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

In der Datei ~ / .tmux / reload.tmux sind mehrere Befehle abzulegen:

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

1
Oh warte, benutze was Peeja gesagt hat (\\\;) :-)
lzap
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.