bashプロンプトの現在のウィンドウ番号を取得する

bashプロンプトの現在のウィンドウ番号を取得する

ステータスバーを、①のようにウィンドウ番号を表示するbashプロンプトに置き換えたいです。シェルで現在のウィンドウ番号を取得するにはどうすればよいですか?

TMUX_PANE 環境変数はありますが、残念ながら TMUX_WINDOW はありません。

私が得た最も近い方法は、 tmux display-messageウィンドウ/ペイン情報をフラッシュし、最後の行を取得しtmux show-messagesて解析することです。プロンプトが表示されるたびにウィンドウ/ペイン情報がフラッシュされるのは望ましくありません。

答え1

display-message -p出力を stdout に送信するには、を使用します。これにより、 の出力から抽出する必要がなくなりますshow-messages

tmux display-message -p '#I'

丸で囲んだ数字は次のように変換できます(バッシュ構文; バージョン 3.2.48 および 4.2.20 でテスト済み):

circled_digits=$(printf %s \${$'\xEA',\`,{a..s}} | iconv -f UTF-16BE)
# circled_digits='⓪①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳'

tmux_winidx_circled() {
    local winidx=$(tmux display-message -p '#I')
    if (( winidx > 20 )); then
        echo "($winidx)"
    else
        echo "${circled_digits:$winidx:1}"
    fi
}

最初の行は純粋な ASCII であるという点で優れています。設定ファイルに非 ASCII 文字があっても構わない場合は、代わりに 2 行目を使用できます (エディターとシェルがファイルのエンコードを適切に処理できると仮定すると、意図がより明確になります)。

次のように使用できます。

PS1="$(tmux_winidx_circled) \W➤ "

答え2

必要なのは、シェルの起動時に tmux メッセージをフラッシュして抽出し、これを保存するだけでした。 やっちゃった!

tmux display-message
export TMUX_WINDOW=$(tmux show-messages | tail -1 | grep -o '\[[0-9]\] \([0-9]\)' | grep -o '[0-9]$')
PS1="$(echo $TMUX_WINDOW) \W➤ "

プロンプトは次のようになります:

[2] ~➤  

残っているのは、解析を改善し、通常の数字をきれいな Unicode の丸で囲まれた数字文字に置き換えることですが、それはまた別の話です。

関連情報