ターミナルエミュレータに"Ctrlキー+何か"で送信できる範囲

(※補足記事 2012-02-28: ターミナル上のEmacsで本来使えない"Ctrlキー+何か"を使う方法 - すぎゃーんメモ)
Emacs.appでC-;(Ctrlキー + セミコロン)をよく使うコマンドに割り当てていたのだけど、思うところあってTerminal上で動くemacsに乗り換えようと思って色々と設定をいじっていたところ、Terminal上ではC-;が効かないことが分かった。
なんでダメなのかTwitterで訊きつつ調べてみた。

自分で理解した範囲では、「Ctrlキーは0x00-0x1Fの制御文字を入力するためのもの。それぞれ対応するもの以外の文字をCtrlキーとセットで押しても無意味」というかんじ?

ASCIIコード表:


The hexadecimal set:

00 nul 01 soh 02 stx 03 etx 04 eot 05 enq 06 ack 07 bel
08 bs 09 ht 0a nl 0b vt 0c np 0d cr 0e so 0f si
10 dle 11 dc1 12 dc2 13 dc3 14 dc4 15 nak 16 syn 17 etb
18 can 19 em 1a sub 1b esc 1c fs 1d gs 1e rs 1f us

20 sp 21 ! 22 " 23 # 24 $ 25 % 26 & 27 '
28 ( 29 ) 2a * 2b + 2c , 2d - 2e . 2f /
30 0 31 1 32 2 33 3 34 4 35 5 36 6 37 7
38 8 39 9 3a : 3b ; 3c < 3d = 3e > 3f ?
40 @ 41 A 42 B 43 C 44 D 45 E 46 F 47 G
48 H 49 I 4a J 4b K 4c L 4d M 4e N 4f O
50 P 51 Q 52 R 53 S 54 T 55 U 56 V 57 W
58 X 59 Y 5a Z 5b [ 5c \ 5d ] 5e ^ 5f _

60 ` 61 a 62 b 63 c 64 d 65 e 66 f 67 g
68 h 69 i 6a j 6b k 6c l 6d m 6e n 6f o
70 p 71 q 72 r 73 s 74 t 75 u 76 v 77 w
78 x 79 y 7a z 7b { 7c | 7d } 7e ~ 7f del

青文字の0x00-0x1Fの部分が制御文字、それらを送るためにCtrlキーとセットで使えるのが赤文字の0x40-0x5Fの部分。Ctrlキーと同時に押された場合は0x40を引いた(0x3Fでマスクされた?)値としてターミナルエミュレータに渡ることになる、らしい。なのでCtrlキーと同時に押して効果があるキーはこの範囲にある32種(アルファベット26種+@, [, \, ], ^, _の記号6種)だけで、それ以外のものは使えない。
…という理由でターミナル上では"Ctrlキー+何か"で使えるものが限られるのでemacsvimなどターミナル上で動くアプリケーションを使う/作る際は注意が必要。

このASCIIコードの対応からCtrl+[がEscapeだったりCtrl+HがBackSpaceだったりするのがとても納得できて勉強になりました。