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

Я пытаюсь связать 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\"" 

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

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

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

Предостережение для вышеупомянутого связывания состоит в том, что, поскольку все делается из run-shell , команды запускаются вне контекста какого-либо конкретного клиента или сеанса. Это действительно работает только потому, что клики «по умолчанию» (для switch-client ) и «по умолчанию» (для #S в display-message -p ) являются последними активными. Это работает так, как вы ожидали бы, пока у вас есть только один активный клиент (например, один пользователь, который не вводит другой клиент 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-sessionist предоставляет эту функциональность вместе со многими другими.

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

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