ある tmux セッションを終了し、別の tmux セッションを選択します。

ある tmux セッションを終了し、別の tmux セッションを選択します。

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

答え1

私はこれがあなたが望むものに近いと思います。

bind-key X confirm-before -p "Kill #S (y/n)?" "run-shell 'tmux switch-client -n \\\; kill-session -t \"#S\"'"

#3のアプローチは正確ですが、問題は、コマンド文字列に-style置換(例)がconfirm-beforeないことです。status-left#S

上記のバインディングに関する1つの注意点は、すべての操作がfrom内で実行されるため、run-shellコマンドが特定のクライアントまたはセッションのコンテキスト外で実行されることです。 「プライマリ」クライアント(用switch-client)と「プライマリ」セッション(用#S)が最新のアクティブクライアントであるために機能します。アクティブなクライアントが1つしかない限り(たとえば、他のユーザーに入力しない単一のユーザーなど)、これは期待どおりに機能します。マルチプレクサクライアントは、シェルコマンドの実行が完了するまで(たとえば)バインドをトリガーすると、大幅に失敗する可能性があります。マルチプレクサクライアントA、新しい入力が受信されましたマルチプレクサクライアントBは、run-shellシェルが起動する前にコマンドを実行できます。

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

答え2

誰もがこの質問にかかって倒れた場合に備えて -tmux - トッカーこの機能と他の多くの機能を提供します。

答え3

set-option -g detach-on-destroy off通常どおり設定に追加してセッションを終了することもできます。

答え4

私はクリスの答えについて(主観的に)より強力で読みやすいバージョンを思いつきました。

bind-key X \
    if-shell '[ "$(tmux display -p "#{session_many_attached}")" -gt 0 ]' {
        # the session is attached to multiple clients, so we can just switch the client to a different session.
        choose-session
    } {
        # we are the last client attached to this session; kill it.
        # we need to use `run-shell` to ensure that the current session number is expanded *before* we switch to the new session.
        confirm -p 'Kill #S (y/n)?' {
            choose-tree -s {
                run-shell 'tmux switch-client -t "%%" \; kill-session -t "#S"'
            }
        }
    }

関連情報