@Pの有無にかかわらず、PS1で生成されたプロンプトの画面幅を取得する方法は?

@Pの有無にかかわらず、PS1で生成されたプロンプトの画面幅を取得する方法は?

たとえば、PS1次の値があるとします。

'\w (\[\e[32m\]${__git_ps1_branch_name}\[\e[0m\] \[\e[31m\]*\[\e[31m\]%\[\e[0m\]>)\$ '

...ここには、または__git_ps1_branch_name同じ文字列があります。masterfeature123

尋ねる:上記のプロンプトでbash生成されるプロンプトの画面幅(文字数)を計算する方法を探しています。PS1


最新バージョンでは、上記のヒント仕様要素を最終表示値に置き換えて得られた文字列bashで式を拡張します。${PS1@P}\wたとえば、現在のディレクトリのパスに置き換えられたり、${__git_ps1_branch_name}変数に含まれている文字列に置き換えられる__git_ps1_branch_nameなど)、しかしこれだけでは問題を解決するのに十分ではありません。

具体的には、次のように設定すると:

EXPANDED_PS1="${PS1@P}"

...式によって生成された数字${#EXPANDED_PS1}(つまり、の文字数)は次のとおりです。$EXPANDED_PS1かなり大きいbashによって生成されたプロンプトの画面幅よりも広い$PS1。超過は、表示されたプロンプトに色を提供するエスケープシーケンスに由来します。

いずれにせよ、はい返品サポートされていないbashバージョンのソリューションに興味がある@P

答え1

サポートなしでは難しいです@P。問題はPS1を拡張しなければならないが、その機能が非公開なので直接使用できないという点だ。それにもかかわらず、非常に良い試みがありますこの問題

サポートがある場合は、@P次のことが役に立ちます。

$ echo -ne "\n${PS1@P}\033[6n";read -e -s -d R cnt;cnt=$((${cnt#;} - 1));echo $cnt

PS1まず、新しい行と拡張文字列を送信します。これはカーソルが現在列にあることを意味します。PS1の長さ+1

その後、ANSIエスケープコードがあります。装備状況報告(CSI6n) 送信しました。端末応答:

カーソル位置(CPR)はESC [n; mRを送信することによって報告されます。ここで、nは行で、mは列です。 )

値は標準入力から読み書きしますcnt

それはハッキング的で、ANSI端末でのみ動作しますが、動作しているようです。拡張長が端子の幅より大きい場合、列に長さは表示されませんPS1。他のプロセスの出力も問題になる可能性があります。

関連情報