Beenden Sie eine tmux-Sitzung und wählen Sie eine andere tmux-Sitzung aus

11

Ich versuche zu binden X, um Folgendes zu tun:

  • Fragen Sie den Benutzer, ob die Sitzung beendet werden soll
  • Wenn yeingegeben, beenden Sie die Sitzung
  • Nachdem die Sitzung beendet wurde, wählen Sie eine andere Sitzung aus (letzte, vorherige oder nächste Sitzung).

Einige ähnliche Befehle, die nicht ganz richtig sind

  1. Beenden Sie die Sitzung und schließen Sie das Terminal:

    bind X confirm-before -p "Kill #S (y/n)?" kill-session
    
  2. Fordern Sie den Benutzer auf, den Namen der Sitzung zum Beenden einzugeben, und wählen Sie die nächste Sitzung nach dem Beenden aus:

    bind X command-prompt -p "kill:"  "switch-client -n \; kill-session -t '%%'"
    
  3. Ich konnte keine Beispiele für ähnliche Befehle finden. Hier ist eine Lösung, die nicht funktioniert:

    bind X confirm-before -p "Kill #S (y/n)?" "SESSION='#S' \; \
    switch-client -n \; kill-session -t \"$SESSION\""
    
Trey Hunner
quelle

Antworten:

12

Ich denke, das ist nah an dem, was Sie wollen:

bind-key X confirm-before -p "Kill #S (y/n)?" "run-shell 'tmux switch-client -n \\\; kill-session -t \"\$(tmux display-message -p \"#S\")\"'"

Ihr Ansatz Nr. 3 verläuft in die richtige Richtung, aber das Problem besteht darin, dass in der Befehlszeichenfolge confirm-beforekeine status-leftSubstitutionen im Stil (z. B. #S) vorgenommen werden.

Eine Einschränkung für die obige Bindung besteht darin, dass run-shelldie Befehle außerhalb des Kontexts eines bestimmten Clients oder einer bestimmten Sitzung ausgeführt werden , da alles von ab ausgeführt wird . Es funktioniert wirklich nur, weil der "Standard" -Client (für switch-client) und die "Standard" -Sitzung (für #Sin display-message -p) die zuletzt aktiven sind. Dies funktioniert wie erwartet, solange Sie nur einen einzigen aktiven Client haben (z. B. einen einzelnen Benutzer, der erst nach Beendigung der Ausführung der Shell-Befehle in einen anderen tmux- Client eingibt ). Es kann dramatisch fehlschlagen, wenn (z. B.) Sie die Bindung in tmux- Client A auslösen , aber tmux- Client B neue Eingaben empfängt, bevor die von gestartete Shell die run-shellMöglichkeit hatte, ihre Befehle auszuführen.

Diese besondere Rennbedingung scheint eine gute Motivation für die Bereitstellung von Client- / Sitzungs- / Fenster- / Fensterinformationen für run-shellBefehle zu sein. Es gibt einen TODO-Eintrag zum Erhalten if-shellund run-shellUnterstützen (optional?) status_replace()( status-leftDh-Substitutionen), obwohl vielleicht eine bessere Wahl wäre format_expand(), die eine Art neueres Super-Set von status_replace(Angebote #{client_tty}usw.) ist.

Chris Johnsen
quelle
Dies scheint genau das zu tun, wonach ich gesucht habe. Ich hatte eine ähnliche Methode ausprobiert, nachdem ich den tmux display-message -p "#S"Trick in einer anderen Antwort gefunden hatte. Es scheint, als wäre es der Schlüssel gewesen, alles in Run-Shell zu verpacken. Vielen Dank!
Trey Hunner
Wie geht das ohne confirm-before? Ich habe Probleme, die Flucht richtig zu machen.
Meilen
2
@ Meilen: Versuchen Sie dieses: bind-key X run-shell 'tmux switch-client -n \; kill-session -t "#S"'( tmux 1.8+ wird direkt run-shellerweitert #S, so dass wir das display-messageund sein zusätzliches Zitat weglassen können )
Chris Johnsen
1

Nur für den Fall, dass jemand auf diese Frage stößt - tmux-sessionist bietet diese Funktionalität zusammen mit vielen anderen.

anni
quelle
0

Es gibt eine andere Frage, die eine ähnliche Frage stellt, aber etwas anders ist.

Wenn Sie das Standardverhalten choose-sessionmit der zusätzlichen Funktion möchten, mit der die ursprüngliche Sitzung beendet wird, wenn keine anderen Clients daran gebunden sind, ist diese Frage möglicherweise auch von Interesse.

Sternenhimmel
quelle