22

私はさまざまなユーティリティを作成しており、色付きのテキストがとても気に入っています。エスケープシーケンスを使用するだけで、空想は何もありません。pprint(msg, color) 関数を持つ単純なクラスを作成しました。ここでコードを見つけた後、かなり簡単に機能するようになりました。

私が抱えている問題は、印刷後に色をオフにできるはずだということです。たとえば、ユーザーが私のプログラムを実行してほとんどすべてをデフォルトの端末色で印刷するとしますが、エラーがあり、エラーを赤で印刷したいとします。エラー メッセージの先頭に '\033[0;32m' を付けると、メッセージは赤で表示されます。残念ながら、変更するまですべてのテキストは赤です。メッセージの色を知っているので、プログラムの実行中は通常問題ありません。ただし、プログラムが終了した後も色が残ります。基本的に、プログラムの開始時に現在の色を読み取り、終了時にそれを復元したいと考えています。終了時にスクリプトが pwd を復元するのと同じ方法。

現在のエスケープ シーケンスを読み取るにはどうすればよいですか?

システム: Red Hat 5.x Bash Python 2.3

助けてくれてありがとう。

4

4 に答える 4

122

難読化されたエスケープ シーケンスを使用するtput代わりに、この機能を使用してください。~/.bashrcこれは、PS1 プロンプトに使用する myからの抜粋です。

BLACK=$(tput setaf 0)
RED=$(tput setaf 1)
GREEN=$(tput setaf 2)
YELLOW=$(tput setaf 3)
LIME_YELLOW=$(tput setaf 190)
POWDER_BLUE=$(tput setaf 153)
BLUE=$(tput setaf 4)
MAGENTA=$(tput setaf 5)
CYAN=$(tput setaf 6)
WHITE=$(tput setaf 7)
BRIGHT=$(tput bold)
NORMAL=$(tput sgr0)
BLINK=$(tput blink)
REVERSE=$(tput smso)
UNDERLINE=$(tput smul)

後続のテキストが通常の端末の色になるように色情報をリセットするには、次の${NORMAL}ように末尾に追加します。

echo "${RED}this is red ${NORMAL}this is normal"

于 2010-12-02T07:07:19.367 に答える
4

私はそれが可能であるとは信じていませんし、もしそうなら移植可能である可能性は低いです. あなたができる最善のことは、sgr0すべての属性をデフォルトにリセットする送信です(以前のものではありません)。xterms ではsgr0Esc[m. 色をリセットして他の属性に影響を与えたくない場合は、opwhich on xterms is を送ってEsc[39;49mください。

これらのコードはハードコーディングしないでください。terminfo、termcap、または [n]curses を使用する必要があります。

于 2010-12-02T11:48:22.510 に答える
4
RED = 31
GREEN = 32
ESCAPE = '%s[' % chr(27)
RESET = '%s0m' % ESCAPE
FORMAT = '1;%dm'

def colorize(text, color):
    return ESCAPE + (FORMAT % (color, )) + text + RESET

この関数は、カラー化されて印刷される文字列を返します。その後、端末は自動的にリセットされます。

于 2010-12-02T07:15:50.290 に答える