我想要一个类似于choose-session
( PREFIX s
) 的 Tmux 命令,但如果选择另一个会话,则会终止当前会话。
理想情况下,如果当前会话附加在其他地方,该命令将分离当前会话,但如果这是唯一的附件,则将其终止。这可以通过以下方式发现tmux display -p '#{session_many_attached}'
有一个类似的问题但它已经很老了,并且以相反的方式提出问题(查询、杀死、连接)。
答案1
这会绑定PREFIX C-s
选择一个会话,切换到它,然后终止前一个会话:
bind-key C-s \
if-shell "(($(tmux display -p '#{session_many_attached}') > 0))" \
choose-session \
"run-shell \"tmux choose-session \\\"switch-client -t '%%'; kill-session -t '$(tmux display -p '#S')'\\\"\""
我使用过 shell 表达式(另一个不使用 shell 的答案会很棒!)。首先,我使用 Tmux 来if-shell
确定是否有多个附加客户端。如果有的话我就调用标准choose-session
命令。
但是,如果这是附加到会话的唯一客户端,我会将自定义命令传递给 ,choose-session
但我在 shell 中执行此操作(使用run-shell
),以便我可以构建传递给 的命令行choose-session
。
该命令行由两个命令组成:
switch-client -t '%%'
这是choose-session
默认使用的(请参阅 参考资料man tmux
的解释)。kill-session -t '$(tmux display -p '#S')'
首先使用子shell来获取名称当前的session(它尚未被销毁)并将其作为参数传递给kill-session
.
最终命令需要大量转义才能使其工作。它if-shell
采用三个参数:一个 shell 命令和两个 tmux 命令。如果它们包含空格,则需要用引号引起来。所以,第三种说法run-shell...
是相当恶劣的!
(tmux 2.3)