Site logo
devhx2.blog

ANSI Escape Code 備忘録

なにこれ?

ANSI Escape Code についての備忘録。

ANSI Escape Code ってなに?

ANSI Escape Code とは、ターミナルの表示を制御するための一連の文字列のこと。 \n を出力ストリームに渡すことで改行が行われるように、特定のエスケープシーケンスを出力ストリームに渡すことでより複雑なことができます。 例えば以下のことが制御可能。

ANSI Escape Code は多くのターミナルエミュレータでサポートされていて、 開発言語や環境差をそこまで気にしなくていいのがメリット。(一部の環境では動作しない制御コマンドもある)

基本フォーマット

ANSI Escape Code は、まず以下のいずれかを 接頭辞(エスケープ文字) として記述するのが基本です。

種類表記補足
8進数\033
10進数27ASCIIコード
16進数\x1b
Unicode\u001b
エスケープ\e非推奨。言語・コンパイラによって動作保証が異なる。

多くの制御コマンドは、この接頭辞の直後に [(開き角括弧)を付けます。このセットを CSI (Control Code Introducer) と呼び、この後ろに引数(数値)を ; 区切りで記述し、最後に「何をさせるか」を決める英字(コマンド)を置いて完結させます。

bash
# フォーマット: \033[ (引数1);(引数2) (コマンド)

# 例1: \033[3;32m
# 3 = 斜体、32 = 緑、m = 文字属性変更コマンド
# 例2: \033[0m
# 0 = リセット、m = 文字属性変更コマンド
printf '\033[3;32m Hello ANSI \033[0m'

テキスト装飾(SGR)

最もよく使われるのが、文字の色やスタイルを変更する SGR (Select Graphic Rendition) パラメータ。 ESC[m の間に数値を指定して実行します。

スタイル指定

コード説明備考
ESC[0mスタイルと色を初期化ESC[m と同等
ESC[1m太字フォントが対応していれば適用
ESC[2m薄字フォントが対応していれば適用
ESC[3m斜体フォントが対応していれば適用
ESC[4m下線
ESC[5m点滅(低速)私の環境では動作しなかった
ESC[6m点滅(高速)私の環境では動作しなかった
ESC[7m文字色と背景色を反転
ESC[8m文字を非表示選択してコピペすることは可能
ESC[9m取り消し線
ESC[10mデフォルトフォントに設定私の環境では動作しなかった
ESC[11m ~ ESC[19m代替フォントの選択私の環境では動作しなかった
ESC[20mフラクツール (Fraktur)私の環境では動作しなかった
ESC[21m二重下線環境によっては太字オフとして動作する
ESC[22m太字・薄字を解除1 と 2 の指定をオフにする
ESC[23m斜体・フラクツールを解除3 と 20 の指定をオフにする
ESC[24m下線を解除4 と 21 の指定をオフにする
ESC[25m点滅を解除5 と 6 の指定をオフにする
ESC[26m比例間隔私の環境では動作しなかった
ESC[27m反転を解除7 の指定をオフにする
ESC[28m非表示を解除8 の指定をオフにする
ESC[29m取り消し線を解除9 の指定をオフにする

alt

スタイルサンプル
bash
printf '\033[1mBold\033[22m          -> Reset\n'
printf '\033[2mThin\033[22m          -> Reset\n'
printf '\033[3mItalic\033[23m        -> Reset\n'
printf '\033[4mUnderLine\033[24m     -> Reset\n'
printf '\033[7mInvert\033[27m        -> Reset\n'
printf '\033[8mHide\033[28m          -> Reset\n'
printf '\033[9mStrikethrough\033[29m -> Reset\n'

色指定

コード説明備考
ESC[30m ~ ESC[37m文字色を30~37で指定番号と色の対応は以下の画像の通り
ESC[38;2;r;g;bm文字色をRGB(0~255)で指定
ESC[38;5;idm文字色を0~255のカラーインデックスで指定
ESC[39m文字色をデフォルトに戻す
ESC[40m ~ ESC[47m背景色を40~47で指定番号と色の対応は以下の画像の通り
ESC[48;2;r;g;bm背景色をRGB(0~255)で指定
ESC[48;5;idm背景色を0~255のカラーインデックスで指定
ESC[49m背景色をデフォルトに戻す

alt

カラー(0~7)サンプル
bash
COLORS=("Black" "Red" "Green" "Yellow" "Blue" "Magenta" "Cyan" "White")

for ((i=0; i<${#COLORS[@]}; i++))
do
    fg="3${i}"
    printf "\033[${fg}m%-10s\033[39m " "${fg}:${COLORS[$i]}"
    bg="4${i}"
    printf "\033[${bg}m%-10s\033[49m\n" "${bg}:${COLORS[$i]}"
done

alt

カラー(RGB)サンプル
bash
for i in {0..15}; do
    for j in {0..31}; do
        r=$((i * 16))
        g=$((j * 8))
        printf "\033[38;2;%d;%d;255m@" "$r" "$g"
    done
    printf "\033[39m\n"
done

printf "\n"

for i in {0..15}; do
    for j in {0..31}; do
        r=$((i * 16))
        g=$((j * 8))
        printf "\033[48;2;%d;%d;255m@" "$r" "$g"
    done
    printf "\033[49m\n"
done

alt

カラー(ID)サンプル
bash
for i in {0..15}; do
    for j in {0..15}; do
        fg=$(((i * 16) + j))
        printf "\033[38;5;${fg}m%02x\033[39m " "${fg}"
    done
    printf "\n"
done

printf "\n"

for i in {0..15}; do
    for j in {0..15}; do
        bg=$(((i * 16) + j))
        printf "\033[48;5;${bg}m%02x\033[49m " "${bg}"
    done
    printf "\n"
done

画面削除

コード説明備考
ESC[2J画面全体をクリア

カーソル制御

移動

コード説明備考
ESC[nAカーソルを n 行上に移動
ESC[nBカーソルを n 行下に移動
ESC[nCカーソルを n 桁右に移動
ESC[nDカーソルを n 桁左に移動
ESC[nEカーソルを n 行下の先頭に移動
ESC[nFカーソルを n 行上の先頭に移動
ESC[nGカーソルを現在の行の n 列目に移動
ESC[y;xHカーソルを yx 列目に移動1 から始まることに留意

形状

コード説明備考
ESC[0 qカーソルをデフォルトに変更
ESC[1 qカーソルを点滅するブロック に変更
ESC[2 qカーソルを点滅しないブロック に変更
ESC[3 qカーソルを点滅する下線 _ に変更
ESC[4 qカーソルを点滅しない下線 _ に変更
ESC[5 qカーソルを点滅する縦線 に変更
ESC[6 qカーソルを点滅しない縦線 に変更

参考

ANSI Escape Codes

ANSI Escape Codes. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

ANSIエスケープコード - Wikipedia

ja.wikipedia.org