Tmux

終止一個 tmux 會話並選擇另一個 tmux 會話

  • August 24, 2021

我正在嘗試綁定X執行以下操作:

  • 提示使用者是否應該終止會話
  • 如果y輸入,則終止會話
  • 在會話被終止後選擇另一個會話(最後一個、上一個或下一個會話)

一些不太正確的類似命令

  1. 終止會話並關閉終端:
bind X confirm-before -p "Kill #S (y/n)?" kill-session
  1. 提示使用者輸入要終止的會話名稱,並在終止後選擇下一個會話:
bind X command-prompt -p "kill:"  "switch-client -n \; kill-session -t '%%'"
  1. 我一直無法找到類似命令的範例。這是一個不起作用的解決方案:
bind X confirm-before -p "Kill #S (y/n)?" "SESSION='#S' \; \
switch-client -n \; kill-session -t \"$SESSION\""

我認為這接近你想要的:

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- 樣式替換(例如)。#S

上述綁定的一個警告是,由於一切都是在 from 中完成的run-shell,因此命令在任何特定客戶端或會話的上下文之外執行。它實際上只起作用,因為“預設”客戶端(for switch-client)和“預設”會話(for #S)是最近活躍的。只要您只有一個活動客戶端(例如,在 shell 命令完成執行後才輸入另一個tmux客戶端的單個使用者),這就會如您所願;如果(例如)您在tmux客戶端 A 中觸發綁定,它可能會嚴重失敗,但是在啟動的 shell有機會執行其命令之前, tmux客戶端 B接收到新輸入。run-shell

這種特殊的競爭條件似乎是向run-shell命令提供客戶端/會話/視窗/窗格資訊的一個很好的動機。有一個關於獲取if-shellrun-shell支持(可選?)的 TODO 條目status_replace()(即status-left- 樣式替換),儘管可能更好的選擇是format_expand(),這是一種較新的超集status_replace(提供#{client_tty}等)。

引用自:https://unix.stackexchange.com/questions/58588