私は開発に tmux を使用しています。1 つのタスクをウィンドウ内で実行し、もう 1 つのタスクを独自のウィンドウで実行しています。プロジェクト ディレクトリのベース名が 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 つであると認識されてしまいます。これは期待していた結果ではありません。
答え1
あなたが投稿したスニペットでは、 のすべての出現$SESSION_NAME
がシェルによって展開され、それぞれがtmux
展開された値をコマンドライン引数として取得します。
(たとえそうでなかったとしても、これを$SESSION_NAME
後でtmux内またはtmux内のシェル内で展開したい場合、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または、 + を「グローバル SIGINT」として使用する必要があるセッションを明示的に「マーク」することによっても実現cできます。次のようになります。
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 で起動されたシェル (または別のプログラム) は を継承する場合があります
TMUX_GLOBAL_SIGINT
。 実行されるtmux new-session …
と ( や などに応じてupdate-environment
)、明示的な がなくても、新しいセッションは 変数も継承する場合があります-e 'TMUX_GLOBAL_SIGINT=1'
。man 1 tmux
tmux が環境を管理する方法について読んで学習してください。