読者です 読者をやめる 読者になる 読者になる

Emacsで制御コードを入力する

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を取ればよい。

f:id:wagavulin:20170209212057p:plain

ということで、原理が分かればあとは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