Linux:bashプロンプトを着色すると復帰が壊れる


24

bashこのようにプロンプトを色付けしようとすると:

export PS1="\e[0;31m[\u@\h \W]\$ \e[m "

改行を改行します(行がいっぱいになったときに新しい行に移動する代わりに、同じ行から開始して入力テキストを消去します)。

カラーシーケンスを削除すると、正常に機能します。
Ubuntu 11.10とターミナルを使用します(guakeにも同じバグがあります)。


奇妙な。これは、RedHatの5およびMac OS X上で何の問題もO / W動作します
マッテオ

回答:


43

「readline」がプロンプトの表示可能な長さを正しく計算するには、\[との間ですべてのエスケープシーケンスをラップする必要があり\]ます。それらがなければ、「readline」はプロンプトがそれよりも長いと考え、テキストがいつマージンに達するかを知りません。

PS1 = " \ [ \ e [; 31m \] [\ u @ \ h \ W] \ $ \ [ \ e [m \] "

4
トンありがとう!! 私は公式ドキュメントでいくつかのドキュメントを見つけようとしましたが、できませんでした-「ストック」カラープロンプトはこの「トリック」を採用しており、それが何であるかを最初に理解するのに苦労しましたので、それをクリアしてくれてありがとうup ---ところで、実際には、684行の「man readline 3」でドキュメントのソースを見つけましたが、これは実際に「skip-csi-sequence」と呼ばれ、このドキュメントがどこにあるかを知りたい人向けです。接続を確立する前に失敗したことを知っていたとしても、readline(3)を指さずにそれを見つけたとは思わない。
osirisgothra

「ラップ」とはどういう意味ですか?あなたは全体を包む意味するかIN\[\]?私はそう思うが、それは私のために働いていないようだ。
マックスハウエル

2
@osirisgothra:ドキュメントは実際には別のことについて話している- 特別なキーによって生成される入力シーケンスskip-csi-sequenceを抑制することを意図しています。
悲しみ14

1
@MaxHowell \e[xxmでは、文字列全体ではなく、各シーケンスをラップする必要があります。
エンリコ

ありがとう。私の場合、私はちょうど交換し\e[39m\[\e[;39m\]、それが正常に動作します
Herrgott

1

[および]ヒントは、OS X 10.8.2のbashでも機能しました。

私が使う:

PS1 = "[\ e [0; 37m \ W \ $(git branch 2> / dev / null | grep -e '*' | sed 's / ^ ..(。*)/ {\ 1} /') \ $ \ e [m] "

現在使用中のgitブランチが表示されます。


「__git_ps1」について知っていますか?
-rafak

いや。それはどんな魔法的なことをしますか?
ストーンフルーツ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.