2016年1月31日日曜日

コンソールプログラムで表現を豊かに

CygwinをはじめとするUnixらいくな環境ではコンソールプログラムの文字色や背景色をプログラムで1文字ごとに設定することができる。ということで色の一覧。



1行毎に背景色を、1列毎に文字色を設定している。色は黒、赤、緑、黄、黄緑、青、マゼンタ、シアン、デフォルトがある(でもシアンってどう見ても白だよね)。



この表現がどういうふうに使えるかというと、例えばビットのON/OFFで情報が入ってくるとして、それを文字だけではなく色として表現することができる。上の画像では青がON、赤がOFFで、現在選択しているデータを緑で表している。hjklキーで選択を移動することができ、スペースキーなどで反転することもできる。
この表現は基本的にUnixライク環境専用だが、Windowsでも使うことは可能。また、C#のConsoleでも同様の表示が可能。C#だとシリアルポートが簡単に使えるので、ちょっとした電子機器のステータス表現に使うと便利かもしれない。


#include <stdio.h>
#include <string.h>

#define ES_DisplayClear() "\033[2J"
#define ES_RightClear() "\033[0K"
#define ES_LeftClear() "\033[1K"
#define ES_LineClear() "\033[2K"
#define ES_Move(y, x) "\033[" #y ";" #x "H"
#define ES_Up(y) "\033[" #y "A"
#define ES_Down(y) "\033[" #y "B"
#define ES_Right(x) "\033[" #x "C"
#define ES_Left(x) "\033[" #x "D"

#define ES_TextBlack() "\033[30m"
#define ES_TextRed() "\033[31m"
#define ES_TextGreen() "\033[32m"
#define ES_TextYellow() "\033[33m"
#define ES_TextYelGrn() "\033[34m"
#define ES_TextBlue() "\033[35m"
#define ES_TextMagenta() "\033[36m"
#define ES_TextCyan() "\033[37m"
#define ES_TextDefault() "\033[39m"

#define ES_BackBlack() "\033[40m"
#define ES_BackRed() "\033[41m"
#define ES_BackGreen() "\033[42m"
#define ES_BackYellow() "\033[43m"
#define ES_BackYelGrn() "\033[44m"
#define ES_BackBlue() "\033[45m"
#define ES_BackMagenta() "\033[46m"
#define ES_BackCyan() "\033[47m"
#define ES_BackDefault() "\033[49m"

int main(void) {
    const char *Texts[9] = {
        ES_TextBlack(),
        ES_TextRed(),
        ES_TextGreen(),
        ES_TextYellow(),
        ES_TextYelGrn(),
        ES_TextBlue(),
        ES_TextMagenta(),
        ES_TextCyan(),
        ES_TextDefault(),
    };

    const char *Backs[9] = {
        ES_BackBlack(),
        ES_BackRed(),
        ES_BackGreen(),
        ES_BackYellow(),
        ES_BackYelGrn(),
        ES_BackBlue(),
        ES_BackMagenta(),
        ES_BackCyan(),
        ES_BackDefault(),
    };

    const char *Colors[9] = {
        "Black", "Red", "Green", "Yellow", "YellowGreen",
        "Blue", "Magenta", "Cyan", "Default",
    };

    int ColorStrMax = 0;
    int j;

    for (j = 0; j < sizeof(Colors) / sizeof(Colors[0]); j++) {
        int l = strlen(Colors[j]);

        if (ColorStrMax < l) {
            ColorStrMax = l;
        }
    }

    for (j = 0; j < sizeof(Backs) / sizeof(Backs[0]);j++) {
        printf("%*s ", ColorStrMax, Colors[j]);
        int i;
        for (i = 0; i < sizeof(Texts) / sizeof(Texts[0]); i++) {
            printf("%s%s %-*s%s %s ", Backs[j], Texts[i], ColorStrMax, Colors[i], ES_TextDefault(), ES_BackDefault());
        }
        printf("\n");
    }

    return(0);
}

0 件のコメント:

コメントを投稿