在 tmux 中,如何通过选择另一个会话并杀死当前会话来替换当前会话?

在 tmux 中,如何通过选择另一个会话并杀死当前会话来替换当前会话?

我想要一个类似于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)

相关内容