プロンプトが壊れる件について

readlineのバグだったとか寝言言ってたけど違った。君のせいにしてごめんよ。

ソースコード読んでみて分かったんだけど、readline はエスケープシーケンスを考慮して文字数計算するみたいなことは もともとやってくれない。そのかわりに、文字数の計算で無視したい部分を ここ で定義してある RL_PROMPT_START_IGNORE (\001) と RL_PROMPT_END_IGNORE (\002) ではさむことによって プロンプトが崩れないようにする。

Bash のプロンプトを設定するときにはそれぞれ \[\] で挟むとこれらの文字に置き換えてくれるっぽい (これは挙動から推測しているだけで、正確には Bash のソースコードを読んでいないので分からない)。

これはちゃんと Bash の Manual page にも書いてある。

\[     begin  a sequence of non-printing characters, which could be used to embed a terminal  control  sequence  into  the prompt
\]     end a sequence of non-printing characters

man 読みましょうね。

…といっても readline は色付けのエスケープシーケンス無視する機能くらい持っててもいいと思うんだ……。