ANSI カラーコードを出力する必要があります。すべての端末がこれをサポートしているわけではないことに注意してください。カラー シーケンスがサポートされていない場合、ゴミが表示されます。
例:
cout << "\033[1;31mbold red text\033[0m\n";
ここで、\033
は ESC 文字、ASCII 27 です。その後に [
が続きます。 、次に ;
で区切られた 0 個以上の数字 、そして最後に文字 m
.数字は、その時点から切り替える色と形式を示しています。
前景色と背景色のコードは次のとおりです:
foreground background
black 30 40
red 31 41
green 32 42
yellow 33 43
blue 34 44
magenta 35 45
cyan 36 46
white 37 47
さらに、これらを使用できます:
reset 0 (everything back to normal)
bold/bright 1 (often a brighter shade of the same colour)
underline 4
inverse 7 (swap foreground and background colours)
bold/bright off 21
underline off 24
inverse off 27
あまり広くサポートされていないその他のコードについては、ウィキペディアの表を参照してください。
端末がカラー シーケンスをサポートしているかどうかを判断するには、TERM
の値を読み取ります。 環境変数。使用する特定の端末タイプを指定する必要があります (例:vt100
、 gnome-terminal
、 xterm
、 screen
、...)。それから terminfo データベースを調べてください。 colors
を確認してください
必要な色を出力する前に、ターミナルにいることを確認してください:
[ -t 1 ] && echo 'Yes I am in a terminal' # isatty(3) call in C
次に、色をサポートするかどうか端末の機能を確認する必要があります
terminfo
のシステムで (Linux ベース) サポートされている色の数量を次のように取得できます
Number_Of_colors_Supported=$(tput colors)
termcap
のシステムで (BSD ベース) サポートされている色の数量を次のように取得できます
Number_Of_colors_Supported=$(tput Co)
次に、決定を下します:
[ ${Number_Of_colors_Supported} -ge 8 ] && {
echo 'You are fine and can print colors'
} || {
echo 'Terminal does not support color'
}
ところで、以前に ESC 文字で提案されたように色付けを使用しないでください。特定の端末がサポートする正しい色を割り当てる標準の端末機能への呼び出しを使用してください。
BSD ベースfg_black="$(tput AF 0)"
fg_red="$(tput AF 1)"
fg_green="$(tput AF 2)"
fg_yellow="$(tput AF 3)"
fg_blue="$(tput AF 4)"
fg_magenta="$(tput AF 5)"
fg_cyan="$(tput AF 6)"
fg_white="$(tput AF 7)"
reset="$(tput me)"
Linux ベースfg_black="$(tput setaf 0)"
fg_red="$(tput setaf 1)"
fg_green="$(tput setaf 2)"
fg_yellow="$(tput setaf 3)"
fg_blue="$(tput setaf 4)"
fg_magenta="$(tput setaf 5)"
fg_cyan="$(tput setaf 6)"
fg_white="$(tput setaf 7)"
reset="$(tput sgr0)"
echo -e "${fg_red} Red ${fg_green} Bull ${reset}"
として使用 基本
出力の前景色と背景色を設定するために使用できる C++ クラスを作成しました。このサンプル プログラムは、This ->word<- is red.
を出力する例です。 word
の前景色になるようにフォーマットします は赤です。
#include "colormod.h" // namespace Color
#include <iostream>
using namespace std;
int main() {
Color::Modifier red(Color::FG_RED);
Color::Modifier def(Color::FG_DEFAULT);
cout << "This ->" << red << "word" << def << "<- is red." << endl;
}
ソース
#include <ostream>
namespace Color {
enum Code {
FG_RED = 31,
FG_GREEN = 32,
FG_BLUE = 34,
FG_DEFAULT = 39,
BG_RED = 41,
BG_GREEN = 42,
BG_BLUE = 44,
BG_DEFAULT = 49
};
class Modifier {
Code code;
public:
Modifier(Code pCode) : code(pCode) {}
friend std::ostream&
operator<<(std::ostream& os, const Modifier& mod) {
return os << "\033[" << mod.code << "m";
}
};
}
上級
クラスに機能を追加したい場合があります。たとえば、マゼンタの色や boldface のようなスタイルを追加することも可能です .これを行うには、Code
へのエントリをもう 1 つ追加します。 列挙。これは参考になります。