読者です 読者をやめる 読者になる 読者になる

Programmer's Note

コード読み書きの備忘録。

エスケープシーケンスの文字装飾を試す

Escape Sequence C

エスケープシーケンスを試してみる。

カーソル移動も可能だが、とりあえず文字表示の装飾機能を試す。

文字装飾エスケープシーケンスは、C言語だとprintfで\x1b[制御コードmを出力すればいい。 制御コードは1〜107まであるらしい。0はリセット。 (参照:ANSI escape code - Wikipedia, the free encyclopedia

例えば、

printf("\x1b[1mA");

は1を指定して、これはAをBold体で表示する。

制御コードは複数指定も可能、その場合は;で区切る。

printf("\x1b[1;4mA");

は1と4を指定で、これはBoldかつアンダーラインでAを表示する。

さて、とりあえず自分のMac OS XのiTerm2で表示してみた。 試してみると、iTerm2だと以下コード指定が有効だった。

      1: Bold
      4: アンダーライン
      7: 反転表示 
  30-37: 文字色変更
  40-47: 背景色変更
  90-97: 文字色変更(明るい)
100-107: 背景色変更(明るい)

で、有効なやつを並べて表示させてみた。 (もともとのターミナルの色設定によって印象は変わるでしょうが) 以下結果:

f:id:hifistar:20150131232844p:plain

(※注)背景色変更したときは文字色を白にしている。

文字色表示の場合、Bold指定(1指定)も同時にやると色合いが変わる。 ことも確認できた(これは仕様らしい)。

以下ソースコード

#include <stdio.h>

void esc_prt(int mode, const char *str)
{
    printf("\x1b[%dm%s",mode,str);
    printf("\x1b[0m");
}

void color_prt(int color, const char *str)
{
    printf("%d: ",color);
    // change foreground color
    printf("\x1b[%dm%s", 30+color, str);
    printf("\x1b[0m\t");
    printf("\x1b[%d;1m%s", 30+color, str);
    printf("\x1b[0m\t");
    printf("\x1b[%dm%s", 90+color, str);

    // change background color
    printf("\x1b[37m\t");
    printf("\x1b[%dm%s", 40+color, str);
    printf("\x1b[37m\t");
    printf("\x1b[%d;1m%s", 40+color, str);
    printf("\x1b[37m\t");
    printf("\x1b[%dm%s", 100+color, str);
    printf("\x1b[0m\t");

    // reset to normal
    printf("\x1b[0m");
    printf("\n");
}

int main(int argc, char **argv)
{
    int i;
    printf("1m   \t4m   \t7m\n");
    esc_prt(1, "abcABC\t");
    esc_prt(4, "abcABC\t");
    esc_prt(7, "abcABC\n");
    printf("\n");
    printf("   30m   \t30;1m \t90m  \t40m  \t40;1m \t100m\n");
    for(i=0; i <= 7; i++)
        color_prt(i, "abcABC");
}