Я думаю, что это близко к тому, что вы хотите:
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
? У меня проблемы с правильным побегом.bind-key X run-shell 'tmux switch-client -n \; kill-session -t "#S"'
( tmux 1.8+run-shell
расширяется#S
напрямую, поэтому мы можем опуститьdisplay-message
и его дополнительные цитаты)На всякий случай, если кто-то наткнется на этот вопрос - tmux-sessionist предоставляет эту функциональность наряду со многими другими.
источник
Есть еще один вопрос, который задает аналогичный вопрос, но он немного отличается.
Если вам нужно стандартное
choose-session
поведение с дополнительной функцией, которая убивает исходный сеанс, если другие клиенты не остаются подключенными к нему, тогда этот вопрос также может представлять интерес.источник
Расширяя ответ Криса Джонсена (в комментариях) выше, о том, как это сделать без приглашения или
confirm-before
:Если остался только 1 сеанс (сеанс, в котором вы сейчас находитесь), и вы выполните команду, вы получите сообщение об ошибке, и сеанс не прерван. Обычно (если вы похожи на меня) вы хотите, чтобы команда продолжала уничтожать сеанс, даже если нет другого сеанса, на который она может переключиться. Итак, вот что я придумаю:
источник