Kann das letzte Terminal in einer tmux-Sitzung zu einem anderen wechseln?

12

Wenn ich das letzte Terminal in einer tmux-Sitzung verlasse, wird tmux automatisch geschlossen und ich kehre zum übergeordneten Terminal zurück. Ist es möglich, dass tmux stattdessen zu einer anderen, bereits laufenden Sitzung wechselt, anstatt zu schließen?

Ich erstelle eine neue benannte Sitzung für jede Aufgabe, an der ich arbeite, wie z. B. TRxxx, E-Mail, Scratch usw., und wenn ich mit einer davon fertig bin, schließe ich alle Terminals, indem ich in jeder Aufgabe exit ausführe. Wenn Sie exit im letzten Terminal einer Sitzung ausführen, kehrt tmux zum übergeordneten Terminal zurück. Ist es jedoch möglich, dass es stattdessen einfach zu einer der anderen offenen Sitzungen wechselt, damit ich keine erneute Verbindung herstellen muss?

Diese Frage ähnelt " Eine tmux-Sitzung beenden und eine andere tmux-Sitzung auswählen ", aber ich möchte meine Terminals auf nette Weise schließen, indem ich exit verwende, anstatt das Fenster zu beenden .

David Holm
quelle

Antworten:

2

Am nächsten kam mir eine tmux-Funktion, die ich geschrieben habe. Normalerweise verlasse ich die Shell, indem ich Ctrl+ drücke D, also habe ich programmiert tmux, Sitzungen zu beenden und zu wechseln, wenn ich [PREFIX] Ctrl+ drücke D. Geben Sie Folgendes in Ihre ein .tmux.conf:

bind C-d run-shell "                                        \
    if [ #{session_windows} -eq 1 ] &&                      \
       [ #{window_panes}    -eq 1 ] &&                      \
       [ #{pane_current_command}  = 'bash' ]; then          \
        if [ \$(tmux list-sessions | wc -l) -ge 2 ]; then   \
            tmux switch-client -ln;                         \
        fi; tmux kill-session -t \"#S\";                    \
    else                                                    \
        tmux display-message \"Ignoring kill session...\";  \
    fi;                                                     \
    "

Drücken Sie [PREFIX] Ctrl+ Dund es wird die aktuelle Sitzung beendet, wenn (und nur wenn) nur eine Shell enthalten ist, auf der keine anderen Befehle ausgeführt werden. Wenn möglich, wird zu einer anderen Sitzung gewechselt. Ich verwende die Bash-Shell, daher müssen Sie sie möglicherweise in etwas ändern, das Sie verwenden.

ps: falls es darauf ankommt, verwende ich momentan tmux 1.9a.

Gospes
quelle
27

Ich habe dies zu meinem hinzugefügt ~/.tmux.conf:

set-option -g detach-on-destroy off

Wenn ich die letzte Shell in einer Sitzung zerstöre, wechselt sie zu einer anderen aktiven Sitzung. Sobald alle Sitzungen geschlossen sind, wird das tmuxProgramm beendet.

RichN
quelle
3
Die richtige Antwort sollte darauf aktualisiert werden
cviejo
Bitte beantragen Sie das Poster der Frage.
RichN
Es ist wichtig zu beachten, dass tmux diese Einstellung beim Trennen und erneuten Anhängen an vorhandene Sitzungen nicht aktualisiert. Sie müssen den tmux-Server neu starten, damit er wirksam wird.
Nyi
2

Fügen Sie diese Zeilen zu Ihrem hinzu .bashrcund versuchen Sie:

if which tmux 2>&1 >/dev/null 
then
    # start a new session if not exist
    test -z ${TMUX} && tmux

    # when quitting tmux, try to attach to other session
    while test -z ${TMUX}; do
        tmux attach || break
    done
fi
cuonglm
quelle
1
Es ist fast das, was ich will, aber ist es möglich, es so zu ändern, dass es nur ausgeführt wird, wenn ich aus tmux herauskomme? Dieses Skript wird an vorhandene tmux-Sitzungen angehängt, wenn ich ein neues Terminal öffne. Ich versuche, eine tmux-Sitzung für lokale Inhalte zu haben, und öffne dann ein neues Terminal, wenn ich auf einen anderen Computer ssh: gehe, auf dem ich eine separate tmux-Sitzung habe, um zu vermeiden, dass sie verschachtelt werden.
David Holm
Nein, dieses Skript startet eine neue tmux-Sitzung, wenn Sie ein neues Terminal öffnen und keine Verbindung zu einem vorhandenen herstellen. Können Sie weitere Details angeben, was meinen Sie mit "inside tmux"?
Cuonglm
1
Angenommen, ich habe Sitzung X und Y, in der Y nur ein Terminal geöffnet hat. Ich führe 'exit' im letzten Terminal in Y aus, wodurch die Sitzung beendet wird. In diesem Fall möchte ich, dass tmux zu Sitzung X wechselt, anstatt zu beenden. Ich möchte jedoch nicht, dass eine tmux-Sitzung angehängt / erstellt wird, wenn ich ein neues Terminal starte.
David Holm