エスケープシーケンスまとめ

エスケープシーケンスとは?

コンソールに、\033 または \x1b から始まる文字を出力することでコンソールの表示を制御する。
8進数 033 は、16進数で 0x1b、10進数で27であり、ESCを表す。

画面消去

文字列 説明
\033[0J カーソル位置から画面右下まで消去
\033[1J カーソル位置から画面左上まで消去
\033[2J 全画面消去
\033[0K カーソル位置から行末まで消去
\033[1K カーソル位置から行頭まで消去
\033[2K カーソル位置の行を消去

カーソル移動

文字列 説明
\033[nA カーソルをn行上へ移動
\033[nB カーソルをn行下へ移動
\033[nC カーソルをn桁右へ移動
\033[nD カーソルをn桁左へ移動
\033[r;cH カーソルをr行、c列目へ移動

文字修飾

文字列 説明
\033[1m 強調(太字)
\033[4m 下線
\033[7m 文字色と背景色の反転
\033[0m 標準に戻す

文字色

文字列 説明
\033[30m
\033[31m
\033[32m
\033[33m 黄色
\033[34m
\033[35m マゼンタ
\033[36m シアン
\033[37m
\033[39m 標準色に戻す

背景色

文字列 説明
\033[40m
\033[41m
\033[42m
\033[43m 黄色
\033[44m
\033[45m マゼンタ
\033[46m シアン
\033[47m
\033[49m 標準色に戻す

マクロ

以下のようなマクロを定義しておくと便利かもしれない。

// 消去
#define CLR_SCR()       printf("\033[2J") // 全画面消去
#define CLR_RIGHT()     printf("\033[0K") // カーソル位置から行末まで消去
#define CLR_LEFT()      printf("\033[1K") // カーソル位置から行頭まで消去
#define CLR_LINE()      printf("\033[2K") // カーソル位置の行を消去

// カーソル移動
#define LOCATE(r,c)     printf("\033[%d;%dH", r, c)  //カーソル位置を移動

// 文字修飾
#define CHR_BOLD        "\033[1m"   // 太字
#define CHR_REVERT      "\033[7m"   // 文字色反転
#define CHR_RESET       "\033[0m"   // 通常に戻す

// 文字色
#define CHR_BLACK       "\033[30m"  //黒
#define CHR_RED         "\033[31m"  //赤
#define CHR_GREEN       "\033[32m"  //緑
#define CHR_YELLOW      "\033[33m"  //黄色
#define CHR_BLUE        "\033[34m"  //青
#define CHR_MAGENTA     "\033[35m"  //マゼンタ
#define CHR_CYAN        "\033[36m"  //シアン
#define CHR_WHITE       "\033[37m"  //白
#define CHR_NORMAL      "\033[39m"  //標準色に戻す

// 背景色
#define BG_BLACK        "\033[40m"  //黒
#define BG_RED          "\033[41m"  //赤
#define BG_GREEN        "\033[42m"  //緑
#define BG_YELLOW       "\033[43m"  //黄色
#define BG_BLUE         "\033[44m"  //青
#define BG_MAGENTA      "\033[45m"  //マゼンタ
#define BG_CYAN         "\033[46m"  //シアン
#define BG_WHITE        "\033[47m"  //白
#define BG_NORMAL       "\033[49m"  //標準色に戻す

使い方

上記のマクロ定義を esc.h としてインクルード。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include "esc.h"

int main(void)
{
    int count = 0;

    CLR_SCR();
    LOCATE(1, 1);
    printf(CHR_BOLD CHR_GREEN "Escape Sequence Test");

    LOCATE(3, 1);
    printf(CHR_BLUE "count:  \n");
    printf(CHR_BLUE "random: \n");
    printf(CHR_RESET);
    fflush(stdout);

    while(1){
        LOCATE(3, 9); CLR_RIGHT();
        printf("%4d", count);
        LOCATE(4, 9); CLR_RIGHT();
        printf("%4d", rand() % 10000);
        printf("\n");
        count++;
        usleep(500 * 1000);
    }
    return 0;
}