web-dev-qa-db-ja.com

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

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

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

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

11

display-message -pを使用して、出力をstdoutに送信し、show-messagesの出力から出力を抽出する必要をなくすことができます。

tmux display-message -p '#I'

次のように丸で囲んだ数字に変換できます(bash構文;バージョン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であるという点でNiceです。構成ファイルに非ASCII文字を含めてもかまわない場合は、代わりに2行目に進むことができます(エディターとシェルがファイルのエンコードを適切に処理できると仮定すると、意図がより明確になります)。

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

PS1="$(tmux_winidx_circled) \W➤ "
14
Chris Johnsen

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

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の丸で囲まれた数字に置き換えることですが、それは別の話です。

3