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\""
答え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-shell
とrun-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"'
}
}
}