プロンプトが壊れる件について
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 は色付けのエスケープシーケンス無視する機能くらい持っててもいいと思うんだ……。