キー探索(key lookup)とは、 与えられたキーマップからキー列のバインディングを捜し出す処理です。 バインディングを実際に実行することは、キー探索ではありません。
キー探索では、キー列の各イベントのイベント型のみを使い、
イベントの他の部分は無視します。
実際、キー探索に使われるキー列では、
マウスイベント全体(リスト)ではなく
そのイベント型(シンボル)のみを指定します。
See Input Events。
そのような『キー列』は、command-execute
の動作には不十分ですが、
キーの探索や再バインディングには十分です。
キー列が複数のイベントから構成される場合、 キー探索ではイベントを順番に処理します。 先頭のイベントのバインディングを探しますが、 それはキーマップであるはずです。 続いて、そのキーマップから2番目のイベントのバインディングを探します。 これをキー列のすべてのイベントを使い尽くすまで行います。 (このように探した最後のイベントに対するバインディングは、 キーマップであたっりそうでないかもしれない。) つまり、キー探索処理は、 キーマップから単一イベントを探索するという単純な処理として定義できます。 これがどのように行われるかは、 キーマップ内のイベントに対応付けられたオブジェクトの型に依存します。
キーマップでイベント型を探してみつかった値のことを
キーマップ項目(keymap entry)という単語で表します。
(これには、メニューキーバインディングにある
項目文字列や他の追加要素を含まない。
というのは、lookup-key
や他のキー探索関数は、
それらを戻り値として返さないからである。)
キーマップ項目として任意のLispオブジェクトをキーマップに保存できますが、
キー探索においてそのすべてが意味を持つとは限りません。
意味のある種類のキー項目をつぎに示します。
nil
nil
は、探索に使ったここまでのイベントが
未定義キーを構成することを意味する。
キーマップにイベント型が記載されてなく、かつ、
デフォルトのバインディングもない場合には、
そのイベント型に対しては、バインディングがnil
であるのと等価。
keymap
であれば、
そのリストはキーマップであり、キーマップとして扱われる(上記参照)。
lambda
であれば、
そのリストはラムダ式である。
これはコマンドとみなされ、そのように扱われる(上記参照)。
(othermap . othertype)
キー探索中に間接項目に出会うと、 othertypeのバインディングをothermapで探しそれを用いる。
この機能により、あるキーを別のキーに対する別名として定義できる。
たとえば、carがesc-map
と呼ばれるキーマップであり
cdrが32(<SPC>の文字コード)である項目は、
『Meta-<SPC>のグローバルバインディングを
それがなんであれ使う』という意味になる。
キーマップやキーボードマクロ(文字列やベクトル)は正しい関数ではないので、
関数定義としてキーマップ、文字列、ベクトルを持つシンボルは、
正しい関数ではない。
しかし、キーバインディングとしては正しい。
定義がキーボードマクロである場合には、そのシンボルは
command-execute
の引数としても正しい
(see Interactive Call)。
シンボルundefined
について特記しておく。
これは、キーを未定義として扱うことを意味する。
正確には、キーは定義されており、
そのバインディングはコマンドundefined
である。
しかし、そのコマンドは、未定義キーに対して自動的に行われることと
同じことを行う。
つまり、(ding
を呼び出して)ベルを鳴らすが、
エラーは通知しない。
undefined
は、グローバルキーバインディングを無効にして
キーをローカルに『未定義』にするためにローカルキーマップで使われる。
nil
のローカルバインディングでは、
グローバルバインディングを無効にしないため、こうはならない。
まとめると、キー項目は、キーマップ、コマンド、キーボードマクロ、
これら3つのいずれかになるシンボル、間接項目、nil
です。
2つの文字をコマンドに、1つを別のキーマップに対応付ける
疎なキーマップの例を示します。
このキーマップは、emacs-lisp-mode-map
の通常の値です。
ここで、それぞれ、9は<TAB>、
127は<DEL>、27は<ESC>、17はC-q、
24はC-xの文字コードであることに注意してください。
(keymap (9 . lisp-indent-line) (127 . backward-delete-char-untabify) (27 keymap (17 . indent-sexp) (24 . eval-defun)))