文字とコマンド関数の間の結び付きは,キーマップと呼ばれるデータ構造に記
録されています.Emacsはこのマップを数多く持っています.その1つである
グローバル・キーマップは主モードに関係なく定義されている単一文字の
意味を定義しています.これは変数global-map
の値です.
各主モードには別のキーマップとしてローカル・キーマップを持ってお
り,そのモードで再定義された単一文字については,ローカル・キーマップでの
定義が優先されます.それぞれのバッファはいつでもどのローカル・キーマップ
がそのバッファで使われているかを記録しています.カレントバッファのローカ
ル・キーマップがコマンドの実行に直接影響を与える唯一のものとなります.
Lispモード,Cモード及び他の多くの主モード用のローカル・キーマップは使用
しないときでも常に存在します.それらはlisp-mode-map
,
c-mode-map
などの変数の値です.それほど頻繁には使用しない主モード
については,そのセッションではじめてそのモードが使用されたときに,ローカ
ル・キーマップを作るようにして,記憶領域を節約しています.
ミニバッファ用にもローカル・キーマップがあります.そこには,いろいろな 補完の扱いや終了コマンドなどがあります.
minibuffer-local-map
は通常入力(入力補完なし)に用いられます.
minibuffer-local-ns-map
は同様ですがSPCがRETと同じく終
了になっています.これは主としてMocklispとの互換性を保つために使われます.
minibuffer-local-completion-map
は入力補完のためのものです.
minibuffer-local-must-match-map
は確定補完のためのものです.
repeat-complex-command-map
はC-x ESCに使われます.
また各接頭辞キーは,そのキーで始まるキーの列を定義するキーマップを持っ
ています.たとえば,ctl-x-map
はC-xに続く文字に使われるキー
マップです.
ctl-x-map
はC-xに続く文字用のキーマップのある変数です.
help-map
はC-hに続く文字用です.
esc-map
はESCに続く文字用です.よってほとんどのMeta文字は実
際にはこのマップで定義されています.
clt-x-4-map
はC-x 4に続く文字用です.
mode-specific-map
はC-cに続く文字用です.
接頭辞キーの定義は引き続く文字を引くためのキーマップにすぎません.実際
には,引き続く文字のキーマップを関数定義としたLispシンボルのこともありま
す.働きは同じですが,こうするとその接頭辞キーにコマンド名を与えて,その
接頭辞の動作を表すようにすることができます.C-xはシンボル
Ctl-X-Prefix
に結び付いていて,その関数定義はC-xコマンドのキー
マップであるctl-x-map
の値です.
この種の接頭辞キーの定義は,グローバル・マップとローカル・マップのどち らに現われてもかまいません.C-c,C-x,C-h,及び ESCの接頭辞キーとしての定義はグローバル・マップに現われますので, これらの接頭辞キーはいつでも使えます.接頭辞キーの定義をローカル・マップ に設ければ,主モードごとにローカルにキーを接頭辞のキーとして定義できます.
あるモードのローカル・マップに,C-xのようなグローバルな接頭辞の
接頭辞定義を置くことも可能です.これによって,C-xで始まるキーの定
義を主モードのそのキーの定義を優先にするようにできます.このケースは特殊
です.なぜならローカルな定義は完全にはグローバルな定義に置き換わることは
ないからです.グローバルおよびローカルなキーの定義が異なったキーマップな
ら,次の文字についてそう法のキーマップを調べます.通常のように,ローカル
な定義がグローバルな定義よりも優先されます.したがって,C-xに続く
文字はC-xコマンドを再定義した主モードのローカルなキーマップと
ctl-x-map
の両方で探されます.C-xコマンドに対する主モードの
キーマップがnil
のときはC-xコマンドに対するグローバル・キー
マップの定義が使われます.
キーマップは実際にはLispのオブジェクトです.もっとも簡単なキーマップの
形式は長さ128のLispベクタです.このようなキーマップに置ける文字の結び付
きは,その文字をインデックスとしてベクタを引けば得られます.キーマップは
Lispリストのこともあります.このリストのcar(第一要素)はシンボル
keymap
で残りの要素は(char . binding)
の形をし
た対です.こういったリストは疎なキーマップと呼ばれます.それは文字のエン
トリのほとんどがnil
であるときに使用されるからです.疎なキーマップ
は主として接頭辞文字に使用されます.
キーマップは128の長さしかありません.128から255のコードのMeta文字につ
いてはどうなのでしょうか?Meta文字を含むキーは実際にはESCで始まる2
つの文字の列として表現されます.従ってM-aキーは,実際には
ESC aと表現されており,その結び付きは,esc-map
注の
`a'スロットにあります.