Убейте сеанс tmux и выберите другой сеанс tmux


11

Я пытаюсь Xсделать следующее:

  • подскажите пользователю, должен ли сеанс быть уничтожен
  • если yвведено, убить сессию
  • после завершения сеанса выберите другой сеанс (последний, предыдущий или следующий сеанс)

Некоторые похожие команды, которые не совсем верны

  1. Завершите сеанс и закройте терминал:

    bind X confirm-before -p "Kill #S (y/n)?" kill-session
    
  2. Запрашивает у пользователя имя сеанса для уничтожения и выбирает следующий сеанс после уничтожения:

    bind X command-prompt -p "kill:"  "switch-client -n \; kill-session -t '%%'"
    
  3. Я не смог найти примеры подобных команд. Вот решение, которое не работает:

    bind X confirm-before -p "Kill #S (y/n)?" "SESSION='#S' \; \
    switch-client -n \; kill-session -t \"$SESSION\""
    

Ответы:


12

Я думаю, что это близко к тому, что вы хотите:

bind-key X confirm-before -p "Kill #S (y/n)?" "run-shell 'tmux switch-client -n \\\; kill-session -t \"#S\"'"

Ваш подход № 3 идет по правильному пути, но проблема в том, что confirm-beforeон не выполняет status-leftподстановки в стиле (например #S) в своей командной строке.

Предостережение для вышеупомянутой привязки состоит в том, что, поскольку все сделано из run-shell, команды выполняются вне контекста любого конкретного клиента или сеанса. Это действительно работает только потому, что клиент по умолчанию (для switch-client) и сеанс по умолчанию (для #S) являются самыми последними активными. Это работает, как и следовало ожидать, если у вас есть только один активный клиент (например, один пользователь, который не вводит данные в другой клиент tmux до тех пор, пока команды оболочки не будут завершены); он может резко потерпеть неудачу, если (например) вы инициируете привязку в клиенте tmux A, но клиент tmux B получает новый входной сигнал до того, как запущенная оболочка сможет run-shellвыполнить свои команды.

Это конкретное состояние гонки кажется хорошей мотивацией для предоставления run-shellкомандам информации о клиенте / сеансе / окне / панели . Существует запись TODO о получении if-shellи run-shellподдержке (необязательно?) status_replace()( status-leftТо есть подстановки в стиле), хотя, возможно, будет лучший выбор format_expand(), который является своего рода новым супер-набором status_replace(предложения #{client_tty}и т. Д.).


Кажется, это именно то, что я искал. Я попробовал подобный метод после нахождения tmux display-message -p "#S"хитрости в другом ответе. Кажется, что завершение всего в run-shell было ключом. Спасибо!
Трей Ханнер

Как ты это делаешь без confirm-before? У меня проблемы с правильным побегом.
Майлз

2
@Miles: попробуйте это: bind-key X run-shell 'tmux switch-client -n \; kill-session -t "#S"'( tmux 1.8+ run-shellрасширяется #Sнапрямую, поэтому мы можем опустить display-messageи его дополнительные цитаты)
Крис Джонсен

1

На всякий случай, если кто-то наткнется на этот вопрос - tmux-sessionist предоставляет эту функциональность наряду со многими другими.


0

Есть еще один вопрос, который задает аналогичный вопрос, но он немного отличается.

Если вам нужно стандартное choose-sessionповедение с дополнительной функцией, которая убивает исходный сеанс, если другие клиенты не остаются подключенными к нему, тогда этот вопрос также может представлять интерес.


0

Расширяя ответ Криса Джонсена (в комментариях) выше, о том, как это сделать без приглашения или confirm-before:

bind-key X run-shell 'tmux switch-client -n \; kill-session -t "#S"'

Если остался только 1 сеанс (сеанс, в котором вы сейчас находитесь), и вы выполните команду, вы получите сообщение об ошибке, и сеанс не прерван. Обычно (если вы похожи на меня) вы хотите, чтобы команда продолжала уничтожать сеанс, даже если нет другого сеанса, на который она может переключиться. Итак, вот что я придумаю:

bind-key X if-shell '[ $(tmux list-sessions | wc -l) -ne 1 ]' \
                    "run-shell 'tmux switch-client -n \\\; kill-session -t \"#S\"'" \
                    "run-shell 'tmux kill-session -t \"#S\"'"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.