Lorsque vous quittez le dernier terminal d'une session tmux, peut-il passer à un autre?

12

Lorsque je quitte le dernier terminal d'une session tmux, il ferme automatiquement tmux et me renvoie au terminal parent. Est-il possible à la place de faire passer tmux à une autre session déjà en cours au lieu de fermer?

Je crée une nouvelle session nommée pour chaque tâche sur laquelle je travaille, comme TRxxx, e-mail, scratch, etc. et lorsque j'en ai terminé avec l'un d'entre eux, je ferme tous les terminaux en exécutant exit dans chacun d'eux. Lorsque vous exécutez exit dans le dernier terminal d'une session, tmux vous ramènera au terminal parent, mais est-il possible de le faire basculer vers l'une des autres sessions ouvertes à la place, donc je n'ai pas besoin de le rattacher?

Cette question est similaire à " Tuer une session tmux et sélectionner une autre session tmux " mais je veux fermer mes terminaux de la bonne façon en utilisant exit plutôt qu'en tuant la fenêtre.

David Holm
la source

Réponses:

2

Le plus proche que j'ai obtenu était une fonction tmux que j'ai écrite. Je quitte normalement le shell en appuyant sur Ctrl+ D, j'ai donc programmé tmuxpour quitter et changer de session lorsque vous appuyez sur [PREFIX] Ctrl+ D. Mettez ce qui suit dans votre .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;                                                     \
    "

Appuyez sur [PREFIX] Ctrl+ Det il quitte la session en cours si (et seulement si) il ne contient qu'un seul shell qui n'exécute aucune autre commande. Il passera à une autre session si possible. J'utilise le shell bash, vous devrez donc peut-être le changer en quelque chose que vous utilisez.

ps: au cas où cela compte, j'utilise actuellement tmux 1.9a.

gospes
la source
28

J'ai ajouté ceci à mon ~/.tmux.conf:

set-option -g detach-on-destroy off

Lorsque je détruis le dernier shell d'une session, il passe à une autre session active. Une fois toutes les sessions fermées, tmuxquitte.

RichN
la source
4
la bonne réponse devrait être mise à jour
cviejo
Veuillez adresser une pétition à l'affiche de la question.
RichN
Il est important de noter que tmux ne met pas à jour ce paramètre lors du détachement et du rattachement aux sessions existantes. Vous devez redémarrer le serveur tmux pour qu'il ait un effet.
nyi
2

Ajoutez ces lignes à votre .bashrcet essayez:

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
la source
1
C'est presque ce que je veux mais est-il possible de le changer pour qu'il ne fonctionne que si je quitte l'intérieur de tmux? Ce script s'attachera aux sessions tmux existantes chaque fois que j'ouvrirai un nouveau terminal. J'essaie d'avoir une session tmux pour les trucs locaux, puis j'ouvre un nouveau terminal lorsque ssh: ing sur une autre machine où j'aurai une session tmux séparée pour éviter de les imbriquer.
David Holm
Non, ce script démarrera une nouvelle session tmux chaque fois que vous ouvrirez un nouveau terminal, et non pas l'attacher à l'existant. Pouvez-vous fournir plus de détails, que voulez-vous dire par "Inside tmux"?
cuonglm
1
Disons que j'ai la session X et Y, où Y n'a qu'un seul terminal ouvert. J'exécute «exit» dans le dernier terminal de Y, ce qui entraînera la fin de la session. Dans ce cas, je voudrais que tmux passe à la session X au lieu de se terminer. Mais je ne veux pas qu'une session tmux soit attachée / créée chaque fois que je lance un nouveau terminal.
David Holm