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

sta*_*fry 4 tmux

我想要一个类似于choose-session( PREFIX s)的 Tmux 命令,但如果选择另一个会终止当前会话。

理想情况下,如果当前会话附加在其他地方,则该命令将分离当前会话,但如果这是唯一的附件,则将其终止。这可以通过tmux display -p '#{session_many_attached}'


有一个类似的问题,但它已经很老了,并且会反过来问这个问题(查询、杀死、连接)。

sta*_*fry 5

这绑定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')'\\\"\""
Run Code Online (Sandbox Code Playgroud)

我使用过 shell 表达式(另一个不使用 shell 的答案会很棒!)。首先我使用 Tmuxif-shell来决定是否有多个附加的客户端。如果有,那么我只调用标准choose-session命令。

但是,如果这是连接到会议的唯一客户端,我通过一个自定义的命令choose-session,但我做的外壳(带run-shell),这样我可以建立命令行传递choose-session

该命令行由两个命令构成:

  • switch-client -t '%%'这是choose-session默认情况下使用的(man tmux有关解释,请参阅)。
  • kill-session -t '$(tmux display -p '#S')'首先使用一个子shell来获取当前会话的名称(它还没有被销毁)并将其作为参数传递给kill-session.

最后一个命令需要大量的转义才能使其工作。将if-shell有三个参数:一个shell命令和两个TMUX命令。如果它们包含空格,则需要引用它们。因此,第三个论点run-shell...是相当讨厌的!

(tmux 2.3)