2015-12-13 12 views
5

私はbashの中にbashのようなプロンプトを作成するためにCのreadlineライブラリを使用しています。私がプロンプトをカラフルにしようとしたときに、theseのような色のシーケンスでは、色付けがうまくいくが、カーソルの間隔が狂ってしまう。入力が早過ぎるとラップアラウンドが同じ行になり、プロンプトが上書きされます。私は\[\]エスケープされたカラー文字をbashに出力する

readline("\[\e[1;31m$\e[0m\] ")

などでカラーエスケープシーケンスをすべきであると思ったしかし、それは角括弧を印刷し、私はバックスラッシュをエスケープする場合、それはあまりにもそれらを印刷します。カーソルがまだ機能するようにカラーコードをエスケープするにはどうすればよいですか?

+0

このようなエスケープシーケンスは、Bash固有のものです。プログラムから印刷する場合は、囲み括弧は必要ありません。 '' \ e "'というシーケンスはGCCコンパイラの拡張であり、一般的には移植性がないことに注意してください。 –

+0

私の前のコメントを明確にするために、私は '' \ ["'と '" \] "のペアがBash固有であり、あなたがそれを必要としないことを意味します。 –

+0

'readline(" \ [\ 033 [1; 31m $ \ 033 [0m \] ")を試したことがありますか? '\ e'ではなく' \ 033' –

答えて

6

プロンプト文字列内の文字列が実際にカーソルを移動しないように指示する方法は、画面に出力するときにマーカで囲むことですRL_PROMPT_START_IGNORE(現在、これは文字リテラル '\ 001'ですreadlineのCヘッダファイル)とRL_PROMPT_END_IGNORE(現在は '\ 002')。

@ Joachimと@Alterは言ったように、移植性のために '\ e'の代わりに '\ 033'を使います。

2

この質問は、GNU readlineプロンプトをbashスクリプトで修正するときに見つけました。 Cコードのreadlineと同様に、\[\]は特別ではありませんが、\001\002となります。特別処理bashでが得られた場合、$'string'という形式の引用符があります。私は以前にここにいた(そして、それを$'…'と組み合わせることが知られていなかったために満足しなかった)ので、私は解決策があるのでここで私の説明をここに残すと思った。

ここに提供されたデータを使用して、私はこの結果を締結することができたが:

C1=$'\001\033[1;34m\002' # blue - from \e[1;34m 
C0=$'\001\033[0;0m\002' # reset - from \e[0;0m 
while read -p "${C1}myshell>$C0 " -e command; do 
    echo "you said: $command" 
done 

これは、実際のコマンドのための色なし、myshell>を言うとトレーリングスペースを持つ青色のプロンプトを提供します。 を打ち上げてにするか、次の行に折り返すと入力するコマンドは、印刷されない文字で混乱することはなくなりました。

としては、(Start of Text)受け入れ答え、\001Start of Heading)で説明した\002ターミナルを塗装するために、それらの間には何もカウントしないのbashとのreadlineを伝えるRL_PROMPT_START_IGNORERL_PROMPT_END_IGNOREマーカーです。 (\033\eよりも信頼性が高く、私は今では8進コードを使用しているので、もう1つ使用することもできます)。

これについては、ドキュメントが不足しているようです。私は見つけることができる最高は述べていた、Term::ReadLine::GnuのためにPerlのドキュメントにあった:

PROMPTは、いくつかのエスケープシーケンスを含むことができます。 RL_PROMPT_START_IGNOREを使用して一連の非印字文字を開始し、RL_PROMPT_END_IGNOREを使用してシーケンスを終了します。

関連する問題