Czy wychodząc z ostatniego terminala w sesji tmux, można go przełączyć na inny?

12

Kiedy wychodzę z ostatniego terminala w sesji tmux, automatycznie go zamknie i wróci do terminala nadrzędnego. Czy zamiast tego można zamieniać tmux na inną, już działającą, sesję zamiast zamykać?

Tworzę nową nazwaną sesję dla każdego zadania, nad którym pracuję, takiego jak TRxxx, e-mail, scratch itp., A kiedy skończę z jednym z nich, zamykam wszystkie terminale, uruchamiając exit w każdym z nich. Kiedy uruchomisz wyjście w ostatnim terminalu sesji, tmux odeśle cię do terminala nadrzędnego, ale czy jest możliwe, aby po prostu przełączył się na jedną z innych otwartych sesji, więc nie muszę się ponownie podłączać?

To pytanie jest podobne do „ Zabij sesję tmux i wybierz inną sesję tmux ”, ale chcę dobrze zamknąć terminale, używając wyjścia zamiast zabijania okna.

David Holm
źródło

Odpowiedzi:

2

Najbliższa mi była funkcja tmux, którą napisałem. Zwykle wychodzę z powłoki, naciskając Ctrl+ D, więc zaprogramowałem tmuxwyjście i przełączanie sesji po naciśnięciu [PREFIX] Ctrl+ D. Umieść w swoim .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;                                                     \
    "

Naciśnij [PREFIX] Ctrl+ Di kończy bieżącą sesję, jeśli (i tylko wtedy) posiada tylko jedną powłokę, która nie uruchamia żadnych innych poleceń. Jeśli to możliwe, przełączy się na inną sesję. Używam powłoki bash, więc może zajść potrzeba zmiany jej na coś, czego używasz.

ps: w razie potrzeby używam obecnie Tmux 1.9a.

ewangelie
źródło
29

Dodałem to do mojego ~/.tmux.conf:

set-option -g detach-on-destroy off

Kiedy zniszczę ostatnią powłokę w sesji, przełącza się ona na inną aktywną sesję. Po zamknięciu wszystkich sesji tmuxkończy się.

RichN
źródło
4
poprawna odpowiedź powinna zostać zaktualizowana
cviejo,
Proszę o złożenie petycji na plakat pytania.
RichN
Należy zauważyć, że tmux nie aktualizuje tego ustawienia podczas odłączania i ponownego podłączania do istniejących sesji. Musisz ponownie uruchomić serwer tmux, aby zadziałał.
nyi
2

Dodaj te linie do swojego .bashrci spróbuj:

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
źródło
1
To prawie to, czego chcę, ale czy można to zmienić, aby działało tylko wtedy, gdy wyjdę z tmuxa? Ten skrypt dołącza się do istniejących sesji tmux, ilekroć otworzę nowy terminal. Próbuję mieć sesję tmux dla lokalnych rzeczy, a następnie otwieram nowy terminal podczas ssh: ing na innej maszynie, gdzie będę miał osobną sesję tmux, aby uniknąć ich zagnieżdżenia.
David Holm
Nie, ten skrypt uruchamia nową sesję tmux za każdym razem, gdy otwierasz nowy terminal, a nie dołączasz do istniejącego. Czy możesz podać więcej szczegółów, co masz na myśli mówiąc „inside tmux”?
cuonglm
1
Powiedzmy, że mam sesję X i Y, gdzie Y ma tylko jeden terminal otwarty. Uruchomiam „exit” w ostatnim terminalu w Y, co spowoduje zakończenie sesji. W tym przypadku chciałbym, aby tmux przeszedł na sesję X zamiast kończyć. Nie chcę jednak dołączać / tworzyć sesji tmux za każdym razem, gdy uruchamiam nowy terminal.
David Holm