ANSI Escape Code 備忘録
なにこれ?
ANSI Escape Code についての備忘録。
ANSI Escape Code ってなに?
ANSI Escape Code とは、ターミナルの表示を制御するための一連の文字列のこと。
\n を出力ストリームに渡すことで改行が行われるように、特定のエスケープシーケンスを出力ストリームに渡すことでより複雑なことができます。
例えば以下のことが制御可能。
- 文字の装飾:色(文字色・背景色)の変更、スタイル(太字・斜体・下線など)の適用
- カーソル操作:自由な位置への移動、現在位置の保存・復元
- 画面制御:画面や行のクリア、代替バッファ(別画面)への切り替え、カーソルの非表示
ANSI Escape Code は多くのターミナルエミュレータでサポートされていて、 開発言語や環境差をそこまで気にしなくていいのがメリット。(一部の環境では動作しない制御コマンドもある)
基本フォーマット
ANSI Escape Code は、まず以下のいずれかを 接頭辞(エスケープ文字) として記述するのが基本です。
| 種類 | 表記 | 補足 |
|---|---|---|
| 8進数 | \033 | |
| 10進数 | 27 | ASCIIコード |
| 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 の指定をオフにする |
スタイルサンプル
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 | 背景色をデフォルトに戻す |
カラー(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
カラー(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
カラー(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 | カーソルを y 行 x 列目に移動 | 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.
ANSIエスケープコード - Wikipedia