终止一个 tmux 会话并选择另一个 tmux 会话

终止一个 tmux 会话并选择另一个 tmux 会话

我正在尝试绑定X执行以下操作:

  • 提示用户是否应该终止会话
  • 如果y输入,则终止会话
  • 会话被终止后选择另一个会话(最后一个、上一个或下一个会话)

一些类似的命令不太正确

  1. 终止会话并关闭终端:

    bind X confirm-before -p "Kill #S (y/n)?" kill-session
    
  2. 提示用户输入要终止的会话名称,并选择终止后的下一个会话:

    bind X command-prompt -p "kill:"  "switch-client -n \; kill-session -t '%%'"
    
  3. 我还没有找到类似命令的示例。这是一个不起作用的解决方案:

    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-shellrun-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"'
            }
        }
    }

相关内容