Tmux
終止一個 tmux 會話並選擇另一個 tmux 會話
我正在嘗試綁定
X
執行以下操作:
- 提示使用者是否應該終止會話
- 如果
y
輸入,則終止會話- 在會話被終止後選擇另一個會話(最後一個、上一個或下一個會話)
一些不太正確的類似命令
- 終止會話並關閉終端:
bind X confirm-before -p "Kill #S (y/n)?" kill-session
- 提示使用者輸入要終止的會話名稱,並在終止後選擇下一個會話:
bind X command-prompt -p "kill:" "switch-client -n \; kill-session -t '%%'"
- 我一直無法找到類似命令的範例。這是一個不起作用的解決方案:
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
,因此命令在任何特定客戶端或會話的上下文之外執行。它實際上只起作用,因為“預設”客戶端(forswitch-client
)和“預設”會話(for#S
)是最近活躍的。只要您只有一個活動客戶端(例如,在 shell 命令完成執行後才輸入另一個tmux客戶端的單個使用者),這就會如您所願;如果(例如)您在tmux客戶端 A 中觸發綁定,它可能會嚴重失敗,但是在啟動的 shell有機會執行其命令之前, tmux客戶端 B接收到新輸入。run-shell
這種特殊的競爭條件似乎是向
run-shell
命令提供客戶端/會話/視窗/窗格資訊的一個很好的動機。有一個關於獲取if-shell
和run-shell
支持(可選?)的 TODO 條目status_replace()
(即status-left
- 樣式替換),儘管可能更好的選擇是format_expand()
,這是一種較新的超集status_replace
(提供#{client_tty}
等)。