内部 tmux セッションのウィンドウ番号を取得します。

内部 tmux セッションのウィンドウ番号を取得します。

外部セッションでは、pane_cur="$(tmux display-message -p '#{pane_id}' | cut -c 2 | bc)"内部セッションのウィンドウを使用してウィンドウ切り替えの動作を制御します。現在、内部セッションではなく外部セッションのポッドIDのみを取得しています。

外部ウィンドウIDに基づいてネストされたセッションをドリルダウンし、ウィンドウIDがある場合はそれを取得するにはどうすればよいですか?

答え1

予備説明

この回答では、すべての tmux セッションが単一の tmux サーバー内に存在すると仮定します。外部セッションと内部セッションが異なるtmuxサーバー(同じシステムまたは別のシステムで実行)に属している場合、状況ははるかに複雑になり、この回答は適用されません。


分析する

あるtmuxセッション(外部​​セッションなど)から別のtmuxセッション(内部セッションなど)から情報を取得するには、別のセッションをターゲットにする必要があります。多くのtmuxコマンド(tmuxを含むdisplay-message)で-tターゲットを使用して指定できます。

内部セッションが次のコマンドであることがわかっている場合1

tmux display-message -t 1: -p '#{pane_id}'

セッション内の現在のウィンドウで現在アクティブなウィンドウのIDを提供します。

どの番号(またはセッション名)を使用するのかわからない場合は、tmuxに連絡する必要があります。これが「ドリルダウン」という意味のようです。


プログラム

次のことができます。

  1. tmux display-message -p '#{pane_id}'あなたに与えられたと仮定します%5。外部セッションのアクティブウィンドウです。

  2. 実際、ウィンドウのIDは必要ありません。 Podのプロセス用のtty tmuxを作成する必要があります。たとえば、itを使用してtmux display-message -p '#{pane_tty}'取得できます/dev/pts/2

  3. このウィンドウの内部セッションにtmuxクライアントが接続されていると仮定すると、ttyを使用してクライアントセッションを見つける必要があります。と呼ばれるtmux list-clients -F '#{client_tty} #{client_session}'出力は次のとおりです。

    /dev/pts/1 foo
    /dev/pts/2 1
    

    /dev/pts/2これで、どのセッションを使用する必要があるかを知りました1

  4. このセッションのアクティブウィンドウを識別します。

    tmux display-message -t 1: -p '#{pane_id}'
    
  5. 深く掘り下げるには(別のネストしたセッションがあるため)(2)に進みます。しかし、今回は先ほど研究したウィンドウを対象にしなければなりません。


サンプルシェルコード

#!/bin/sh

pane="$(tmux display-message -p '#{pane_id}')" || exit 1

while
   tty="$(tmux display-message -t "$pane" -p '#{pane_tty}')"
   session="$(
      tmux list-clients -F '#{client_tty} #{client_session}' \
      | grep "^$tty " | head -n 1 | cut -d ' ' -f 2-
   )"
   [ -n "$session" ]
do
   pane="$(tmux display-message -t "$session:" -p '#{pane_id}')"
done

printf '%s\n' "$pane"

コードはすべてのエラーを処理しようとしません。特に、コードランタイムウィンドウまたはセッションが削除されると、1つの呼び出し$sessionの情報(たとえば)がtmux次の呼び出しに使用されるときに無効になる可能性がありますtmux

コードをとして保存しscrpt、実行可能にし、watch ./scrpt最も外側のtmuxセッションのシェルで実行してテストしました。私のテストでは、最大3つの追加レベルのネストされたtmuxを作成しましたが、コードはすべての深さを処理するように設計されています。


サイドノート

printf '%s\n' "${pane#%}"%それがあなたが望むものであれば、前もって数字を与えるでしょう。しかし、tmuxでは、pane_idこれが唯一の組み合わせ表現であり%pane_index唯一の組み合わせ表現ではないことを覚えておいてください%。戻り値%から対応する数値を削除し、後でtmuxで使用するとpane_id(再度追加せず%)と解釈できますpane_index

関連情報