При выходе из последнего терминала в сеансе tmux он может переключиться на другой?

12

Когда я выхожу из последнего терминала в сеансе tmux, он автоматически закрывает tmux и возвращает меня в родительский терминал. Возможно ли вместо этого переключить tmux на другую, уже запущенную сессию вместо закрытия?

Я создаю новый именованный сеанс для каждой задачи, над которой я работаю, такой как TRxxx, электронная почта, нуля и т. Д., И когда я закончу с одним из них, я закрываю все терминалы, выполняя exit в каждой. Когда вы запустите exit в последнем терминале сеанса, tmux вернет вас в родительский терминал, но возможно ли заставить его просто переключиться на один из других открытых сеансов вместо этого, чтобы мне не пришлось подключать его заново?

Этот вопрос похож на « Завершить сеанс tmux и выбрать другой сеанс tmux », но я хочу закрыть свои терминалы, используя выход, а не убивая окно.

Дэвид Холм
источник

Ответы:

2

Самым близким, что я получил, была функция tmux, которую я написал. Обычно я выхожу из оболочки нажатием Ctrl+ D, поэтому я запрограммировал tmuxвыход и переключать сессии при нажатии [PREFIX] Ctrl+ D. Поместите следующее в свой .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;                                                     \
    "

Нажмите [PREFIX] Ctrl+, Dи он выйдет из текущего сеанса, если (и только если) он содержит только одну оболочку, которая не выполняет никаких других команд. Он переключится на другой сеанс, если это возможно. Я использую оболочку bash, поэтому вам может потребоваться изменить ее на то, что вы используете.

PS: в случае, если это имеет значение, я в настоящее время использую tmux 1.9a.

gospes
источник
28

Я добавил это к моему ~/.tmux.conf:

set-option -g detach-on-destroy off

Когда я уничтожаю последнюю оболочку в сеансе, она переключается на другой активный сеанс. Как только все сессии закрыты, tmuxвыходы.

RichN
источник
4
правильный ответ должен быть обновлен к этому
cviejo
Пожалуйста, подайте петицию на плакат с вопросом.
RichN
Важно отметить, что tmux не обновляет этот параметр при отсоединении и повторном подключении к существующим сеансам. Вам нужно перезапустить сервер tmux, чтобы он заработал.
Ньи
2

Добавьте эти строки к себе .bashrcи попробуйте:

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
источник
1
Это почти то, что я хочу, но возможно ли изменить его так, чтобы оно работало, только если я выйду изнутри tmux? Этот скрипт будет подключаться к существующим сеансам tmux всякий раз, когда я открываю новый терминал. Я пытаюсь создать сеанс tmux для локальных вещей, а затем при открытии ssh: на другом компьютере открываю новый терминал, где у меня будет отдельный сеанс tmux, чтобы избежать их вложения.
Дэвид Холм
Нет, этот скрипт начнет новый сеанс tmux всякий раз, когда вы открываете новый терминал, а не присоединяетесь к существующему. Можете ли вы предоставить более подробную информацию, что вы имеете в виду "внутри tmux"?
cuonglm
1
Допустим, у меня есть сеанс X и Y, где у Y открыт только один терминал. Я запускаю «выход» в последнем терминале в Y, что приведет к завершению сеанса. В этом случае я бы хотел, чтобы tmux переключился на сеанс X вместо завершения. Но я не хочу, чтобы сеанс tmux был присоединен / создан всякий раз, когда я запускаю новый терминал.
Дэвид Холм