14

git現在のブランチを複数行のZSHプロンプトに入れたいのですが。しかし、これは2つの線を台無しにします-私はそれらがうまく整列することを望みます。


┌─(simont@charmander:s000)─[master *]────────────────
───(~  )─┐  
└─(127:15:44)──                       ──(Sat,May12)─┘

する必要があります:


┌─(simont@charmander:s000)─[master *]─────────(~  )─┐  
└─(127:15:44)──                       ──(Sat,May12)─┘

gitブランチはoh-my-zsh関数から取得されます。git_prompt_info()これにより、ブランチ、ダーティステータス、および色を適切に設定するための一連のプロンプトエスケープが提供されます。

プロンプトのエスケープシーケンスではなく、ZSHプロンプトに視覚的に挿入される文字をカウントするにはどうすればよいですか?

4

2 に答える 2

13

プロンプトエスケープされた文字列が変数に格納されていると仮定するとFOO、これはユーザーに表示される文字のみをカウントします。

                                                                                                                                
FOO=$(git_prompt_info)                                                                                                                     
local zero='%([BSUbfksu]|([FK]|){*})'
FOOLENGTH=${#${(S%%)FOO//$~zero/}} 

これはこれから来ています.zshrc

これは、それが機能する理由の大まかなman zshexpn説明であり、セクションから自由に引用していPARAMETER EXPANSIONます。詳細については100%確信が持てないため、これを使用して独自の同等のものを開発している場合は、関連するman zshallセクションをお読みください。

行から作業してFOOLENGTH=${#${(S%%)FOO//$~zero/}}、私たちはいくつかのビットを持っています。裏返しに行く:

  1. $~zero:は、私たちが定義した、がプレーンな文字列ではなくパターンとして扱われる ~ことを保証します。zero'%([BSUbfksu]|([FB]|){*})'

  2. ${(S%%)FOO//$~zero/}:これは一致し${name//pattern/repl}ます:

    パラメータ名の展開で可能な最長のパターンの一致を文字列replに置き換えます

    repl;がないことに注意してください。可能な限り長い一致patternを何もないものに置き換え、それによってそれを削除します。いくつかのフラグを設定して
    (S%%)FOO拡張を実行します。FOO私はそれを完全にはフォローしていません。

  3. ${#${(S%%)FOO//$~zero/}}${#spec}が置換のspec場合、置換の結果の文字の長さを置換しspecます。私たちの場合、specは置換の結果${(S%%)FOO//$~zero/}です; s/zero//したがって、これは基本的に、上の正規表現の結果の文字の長さを返します。FOOここで、zeroは上記のパターンです。

于 2012-05-12T14:04:08.117 に答える
2

組み込みのzshコマンドでこれを行う方法はわかりませんが、色情報はsedで削除できます(ここに記載されています)。

sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"

例えば

plain_str=$(git_prompt_info | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g")

これにより、文字列からすべてのエスケープシーケンスが削除されます。長さは単純になりました:

echo $#plain_str
于 2012-05-12T15:04:29.000 に答える