Wie kann ich mehrere tmux-Befehle an einen Tastendruck binden?

13

Insbesondere versuche ich, eine Benachrichtigung zu geben, nachdem ein Befehl ausgeführt wurde. Wenn ich zum Beispiel meine Konfigurationsdatei neu lade, hätte ich gerne eine Bestätigung, dass sie funktioniert hat. Dies könnte etwa so aussehen:

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

Das geht aber nicht. Ich habe auch keine anderen Dinge versucht, um Befehle aneinander zu reihen.

Bilderstürmer
quelle
1
Es funktioniert bei mir (tmux 1.3 unter Debian squeeze) mit \;als Trennzeichen.
Gilles 'SO- hör auf böse zu sein'
1
Okay, ich habe das gefunden \; funktioniert , und das ist der Kern der Antwort, die ich unten gewählt habe. Irgendwie habe ich getestet \; zu schnell und entschlossen hat es nicht funktioniert. Aber ich lasse diese Frage hier, da sie immer noch dazu dient, die Frage zu beantworten, wie das geht.
Iconoclast

Antworten:

12

Sie könnten die run-shellOption verwenden , aber das Entscheidende ist, die Befehle mit zu trennen\;

In diesem Fall etwas wie:

bind R source-file ~/.tmux.conf \; run-shell "echo 'Reload'"

Run-shell shell-command
(alias: run)
Ausführen shell-Befehl im Hintergrund , ohne ein Fenster zu schaffen. Nach Abschluss wird jede Ausgabe an stdout im Kopiermodus angezeigt. Wenn der Befehl nicht erfolgreich ist, wird auch der Beendigungsstatus angezeigt.

jasonwryan
quelle
Hey, danke für die Antwort. Ich habe das nicht speziell getestet, aber ich glaube nicht, dass es funktionieren wird, da ich den Code in meiner Frage mit \ getestet habe. und es wurde nur der zweite Befehl ausgeführt, aber nicht der erste. Und ich weiß nicht, warum die Run-Shell funktionieren würde, die Display-Meldung jedoch nicht.
Iconoclast
1
Okay, ich habe versucht, Ihre Lösung zu testen, und tmux bleibt anscheinend (wenn auch nicht mit absoluter Sicherheit) von diesem Befehl abgeschaltet. Ich werde es weiter versuchen, aber ich bin mir ziemlich sicher, dass es nicht funktioniert ...
iconoclast
Es funktioniert unter tmux 1.4. Bedeutet "Sperren" "
Kopiermodus
okay, ich habe es zum Laufen gebracht, ohne tmux einzusperren. Das ließ mich bei der Frage zurück, warum mein ursprünglicher Versuch, \; hat nicht funktioniert:
iconoclast
1
Das Herzstück Ihrer Antwort ist die Verwendung von \; - Der Teil über die Run-Shell ist nicht wirklich wichtig, und ich denke, für das Beispiel, das ich Display-Nachricht gab, ist viel besser. Also wähle ich Ihre Antwort über meine, aber würde es Ihnen etwas ausmachen, die Antwort so zu bearbeiten, dass sie andere Menschen nicht irreführt oder verwirrt? Vielen Dank!
Iconoclast
4

Kurz nachdem ich meine Frage gestellt hatte, fiel mir etwas ein, das funktionieren könnte. Ich habe es versucht und es funktioniert, Sie müssen nur mehrere Dateien für Ihre tmux-Konfiguration in Kauf nehmen.

Hier ist die Lösung, insbesondere in Bezug auf das Neuladen Ihrer Konfiguration. Fügen Sie in Ihre .tmux.conf-Datei Folgendes ein:

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

In die Datei ~ / .tmux / reload.tmux schreiben Sie folgendes:

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

Das funktioniert einwandfrei.

Bilderstürmer
quelle
1
Dies ist eigentlich die EINZIGE Möglichkeit, wie es funktioniert. Alles andere hier funktioniert einfach nicht.
lzap
Wirklich? ... Es ist schon eine Weile her, dass ich den anderen Ansatz getestet habe, aber ich wäre überrascht, wenn tmux das kaputt gemacht hätte. Wenn Sie absolut sicher sind, dass es nicht funktioniert, werde ich es erneut testen und möglicherweise stattdessen diese Antwort akzeptieren.
Iconoclast
Ja, ich entschuldige mich, die obige Antwort funktioniert wirklich :-)
lzap
1

Bei Verwendung der Run-Shell-Methode wird die Ausgabe in den Kopierpuffer verschoben, der manuell gelöscht werden muss. Die Verwendung einer Zwischenkonfigurationsdatei erhöht den Aufwand für die Verwaltung einer zweiten Konfigurationsdatei. In meinem Fall funktioniert das Kombinieren beider Antworten besser, da ich wollte, dass die Nachricht nach einem kurzen Intervall verschwindet, ähnlich einem Popup-Dialogfeld in einer GUI, aber alles in einer einzigen Datei enthalten bleibt.

bind R source-file ~/.tmux.conf \; display-message "Configuration reloaded"
Chris
quelle
0

Es gibt einen Patch, der die vollständige Skripterstellung in tmux ermöglicht und die tcl-Sprache an die internen Elemente anfügt.

http://ershov.github.io/tmux/

Außerdem können Sie so viele Aktionen angeben, wie Sie für die Tastenanschläge im Modus möchten.

Damit würde Ihr Code so aussehen:

bind R tcl { source-file "$HOME/.tmux.conf" ; display-message "Configuration reloaded." }

oder noch besser lesbar:

bind R tcl {
  source-file "$HOME/.tmux.conf"
  display-message "Configuration reloaded."
}
Yuriy Ershov
quelle