Emacsで制御コードを入力する
Emacsを使っているときでも時々制御コードを直接入力したいことがある。
- 文字列を置換するときに改行を入れたい
- 強制的にタブを入力したい(たいていのモードではタブはインデントの設定になる)
ちょっとググれば、Ctrl-qを使うことで改行やタブが入力できることが分かる。改行はCtrl-q Ctrl-j、タブはCtrl-q Ctrl-iだ。しかし、なぜ改行がCtrl-jでタブがCtrl-iなのかはあまり説明がない。こういうのは理屈が分かっていないと覚えられないし、何より応用が効かない。例えばForm Feed (0x0C) を入力したい場合はどうすれば良いだろう?
"emacs ctrl-q"でググったところ、Google Booksにある"Unix Power Tools"という本の一部が引っかかった。曰く:
Ctrl-q tells Emacs that the next character you types is text, not a part of some command. So the sequence Ctrl-q Ctrl-l inserts the character Ctrl-l into your file;
適当な訳
Ctrl-qは、あなたがタイプしたのがテキストで、コマンドの一部ではないことをEmacsに伝える。そのため、Ctrl-q Ctrl-lというシーケンスは文字Ctrl-lをファイルに入力する。
うーん、これだけだとちょっと分からない。と、ここでWikipediaの「コントロールキー」の項目を見ると、コントロールキーの歴史として以下のようなことが書いてある。
テレタイプ端末、及び初期のコンピュータキーボードでは、コントロールキーを押しながら他のキーを押すと、生成されるASCIIの下位5ビット以外がゼロとなった。これによりユーザーはASCIIの非表示文字である最初の32文字 (0x00 - 0x1f) を生成、入力できる。
これで何となく分かった気がする。小文字のjはASCIIコードで0x6A、2進数なら01101010。下位5ビット以外を0にすると00001010 = 0x0A、つまり改行を表すLFになる。また、小文字のi (0x69 = 01101001) についても同様に処理すれば00001001 = 0x09 (タブ) となる。つまり、入力されたキーのASCIIコードと0x1fとのANDを取ればよい。
ということで、原理が分かればあとはASCIIコード表と簡単な計算でどんな制御コードでも入力できるようになる。と思ったのだが、実際にはCtrl-qの後に入力できる文字は限られているようだ。例えば、Ctrl-q Ctrl-, を打っても"C-, is not a valid character"と言われてしまう。試した結果、Ctrl-q Ctrlの次に以下のキーを押せば0x00-0x1Fを入力することができる。
Ctrl-q Ctrlの後に押すキー | そのキーの16進表記 | 上位3ビットを0 (=入力される制御コード) |
---|---|---|
@ | 0x40 | 0x00 |
a | 0x61 | 0x01 |
b | 0x62 | 0x02 |
c | 0x63 | 0x03 |
d | 0x64 | 0x04 |
e | 0x65 | 0x05 |
f | 0x66 | 0x06 |
g | 0x67 | 0x07 |
h | 0x68 | 0x08 |
i | 0x69 | 0x09 |
j | 0x6A | 0x0A |
k | 0x6B | 0x0B |
l | 0x6C | 0x0C |
m | 0x6D | 0x0D |
n | 0x6E | 0x0E |
o | 0x6F | 0x0F |
p | 0x70 | 0x10 |
q | 0x71 | 0x11 |
r | 0x72 | 0x12 |
s | 0x73 | 0x13 |
t | 0x74 | 0x14 |
u | 0x75 | 0x15 |
v | 0x76 | 0x16 |
w | 0x77 | 0x17 |
x | 0x78 | 0x18 |
y | 0x79 | 0x19 |
z | 0x7A | 0x1A |
[ | 0x5B | 0x1B |
\ | 0x5C | 0x1C |
] | 0x5D | 0x1D |
^ | 0x5E | 0x1E |
_ | 0x5F | 0x1F |