CONSOLE_CODES(4)

名前
console_codes - Linux コンソールのエスケープシーケンスとコントロール シーケンス

説明
Linux コンソールは VT102 と ECMA-48/ISO6429/ANSI X3.64 端末コンソール のサブセットに、カラーパレット(color palette)やキャラクターセット (character-set)のマッピングなどを変更するプライベート・モードシーケンス (private-mode sequence)を加えて実装されている。 以下の表では、機能の ECMA-48 または DEC のニーモニクス(DECで始まれば 後者)を 2 番目のカラムに記す。 ニーモニクスのないものは ECMA-48 でも VT102 でもないものである。

すべてのプロセスでの出力作業が終って、実際に印字するために文字のストリー ムがコンソールドライバーに届いた時、最初に行なわれるのが、処理用コード から印字用のコードへの変換である。

もし、コンソールが UTF-8 モードなら、入って来たバイト(byte) は 16 ビットの Unicode に組み立てられる。そうでなければ、それぞれ のバイトは現在の(各バイトを Unicode の値に変換する)マッピングテーブルに 従って変換される。これに関しては下のキャラクターセット(CHARCTER SETS) 節を参照のこと。

通常、Unicode の値はフォントインデックス(font index) に変換され、 ビデオメモリ(video memory) に蓄えられる、そして(ビデオラム中に見付 けられる)対応するグリフ(glyph)が画面に現れる。 Unicode の使用(と PC 互換機の設計)は、512 の異なったグリフを同時に使 用することを可能にする。

現在の Unicode の値がコントロール文字であるかエスケープシーケンス を処理している時には、その値は特別に扱われる。 フォントのインデックスに変換されてグリフとして表示される代わりに、カー ソルの移動やその他のコントロール機能を実行させる。 詳しいことは、後述する LINUX CONSOLE CONTROLS のセクションを参照の事。

一般に端末コントロールコードをプログラム中に直接記述する事はいいことで はない。Linuxでは、 端末において実現可能な操作のデータベースである terminfo(5) をサポートしている。 コンソールエスケープシーケンスをわざわざ入力するよりも、ほとんどの場合 terminfo の情報を参照する ncurses(3), tput(1), や reset(1) などのスクリーンライブラリやユーティリティーを使いたいと思うであろう。

LINUXコンソールコントロール
この章では Linux コンソールにおいて特殊な機能(つまり、現在のカーソル位 置に文字のイメージを印字する以外のこと)を起こさせる全てのコントロール 文字とエスケープシーケンスについて述べる。

  コントロール文字
コントロール文字とは、(マッピングテーブルによる変換前のコードが) 00 (NUL), 07 (BEL), 08 (BS), 09 (HT), 0a (LF), 0b (VT), 0c (FF), 0d (CR), 0e (SO), 0f (SI), 18 (CAN), 1a (SUB), 1b (ESC), 7f (DEL) の 14 のコードのうちのどれかである文字である。 `コントロール文字表示(display control characters)'モード(後述)を設定 すると、07, 09, 0b, 18, 1a, 7f をグリフとして表示することができる。 一方、 UTF-8 モードでは、00-1f の全てのコードは、コントロール文字表示 モードが指定された場合でもコントロール文字として扱われる。 コントロール文字がある時には、それはすぐに(たとえエスケープシーケンス の途中でも)実行され、破棄される。エスケープシーケンスは次の文字から続 けられる (しかし、ESC は新しいエスケープシーケンスを始めるので、可能なら前の終 了していないエスケープシーケンスは中止される。さらに、CAN と SUB はどんなエスケープシーケンスも中止する)。 認められているコントロール文字は、BEL, BS, HT, LF, VT, FF, CR, SO, SI, CAN, SUB, ESC, DEL, CSI である。これらは期待どおりの動作をする：

BEL (0x07, ^G) はビープ(beeps)をならす;

BS (0x08, ^H) はバックスペース (ただし、行頭は越えない);

HT (0x09, ^I) は次のタブストップ(tab stop)へ移動する、そこから行末までに タブストップが無い場合は行の終りに移動する;

LF (0x0A, ^J), VT (0x0B, ^K), FF (0x0C, ^L) これらは全てラインフィード (linefeed)を与える;

CR (0x0D, ^M) はキャリッジリターンを与える;

SO (0x0E, ^N) は G1 キャラクターセットをアクティブにする。 LF/NL (ニューラインモード(new line mode))がセットされていればキャリッ ジリターンもアクティブにする;

SI (0x0F, ^O) は G0 キャラクターセットをアクティブにする;

CAN (0x18, ^X) と SUB (0x1A, ^Z) はエスケープシーケンスを中断する;

ESC (0x1B, ^[) はエスケープシーケンスを始める。

DEL (0x7F) は無視される;

CSI (0x9B) は ESC [ と等価。

  エスケープシーケンスであるがCSI-シーケンスでないもの
ESC c | RIS | リセット。
ESC D | IND | ラインフィード。
ESC E | NEL | ニューライン。
ESC H | HTS | 現在のカラムの位置にタブストップを設定する。
ESC M | RI | 逆ラインフィード
ESC Z | DECID | DEC固有の識別用。カーネルは文字列 ESC [ ? 6 c を返す。
 |  | これは端末がVT102であることを意味する。
ESC 7 | DECSC | 現在の状態(カーソルの座標、属性、文字セット)を
 |  | セーブする。
ESC 8 | DECRC | 最後にセーブした状態を復帰させる。
ESC [ | CSI | コントロールシーケンスを導入する。
ESC % |  | キャラクターセットを選択するシーケンスを開始する。
ESC % @ |  | デフォルト(ISO 646 / ISO 8859-1)を選択する。
ESC % G |  | UTF-8 を選択する。
ESC % 8 |  | UTF-8 を選択する(旧式)。
ESC # 8 | DECALN | DEC のスクリーン調整テスト - スクリーンを E で
 |  | うめる。
ESC ( |  | G0 文字セットを定義するシーケンスを開始する。
ESC ( B |  | デフォルト(ISO 8859-1 マッピング)を選択する。
ESC ( 0 |  | vt100 グラフィクスマッピングを選択する。
ESC ( U |  | ヌルマッピングを選択する - キャラクタ ROM から
 |  | 直接マッピングする。
ESC ( K |  | ユーザー定義のマッピングを選択する - そのマップ
 |  | は mapscrn(8) ユーティリティーによってロー
 |  | ドされる。
ESC ) |  | G1 を定義するシーケンスを開始する。
 |  | (すでに述べたように B, 0, U, K のどれかが次に続く)
ESC > | DECPNM | 数値キーパッドモード(numeric keypad mode)を
 |  | セットする。
ESC = | DECPAM | アプリケーションキーパッドモード(application keypad
 |  | mode) をセットする。
ESC ] | OSC | (オペレーティングシステムコマンドでなけらばならない)
 |  | ESC ] P nrrggbb: 最後の P のあとの 7 つの 16 進
 |  | 数をパラメータとして :-( パレットをセットする。
 |  | ここで、nは色 (0-16)、rrggbbは赤/緑/青の値
 |  | (0-255)を意味する。
 |  | ESC ] R: パレットをリセットする。

  ECMA-48 CSI シーケンス
CSI (または ESC [ ) のあとに、最大で NPAR (16) 個のセミコロンで区切られ た10進数のパラメータシーケンスが続く。 空であるかそこにないパラメータは 0 とされる。 パラメータシーケンスの前にはひとつのクエスチョンマークがつくことがある。 しかし、CSI [ (または ESC [ [ ) の後では、一文字が読まれ、このすべての パラメータシーケンスが無視される(要するにファンクションキーのエコーは 無視されるということである)。 CSI シーケンスの動作は、その最後の文字によって決まる。
@ | ICH | 指示された数の空白文字を挿入する。
A | CUU | 指示された数だけカーソルを上方向に移動する。
B | CUD | カーソルを指示された数の行だけ下方向に移動する。
C | CUF | カーソルを指示された数のカラムだけ右に移動する。
D | CUB | カーソルを指示された数のカラムだけ左に移動する。
E | CNL | カーソルを指示された数の行だけ下の第 1 カラムに移動する。
F | CPL | カーソルを指示された数の行だけ上の第 1 カラムに移動する。
G | CHA | カーソルを現在の行の指示されたカラムに移動する。
H | CUP | カーソルを指示された行、カラム(1,1を原点とする)
 |  | に移動する。
J | ED | ディスプレイの消去(デフォルト: カーソルからディスプレ
 |  | イの最後まで)。
 |  | ESC [ 1 J: 最初からカーソルまでの消去。
 |  | ESC [ 2 J: ディスプレイ全体の消去。
K | EL | 行の消去(デフォルト: カーソルから行末まで)。
 |  | ESC [ 1 K: 行頭からカーソルまでの消去。
 |  | ESC [ 2 K: 行全体の消去。
L | IL | 指示された数の空行を挿入する。
M | DL | 指示された数の行を削除する。
P | DCH | 現在の行から指示された数の文字を削除する。
X | ECH | 現在の行から指示された数の文字を消去する。
a | HPR | カーソルを指示された数のカラムだけ右に移動する。
c | DA | ESC [ ? 6 c を返す: `私はVT102です'(ということ)。
d | VPA | カーソルを指示された行の現在のカラムに移動する。
e | VPR | カーソルを指示された行数だけ下に移動する。
f | HVP | カーソルを指示された行、カラムに移動する。
g | TBC | パラメータなしの時: 現在位置のタブストップを削除する。
 |  | ESC [ 3 g: すべてのタブストップを削除する。
h | SM | モードのセット(後述)。
l | RM | モードのリセット(後述)。
m | SGR | 属性のセット(後述)。
n | DSR | 状態の報告(後述)。
q | DECLL | キーボードの LED をセットする。
 |  | ESC [ 0 q: すべての LED を消す。
 |  | ESC [ 1 q: スクロールロック LED を点灯。
 |  | ESC [ 2 q: ナンバーロック LED を点灯。
 |  | ESC [ 3 q: キャピタルロック LED を点灯。
r | DECSTBM | スクロールの範囲のセット; パラメータは一番上の行と
 |  | 一番下の行。
s | ? | カーソル位置の保存。
u | ? | カーソル位置の復帰。
` | HPA | カーソルを現在の行の指示されたカラムに移動する。

  ECMA-48 グラフィクスレンディション(Graphics Rendition)の設定
ECMA-48 SGR シーケンス ESC [ <パラメータ> m は表示属性を設定する。 同じシーケンスでいくつかの属性を設定することができる。

par | 結果
0 | すべての属性をデフォルトにリセットする。
1 | ボールド(bold)をセット。
2 | ハーフブライト(half-bright)(カラーディスプレイでは色で代用)を
 | セット。
4 | 下線(underscore)をセット(カラーディスプレイでは色で代用)。
 | (ディムや下線を代用するのに使われる色は ESC ] ... によりセット)
5 | 点滅(blink)をセット。
7 | 反転表示(reverce video)をセット。
10 | 選択したマッピング、ディスプレイコントロールフラグ(display
 | control flag)、トグルメタフラグ(toggle meta flag)をリセット
 | する。
11 | ヌルマッピングを選択、ディスプレイコントロールフラグをセット、
 | トグルメタフラグをリセットする。
12 | ヌルマッピングを選択、ディスプレイコントロールフラグ、
 | トグルメタフラグをセットする。(トグルメタフラグがたっていると、
 | マッピングテーブルによる変換をする前に、バイトの上位の1ビット
 | がトグルされる。)
21 | 通常の輝度にセット(これは、ECMA-48 互換ではない)。
22 | 通常の輝度にセット。
24 | 下線オフ。
25 | 点滅オフ。
27 | 反転表示オフ。
30 | フォアグラウンド(foreground)を黒にセット。
31 | フォアグラウンドを赤にセット。
32 | フォアグラウンドを緑にセット。
33 | フォアグラウンドを茶にセット。
34 | フォアグラウンドを青にセット。
35 | フォアグラウンドをマゼンダにセット。
36 | フォアグラウンドをシアンにセット。
37 | フォアグラウンドを白にセット。
38 | 下線表示に設定し、フォアグラウンドをデフォルトにセット。
39 | 下線表示を解除し、フォアグラウンドをデフォルトにセット。
40 | バックグラウンド(background)を黒にセット。
41 | バックグラウンドを赤にセット。
42 | バックグラウンドを緑にセット。
43 | バックグラウンドを茶にセット。
44 | バックグラウンドを青にセット。
45 | バックグラウンドをマゼンダにセット。
46 | バックグラウンドをシアンにセット。
47 | バックグラウンドを白にセット。
49 | バックグラウンドをデフォルトにセット。

  ECMA-48 モードスイッチ(Mode Switches)

ESC [ 3 h
    DECCRM (デフォルトではオフ): コントロール文字を表示する。

ESC [ 4 h
    DECIM (デフォルトではオフ): 挿入モードにする。

ESC [ 20 h
    LF/NL (デフォルトではオフ): LF, VT, FFをエコーしたあと自動的 CR をつける。

  ECMA-48 状態リポートコマンド(Status Report Commands)

ESC [ 5 n
    デバイス状態のリポート(DSR): 返事は ESC [ 0 n (端末 OK).

ESC [ 6 n
    カーソル位置のリポート(CPR): 返事は ESC [ y ; x R、 x,y はカーソルの位置をあらわす。

  DEC 固有モード (DECSET/DECRST) シーケンス
これらは ECMA-48 では記述されていない。ここでは、セットモードシーケン ス (Set Mode sequences)を記載する; 最後の `h' を `l' に置き換えるとリセッ トモードシーケンス(Reset Mode sequences)になる。

ESC [ ? 1 h
    DECCKM (デフォルトはオフ): セットされた時にはカーソルキーは ESC [ では なく ESC O を前につけて送る。

ESC [ ? 3 h
    DECCOLM (デフォルトはオフ = 80 カラム): 80/132 のカラムモード切替え。 ドライバーのソースの注釈には、これだけでは十分でなく、 resizecons(8) のようなユーザーモードのユーティリティーで、コンソールビデオカードのハー ドウェアレジスタを変える必要があるとあると書かれている。

ESC [ ? 5 h
    DECSCNM (デフォルトはオフ): 反転ビデオモード(reverse-video mode)のセッ ト。

ESC [ ? 6 h
    DECOM(デフォルトはオフ): セットされた時には、カーソルのアドレッシングが、 スクロール範囲の左上隅からの相対位置になる。

ESC [ ? 7 h
    DECAWM(デフォルトはオン): オートラップを設定。このモードの時は、80カラ ム(DECCOLMがオンのときは132カラム)をこえてグラフィックキャラクタは、強 制的に次の行の先頭に折り返されて表示される。

ESC [ ? 8 h
    DECARM(デフォルトはオン): キーボードのオートリピートをオンにセット。

ESC [ ? 9 h
    X10 マウスリポート(デフォルトはオフ): リポートモードを 1 にセット(また は、0 にリセット) - 後述

ESC [ ? 25 h
    DECCM (デフォルトはオン): カーソルを可視(visible)にする。

ESC [ ? 1000 h
    X11 マウスリポート(デフォールトはオフ): リポートモードを 2 にセット(ま たは、0にリセット) - 後述

  Linux コンソール固有の CSI シーケンス
以下のシーケンスは ECMA-48 のものでも本来の VT102 のものでもでもなく、 Linuxコンソールドライバーに固有なシーケンスである。色は SGR パラメータ で表現される: 0 = 黒, 1= 赤, 2 = 緑, 3 = 茶, 4 = 青, 5 = マゼンタ, 6 = シアン, 7 = 白
ESC [ 1 ; n ] | 下線の色をn にセットする。
ESC [ 2 ; n ] | ディムの色をn にセットする。
ESC [ 8 ] | 現在の色のペアをデフォルト属性にする。
ESC [ 9 ; n ] | スクリーンブランク(screen blank)のタイムアウト
 | を n 分にセットする。
ESC [ 10 ; n ] | ベルの周波数(Hz)をセットする。
ESC [ 11 ; n ] | ベルの鳴っている時間(msec)をセットする。
ESC [ 12 ; n ] | 指定のコンソールを前面に持ってくる。
ESC [ 13 ] | スクリーンをアンブランク(Unblank)する。
ESC [ 14 ] | VESA電源停止インターバル(VESA powerdown
 | interval)をセットする。

文字セット
カーネルはバイト列からコンソールスクリーン符号への 4 種類の変換につい て知っている。 4 つの変換テーブルとは、a) Latin1 -> PC, b) VT100 graphics -> PC, c) PC -> PC, d)ユーザー定義, である。 G0 と G1 と呼ばれる二つの文字セットがあり、そのうち一つが現在の文字セッ トである(初期値は G0 )。 ^N をタイプすると G1 が ^O を入力すると G0 が現在の文字セットになる。 変数 G0 と G1 は変換テーブルを指しており、ユーザーにより変更できる。 最初はそれぞれテーブル a) と テーブル b) を指している。 ESC ( B 、 ESC ( 0 、 ESC ( U 、 ESC ( K のそれぞれのシーケンスにより、 G0 が変換テーブル a)、 b)、 c)、 d) を指すようになる。 また、ESC ) B 、 ESC ) 0 、 ESC ) U 、 ESC ) K のそれぞれのシーケンス により、G1 が変換テーブル a)、 b)、 c)、 d) を指すようになる。 ESC c のシーケンスは端末をリセットする。スクリーンがめちゃくちゃになっ た時にそうすることが必要である。よくアドバイスされる "echo ^V^O" は G0 を現在の文字セットにするだけであり、G0 がテーブル a) を指しているとい う保証はない。 いくつかのディストリビューションには、 reset(1) というプログラムが含まれるが、これはただ "echo ^[c" を実行するものである。 もし、コンソールの terminfo エントリーが正しい(かつ rs1=\Ec のエントリー がある)ならば、"tput reset"でも同じ効果がある。 ユーザー定義のマッピングテーブルは mapscrn(8) を使って定義できる。 マッピングの結果、シンボル c が印字されるとシンボル s = map[c] がビデ オメモリーに送られる。s に対応するビットマップはキャラクター ROM にあり、 setfont(8) により変更可能である。

マウストラッキング
マウストラッキング機能は、xterm 互換のマウスステータスリポート(mouse status reports)を返させるためのものである。 コンソールドライバーはマウスのデバイスや種類について知る方法が ないので、仮想ターミナルドライバーがマウス更新の ioctl を受け取った時 だけ、マウスステータスリポートがコンソールの入力ストリームに送られる。 この ioctl は、gpm(8) デーモンのようなマウス対応のユーザーモード アプリケーションが発生しなければならない。 xterm によって生成される全てのマウス追跡エスケープシーケンスのた めのパラメータは、数値を value+040 のように符合化し、一つの文字と してあらわす。 例えば、`!' は 1 になる。スクリーン座標は 1 をベースにする。 X10 互換モードでは、ボタンが押された時にマウスの位置と押されたマウスの ボタンとをエンコードしたエスケープシーケンスを送る。 この機能は ESC [ ? 9 h を送ると有効になり ESC [ ? 9 l により無効になる。 ボタンが押されると xterm は ESC [ M bxy (の 6 文字)を送る。 ここで b は button-1, x と y は マウスがボタンが押 された時の x と y 座標である。 このコードはカーネルが発生するのと同じコードである。 ノーマルトラッキングモード(Normal tracking mode)(Linux 2.0.24では実装 されていない)では、両方のボタンが押されたか離された時にエスケープシー ケンスが送られる。 モディファイアの情報も一緒に送られる。 この機能は、ESC [ ? 1000 h を送ると有効になり ESC [ 1000 l で無効になる。 ボタンが押されるか離されるかした時には、xterm は ESC [ M bxy を送る。 b の低位の2ビットにはボタン情報がエンコードされる: 0=MB1 が押された, 1=MB2 が押された, 2=MB3 が押された, 3=離された。 高位のビットには、ボタンが押された時にどのモディファイアがダウンしてい たかがエンコードされる: 4=Shift, 8=Meta, 16=Control そして、上位と下位ビッ トが加算される。 ここでも x と y は、マウスイベントが起こった時の x と y 座 標であり、左上の隅が(1,1)である。

他のターミナルとの比較
多くの異なるターミナルタイプが、Linux コンソールのように、`VT100互換' を名乗っている。ここでは、Linux コンソールと 2 つの最も重要なターミナル であるDEC VT102と xterm(1) との違いについて述べる。

  コントロール文字の取り扱い
vt102 は以下のコントロール文字も認識する：

NUL (0x00) は無視される；

ENQ (0x05) はアンサーバックメッセージ(answerback message)を発生する；

DC1 (0x11, ^Q, XON) は送信を再開する；

DC3 (0x13, ^S, XOFF) は vt100 に XOFF と XON 以外のコードを無視(そして 送信の停止)を起こさせる。

tty ドライバーにより VT100 に似た DC1/DC3 処理をできる。

xterm (vt100 モード)は BEL, BS, HT, LF, VT, FF, CR, SO, SI, ESC の コントロール文字を認識する。

  エスケープシーケンス
Linux コンソールで実装されていない VT100 コンソールシーケンスは:

ESC N | SS2 | シングルシフト 2
 |  | (次の文字だけ G2 文字セットを選択する)。
ESC O | SS3 | シングルシフト 3
 |  | (次の文字だけ G3 文字セットを選択する)。
ESC P | DCS | デバイス制御文字列 (ESC \ で終わる)
ESC X | SOS | 文字列の始まり。
ESC ^ | PM | プライバシーメッセージ(ESC \ で終わる)。
ESC \ | ST | 文字列のターミネータ。
ESC * ... |  | G2 文字集合を指定する。
ESC + ... |  | G3 文字集合を指定する。
xterm (vt100 モード)は ESC c, ESC # 8, ESC >, ESC =, ESC D, ESC E, ESC H, ESC M, ESC N, ESC O, ESC P ... ESC \, ESC Z を認識する(`わたしは高等ビデオオプション付きの vt100 です'という 意味で ESC [ ? 1 ; 2 c と返答する)、ESC ^ ... ESC \ は上述と同じ意味を あらわす。ESC (, ESC ), ESC *, ESC + に続く 0, A, B を DEC 特殊文字と して受け、それぞれラインドローイング(line drawing) のセット、UK、 US ASCII をあらわす。 xterm は、特定のリソースの設定のために ESC ] を受け付ける。

ESC ] 0 ; txt BEL | アイコン名とウインドウタイトルを txt
 | にセットする。
ESC ] 1 ; txt BEL | アイコン名を txt にセットする。
ESC ] 2 ; txt BEL | ウインドウタイトルを txt にセットする。
ESC ] 4 6 ; name BEL | チェンジログファイルを name に変更する(通常は
 | コンパイル時オプションにより無効になっている)。
ESC ] 5 0 ; fn BEL | フォントを fn にセット。
以下のものは、少し違った意味にとられる:

ESC 7 DECSC | カーソルの保存。
ESC 8 DECRC | カーソルの復元。
また、次のものも認識する:

ESC F |  | カーソルをスクリーンの左下に移動する。
 |  | ( hpLowerleftBugCompatリソースにより有効な時)
ESC l |  | (HP ターミナル毎に)メモリーロック。
 |  | カーソルより上のメモリーをロックする。
ESC m |  | (HP ターミナル毎に)メモリーロックを解除する。
ESC n | LS2 | G2 文字セットの呼び出し。
ESC o | LS3 | G3 文字セットの呼び出し。
ESC | | LS3R | G3 文字セットを GR として呼び出す。
 |  | xtermでは目に見える効果はない。
\SC } | LS2R | G2 文字セットを GR として呼び出す。
 |  | xtermでは目に見える効果はない。
ESC ~ | LS1R | G1 文字セットを GR として呼び出す。
 |  | xtermでは目に見える効果はない。
ESC % ... は認識しない。

  CSI シーケンス
xterm (XFree86 3.1.2Gのもの)はブリンクや SGRs の不可視モード(invisible-mode) は認識しない。 元々の(XFree86 でない) X11R6 は SGRs の色設定(color-setting)を認識しない。 Linux が認識する他のすべての ECMA-48 CSI シーケンスは xterm でも認識される。また、逆も真である。 xterm は上述のすべての DEC 固有モードのシーケンスを認識するが、Linux 固有モー ドのシーケンスはどれも認識しない。 xterm 自身の固有モードシーケンスに関しての議論は、 X 配布とともに入手可能な Edward Moy と Stephen Gildea の Xterm Control Sequences ドキュメントを参照されたい。

バグ
2.0.23 では CSI が壊れていて、エスケープシーケンス中の NUL が 無視されない。

関連項目
console(4), console_ioctl(4), charsets(4)

翻訳者
石川 睦 <ishikawa@linux.or.jp> 高橋 睦司<muz@ilp.iijnet.or.jp>