我使用 tmux 進行開發,我有一個任務在一個視窗中運行,另一個任務在它自己的視窗中運行。我已設定約定,專案目錄的基本名稱是 tmux 會話名稱。
export SESSION_NAME="my-project-name"
tmux kill-session -t "$SESSION_NAME"
tmux new-session -s "$SESSION_NAME" \
"api.start --monitored" \; \
split-window "ui.start --monitored" \; \
select-layout tiled \; \
set-option -w remain-on-exit on \; \
set-option -w mouse on \; \
set-option -g mouse on \; \
bind-key -n C-c kill-session -t "$SESSION_NAME"
一切似乎都正常,除非以相同的約定啟動不同的項目,不知何故,第一個會話中的 CTRL+c 認為 SESSION_NAME 是最近的 tmux 生成的會話之一,這不是我所希望的。
答案1
在您發布的程式碼片段中,$SESSION_NAME
shell 擴展了每個外觀,並且每個外觀都tmux
將擴展值作為命令列參數。
(即使它沒有,而且您想$SESSION_NAME
稍後在 tmux 內或 tmux 內的 shell 內擴展它,您export SESSION_NAME="my-project-name"
可能是徒勞的,因為tmux
環境如何建設。該update-environment
選項或new-session -e …
命令可能有用。
這包括$SESSION_NAME
在bind-key -n C-c kill-session -t "$SESSION_NAME"
.你的tmux
執行:
bind-key -n C-c kill-session -t my-project-name
然後對於不同的項目,tmux 指令如下:
bind-key -n C-c kill-session -t different-name
重要的是bind-key
它本身並不針對單一會話。改變整個 tmux 伺服器的+bind-key -n C-c …
行為。在您的情況下,最後一個會覆蓋先前的作業,然後在任何會話中都會覆蓋+ 。Ctrlcbind-key
Ctrlckill-session -t different-name
我想您可以使用該key-table
選項將預設金鑰表設為除 之外的其他內容root
,分別為每個會話設定預設金鑰表。在每個新的密鑰表中,您可以為C-c
.這個我沒測試過,我思考也許有可能。
如果我是你,我會做更簡單的事。我會這樣做:
tmux bind-key -n C-c kill-session
kill-session
沒有-t
目標的目前的會話,因此此綁定應該執行您想要的操作my-project-name
,different-name
或任何其他會話。
坦白說,「任何其他會議」對我來說都太多了。我不想Ctrl+c殺死我的一切一般用途會話。我會解決這個問題:
要么
C-c
不理會並選擇另一個擊鍵作為“全局SIGINT”,然後無意中使用其中一個;或透過明確地將應使用Ctrl+的會話「標記」c為「全域 SIGINT」。可能是這樣的:
tmux new-session -e 'TMUX_GLOBAL_SIGINT=1' \; \ bind-key -n C-c if-shell '[ -n "$TMUX_GLOBAL_SIGINT" ]' kill-session 'send-keys C-c'
TMUX_GLOBAL_SIGINT
現在,在其環境中具有非空變數的每個會話中Ctrl+c將終止該會話。在每個會話中,如果TMUX_GLOBAL_SIGINT
為空或未設定Ctrl+,c則將照常工作。筆記:
tmux set-environment -u TMUX_GLOBAL_SIGINT
對於已啟動的會話,您可以使用或變更設定tmux set-environment TMUX_GLOBAL_SIGINT 1
(用於-t
定位特定會話,不一定是目前會話)。在 tmux 中啟動的 shell(或另一個程式)可以繼承
TMUX_GLOBAL_SIGINT
.如果它運行tmux new-session …
,那麼(取決於等等update-environment
)新會話也可能繼承該變量,即使沒有顯式的-e 'TMUX_GLOBAL_SIGINT=1'
.閱讀man 1 tmux
並了解 tmux 如何管理環境。