Убийте сеанс 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та додаткове цитування)
Chris Johnsen

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.