たとえば、PS1
次の値があるとします。
'\w (\[\e[32m\]${__git_ps1_branch_name}\[\e[0m\] \[\e[31m\]*\[\e[31m\]%\[\e[0m\]>)\$ '
...ここには、または__git_ps1_branch_name
同じ文字列があります。master
feature123
尋ねる:上記のプロンプトで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
。他のプロセスの出力も問題になる可能性があります。