プログラムに彩りを与える以下の2つについて紹介する。
ESC文字のあとに決まった文字列を出力すると、様々な 画面制御が行なえる。これをエスケープシーケンスという。
ESC文字はプログラム中 \e で表せるので、
print("\e[2J")
とすると、ESC文字に続けて [ と 2 と
J の文字が出力される。これは画面消去を意味する。
他に、Terminal上のカーソルを狙った位置に移動するためのものを含めて示す。
| 並び | 意味 | 例 | 
|---|---|---|
ESC[2J | 画面消去 | printf("\e[2J") | 
ESC[y;xH | 
  y行x桁目に移動 (省略すると1行1桁)  | 
  printf("\e[%d;%dH", y, x) | 
ESC[nA | n行上移動 | printf("\e[%dA", n) | 
ESC[nB | n行下移動 | printf("\e[%dB", n) | 
ESC[nC | n桁右に移動 | printf("\e[%dC", n) | 
ESC[nD | n桁左に移動 | printf("\e[%dD", n) | 
ESC7 | 現在のカーソル位置を保存 | print("\e7") | 
ESC8 | ESC 7 で保存したカーソル位置に戻る | print("\e8") | 
次に出力する文字に 色を付けるためのエスケープシーケンスは 既に第8回で示した。色以外にも飾りを付けられる。
ESC [Xm
のXに対応する数字を以下のように指定する。
| Xの値 | 意味 | 
|---|---|
| 0 | 標準状態に戻す | 
| 1 | 太字にする | 
| 4 | 下線を引く | 
| 7 | 反転文字にする | 
| 30 | 文字色を黒に | 
| 31 | 文字色を赤に | 
| 32 | 文字色を緑に | 
| 33 | 文字色を黄色に | 
| 34 | 文字色を青に | 
| 35 | 文字色を紫に | 
| 36 | 文字色を水色に | 
| 37 | 文字色を白に | 
| 40 | 背景色を黒に | 
| 41 | 背景色を赤に | 
| 42 | 背景色を緑に | 
| 43 | 背景色を黄色に | 
| 44 | 背景色を青に | 
| 45 | 背景色を紫に | 
| 46 | 背景色を水色に | 
| 47 | 背景色を白に | 
文字飾りと文字色と背景色を同時指定するときは数字をセミコロンで区切っ
て列挙する。
例: 黄色(33)の文字にアンダーライン(4)を引く
print("Hi \e[4;33mMike!\n") Hi Mike! => nil irb(main):002:0>
このままだと、残る画面も全部黄色アンダーラインになるので、
ESC [ m を出力して元に戻す。
printf("\e[m")
=>
irb(main):003:0> 
●が右から左へ、下から上へ移動する。
#!/usr/koeki/bin/ruby
# -*- coding: utf-8 -*-
print("これから●が\e[33m動\e[34mき\e[36mま\e[32mす!\e[m\n")
sleep 2				# 2秒間待機
print("\e[2J")			# 画面を消す
ball = "●"
kesu = "  "
wait = 0.05			# タイマー
x = 60				# 60桁目の
y = 10				# 10行目から
STDOUT.sync = true		# すぐ画面に反映させるため
while x > 10			# 右から左へ
  printf("\e[%d;%dH", y, x)	# カーソルを今の位置へ
  printf("%s", kesu)		# 前のボールを消す
  x -= 1
  printf("\e[%d;%dH", y, x)	# カーソルを次の位置へ
  color = 30 + x%8		# ボールの色をx座標によって変える
  printf("\e[%dm%s\e[m", color, ball)	# ボールを書く
  printf("\e[1;1H")		# カーソルを邪魔でないところへ
  sleep(wait)			# 一定時間休む
end
while y > 1			# 下から上へ
  printf("\e[%d;%dH", y, x)	# カーソルを今の位置へ
  printf("%s", kesu)		# 前のボールを消す
  y -= 1
  printf("\e[%d;%dH", y, x)	# カーソルを次の位置へ
  printf("%s", ball)		# ボールを書く
  printf("\e[1;1H")		# カーソルを邪魔でないところへ
  sleep(wait*2)			# 一定時間休む
end
printf("\e[%d;%dHおしまい\n", y+1, 1)