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


11

我试图绑定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\""
    

Answers:


12

我认为这接近您想要的:

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)。

上述绑定的一个警告是,由于所有操作都是从中完成的run-shell,因此命令是在任何特定客户端或会话的上下文之外运行的。它实际上仅能工作,因为“默认”客户端(用于switch-client)和“默认”会话(用于#S)是最近活动的客户端。只要您只有一个活动的客户端(例如,只有在shell命令完成运行后才键入另一个tmux客户端的单个用户),这就能按您期望的那样工作;如果(例如)您在tmux客户端A中触发了绑定,则可能会失败,但是在启动shell之前,tmux客户端B 会收到新的输入,run-shell从而有机会运行其命令。

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


这似乎完全符合我的期望。tmux display-message -p "#S"在另一个答案中找到窍门后,我尝试了一种类似的方法。似乎将所有内容包装在运行外壳中是关键。谢谢!
Trey Hunner,2012年

没有它,您如何做到这一点confirm-before?我无法正确地进行转义。
英里

2
@Miles:试试这个:bind-key X run-shell 'tmux switch-client -n \; kill-session -t "#S"'TMUX 1.8+ run-shell膨胀#S直接,所以我们得到省略display-message其额外报价)
克里斯·约翰森


0

还有另一个问题提出了类似的问题,但有一点不同。

如果您希望标准choose-session行为具有附加功能,如果没有其他客户端保持连接,它将终止原始会话,那么该问题也可能引起您的兴趣。


0

从上面的Chris Johnsen答案(在评论中)展开,介绍如何在没有提示或的情况下执行此操作confirm-before

bind-key X run-shell 'tmux switch-client -n \; kill-session -t "#S"'

如果仅剩1个会话(您当前正在使用的会话)并运行命令,则会收到“错误”消息,并且该会话不会被终止。通常(如果您像我一样),即使没有其他可以切换的会话,您也希望该命令保持该会话的终止状态。所以这是我想出的:

bind-key X if-shell '[ $(tmux list-sessions | wc -l) -ne 1 ]' \
                    "run-shell 'tmux switch-client -n \\\; kill-session -t \"#S\"'" \
                    "run-shell 'tmux kill-session -t \"#S\"'"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.