ゼロ幅制御文字を含む Bash プロンプト

ゼロ幅制御文字を含む Bash プロンプト

プロンプトが右から左に書くテキストの周りで歪むのを防ぐために、ゼロ幅の LRM を bash プロンプト (U200e) に挿入したいと思います。これはゼロ幅の文字なので、直感的に で囲むことにしました\[<200e>\]。しかし、実際には、これによって bash が間違った場所で行を折り返すことになります。何も囲まないと、それから問題なく動作するようです。

理解できません。bash がこの文字がゼロ幅であることを自動検出したとしても、\[...\]その周りに a をラップしても何も問題はありません。

編集済み: 質問は、\[...\]エスケープが実際に必要なのはいつなのか、エスケープする文字が実際にゼロ幅である場合、それがどのように有害になる可能性があるのか​​ということです。

答え1

投稿を見る bash で長さゼロの文字をエスケープする.そして具体的には マイケル・アレンの回答 以下に転載します。

これらの\[シーケンスは、PS1 を含むいくつかのユーティリティによって、\001および\002制御コードを表すために使用されます。

\[=>\x01または\001

\]=>\x02または\002

\[printf と echo は からへのこの変換を行いません\001

したがって、解決策は自分で変換を行うことでした。長さが 0 の文字を次のようにラップする代わりに\[

echo "\[\033[1;30m\]foo\[\033[0m\]"

出力は\[foo\]

代わりに実際の制御コードを出力します。

echo "\x01\033[1;30m\x02foo\x01\033[0m\x02"

fooPS1 printf と echo の両方に出力します。

具体的な例についてはgit-radar のこのコミット。

関連情報