При выходе из последнего терминала в сеансе 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.


28

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

set-option -g detach-on-destroy off

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


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

1
Это почти то, что я хочу, но возможно ли изменить его так, чтобы оно работало, только если я выйду изнутри tmux? Этот скрипт будет подключаться к существующим сеансам tmux всякий раз, когда я открываю новый терминал. Я пытаюсь создать сеанс tmux для локальных вещей, а затем при открытии ssh: на другом компьютере открываю новый терминал, где у меня будет отдельный сеанс tmux, чтобы избежать их вложения.
Дэвид Холм

Нет, этот скрипт начнет новый сеанс tmux всякий раз, когда вы открываете новый терминал, а не присоединяетесь к существующему. Можете ли вы предоставить более подробную информацию, что вы имеете в виду "внутри tmux"?
cuonglm

1
Допустим, у меня есть сеанс X и Y, где у Y открыт только один терминал. Я запускаю «выход» в последнем терминале в Y, что приведет к завершению сеанса. В этом случае я бы хотел, чтобы tmux переключился на сеанс X вместо завершения. Но я не хочу, чтобы сеанс tmux был присоединен / создан всякий раз, когда я запускаю новый терминал.
Дэвид Холм
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.