23

にログを記録するプログラムがありますSTDOUT

これらのログ エントリには "ログ レベル" (デバッグ、警告、情報など) が関連付けられており、ユーザーがログ レベルに応じてこの出力を色分けできるようにしたいと考えています。

STDOUTがカラー対応の端末に接続されているかどうかを判断する方法は何ですか? そして、どうすればテキストを色付きで出力できますか?

C または C++ 呼び出しのみを含むソリューションを探しています。curses(または)これを緩和する何かがあると思いncursesますが、依存関係を最小限に抑えるためにその使用を避けたいと思います。

4

1 に答える 1

33

おそらく最も簡単なチェック方法は次のとおりです。

isatty(fileno(STDOUT))

1これは、標準出力が任意の種類の端末に送信されている場合に返されます。実際には、どの端末もVT100カラーコードをサポートまたは無視します。特定の非常に珍しいハードウェア端末に出力することを期待しない限り、terminfoを調べる必要はありません。(そのほとんどは何十年もの間作られていません。)

色を出力するには、(拡張された)SGRシーケンスを使用します。

"\x1b[%dm"

ここで、%dは一般的にサポートされている色の次の値の1つです。

0: reset colors/style
1: bold
4: underline
30 - 37: black, red, green, yellow, blue, magenta, cyan, and white text
40 - 47: black, red, green, yellow, blue, magenta, cyan, and white background

より多くの値がありますが、これらは最も広くサポートされている値です。繰り返しになりますが、terminfoを調べることは、これらの制御コードにはほとんど不要です。その塩に値するすべてのソフトウェア端末がそれらをサポート(または無視)するからです。

複数の属性を一度に変更する必要がある場合は、セミコロンで区切って一度にすべてを指定できます。たとえば、次のシーケンスでは、緑色の背景に太字のマゼンタのテキストで眼球を焦がします。

"\x1b[1;35;42m"
于 2012-10-10T19:50:03.870 に答える