![终止一个 tmux 会话并选择另一个 tmux 会话](https://linux22.com/image/43900/%E7%BB%88%E6%AD%A2%E4%B8%80%E4%B8%AA%20tmux%20%E4%BC%9A%E8%AF%9D%E5%B9%B6%E9%80%89%E6%8B%A9%E5%8F%A6%E4%B8%80%E4%B8%AA%20tmux%20%E4%BC%9A%E8%AF%9D.png)
我正在尝试绑定X
执行以下操作:
- 提示用户是否应该终止会话
- 如果
y
输入,则终止会话 - 会话被终止后选择另一个会话(最后一个、上一个或下一个会话)
一些类似的命令不太正确
终止会话并关闭终端:
bind X confirm-before -p "Kill #S (y/n)?" kill-session
提示用户输入要终止的会话名称,并选择终止后的下一个会话:
bind X command-prompt -p "kill:" "switch-client -n \; kill-session -t '%%'"
我还没有找到类似命令的示例。这是一个不起作用的解决方案:
bind X confirm-before -p "Kill #S (y/n)?" "SESSION='#S' \; \ switch-client -n \; kill-session -t \"$SESSION\""
答案1
我认为这很接近你想要的:
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
-style 替换(例如)。#S
上述绑定的一个警告是,由于所有操作都是在 from 中完成的run-shell
,因此命令在任何特定客户端或会话的上下文之外运行。它确实有效,因为“默认”客户端(对于switch-client
)和“默认”会话(对于#S
)是最近活动的客户端。只要您只有一个活动客户端(例如,不向另一个用户输入内容的单个用户),这就会如您所期望的那样进行多路复用器客户端直到 shell 命令完成运行之后);如果(例如)您触发绑定,它可能会戏剧性地失败多路复用器客户端 A,但新输入被接收多路复用器客户端 B 在 shell 启动之前run-shell
有机会运行其命令。
这种特殊的竞争条件似乎是向run-shell
命令提供客户端/会话/窗口/窗格信息的一个很好的动机。有一个关于获取if-shell
和run-shell
支持(可选?)status_replace()
(即status-left
样式替换)的 TODO 条目,尽管也许更好的选择是format_expand()
,这是一种较新的超集status_replace
(offers#{client_tty}
等)。
答案2
以防万一有人偶然发现这个问题 -tmux-会话者提供此功能以及许多其他功能。
答案3
您也可以set-option -g detach-on-destroy off
像往常一样简单地添加到您的配置并终止会话。
答案4
我想出了克里斯的答案的(主观上)更强大和可读的版本:
bind-key X \
if-shell '[ "$(tmux display -p "#{session_many_attached}")" -gt 0 ]' {
# the session is attached to multiple clients, so we can just switch the client to a different session.
choose-session
} {
# we are the last client attached to this session; kill it.
# we need to use `run-shell` to ensure that the current session number is expanded *before* we switch to the new session.
confirm -p 'Kill #S (y/n)?' {
choose-tree -s {
run-shell 'tmux switch-client -t "%%" \; kill-session -t "#S"'
}
}
}