杀死一个 tmux 会话并选择另一个 tmux 会话

Tre*_*ner 11 tmux

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

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

一些不太正确的类似命令

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

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

    bind X command-prompt -p "kill:"  "switch-client -n \; kill-session -t '%%'"
    
    Run Code Online (Sandbox Code Playgroud)
  3. 我一直无法找到类似命令的示例。这是一个不起作用的解决方案:

    bind X confirm-before -p "Kill #S (y/n)?" "SESSION='#S' \; \
    switch-client -n \; kill-session -t \"$SESSION\""
    
    Run Code Online (Sandbox Code Playgroud)

Chr*_*sen 13

我认为这接近你想要的:

bind-key X confirm-before -p "Kill #S (y/n)?" "run-shell 'tmux switch-client -n \\\; kill-session -t \"#S\"'"
Run Code Online (Sandbox Code Playgroud)

您的 #3 方法是正确的,但问题是在其命令字符串confirm-before中没有进行status-left-style 替换(例如#S)。

上述绑定的一个警告是,由于一切都在 from 中完成run-shell,因此命令在任何特定客户端或会话的上下文之外运行。它确实有效,因为“默认”客户端(for switch-client)和“默认”会话(for #S)是最近活跃的。只要您只有一个活动客户端(例如,在 shell 命令完成运行之前,一个用户不会输入另一个tmux客户端),这就像您期望的那样;如果(例如)您在tmux客户端 A 中触发绑定,它可能会严重失败,但是在启动的 shell有机会运行其命令之前,tmux客户端 B接收到新输入run-shell

这种特殊的竞争条件似乎是为命令提供客户端/会话/窗口/窗格信息的一个很好的动机run-shell。有一个关于获取if-shellrun-shell支持(可选?)status_replace()(即status-left- 样式替换)的 TODO 条目,但也许更好的选择是format_expand(),这是一种较新的超集status_replace(优惠#{client_tty}等)。

  • @Miles:试试这个:`bind-key X run-shell 'tmux switch-client -n \; kill-session -t "#S"'`(*tmux* 1.8+ `run-shell` 直接扩展了 `#S`,因此我们可以省略 `display-message` 及其额外的引用) (3认同)