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\""
    

回答:


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#S

上記のバインディングの注意点は、すべてがから行われるrun-shellため、コマンドは特定のクライアントまたはセッションのコンテキスト外で実行されるということです。「デフォルト」のクライアント(の場合switch-client)と「デフォルト」のセッション(の場合#S)が最近アクティブなものであるため、実際に機能するのはこの場合だけです。これは、アクティブなクライアントが1つしかない限り(たとえば、シェルコマンドの実行が終了するまで別のtmuxクライアントに入力しない単一のユーザー)、期待どおりに機能します。(たとえば)tmuxクライアントAでバインディングをトリガーした場合、劇的に失敗する可能性がありますが、によって起動されたシェルがコマンドを実行する前に、新しい入力がtmuxクライアントB によって受信されrun-shellます。

この特定の競合状態は、クライアント/セッション/ウィンドウ/ペイン情報をrun-shellコマンドに提供するための素晴らしい動機のようです。取得if-shellrun-shellサポート(オプション?)status_replace()(つまり、- status-leftスタイルの置換)に関するTODOエントリがありますが、(オファーなど)のformat_expand()新しいスーパーセットのような、より良い選択がおそらくあるでしょう。status_replace#{client_tty}


これは私が探していたものとまったく同じようです。tmux display-message -p "#S"別の答えでトリックを見つけた後、私は同様の方法を試しました。すべてをrun-shellでラップすることが鍵のようでした。ありがとう!
Trey Hunner、

どのようにしてこれなしでこれを行うのです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、その余分な引用を省略できます)
Chris Johnsen


0

ある別の質問同様の質問をするが、それは少し異なります。

choose-session他のクライアントが接続されていない場合に元のセッションを強制終了する追加機能を備えた標準の動作が必要な場合は、その質問も興味深いかもしれません。


0

拡大クリスヨンセンのプロンプトまたはなしでそれを行う方法については、上記(コメントで)答え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\"'"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.