次: , 前: Active Keymaps, 上: Keymaps


21.7 キー探索

キー探索(key lookup)とは、 与えられたキーマップからキー列のバインディングを捜し出す処理です。 バインディングを実際に実行することは、キー探索ではありません。

キー探索では、キー列の各イベントのイベント型のみを使い、 イベントの他の部分は無視します。 実際、キー探索に使われるキー列では、 マウスイベント全体(リスト)ではなく そのイベント型(シンボル)のみを指定します。 See Input Events。 そのような『キー列』は、command-executeの動作には不十分ですが、 キーの探索や再バインディングには十分です。

キー列が複数のイベントから構成される場合、 キー探索ではイベントを順番に処理します。 先頭のイベントのバインディングを探しますが、 それはキーマップであるはずです。 続いて、そのキーマップから2番目のイベントのバインディングを探します。 これをキー列のすべてのイベントを使い尽くすまで行います。 (このように探した最後のイベントに対するバインディングは、 キーマップであたっりそうでないかもしれない。) つまり、キー探索処理は、 キーマップから単一イベントを探索するという単純な処理として定義できます。 これがどのように行われるかは、 キーマップ内のイベントに対応付けられたオブジェクトの型に依存します。

キーマップでイベント型を探してみつかった値のことを キーマップ項目(keymap entry)という単語で表します。 (これには、メニューキーバインディングにある 項目文字列や他の追加要素を含まない。 というのは、lookup-keyや他のキー探索関数は、 それらを戻り値として返さないからである。) キーマップ項目として任意のLispオブジェクトをキーマップに保存できますが、 キー探索においてそのすべてが意味を持つとは限りません。 意味のある種類のキー項目をつぎに示します。

nil
nilは、探索に使ったここまでのイベントが 未定義キーを構成することを意味する。 キーマップにイベント型が記載されてなく、かつ、 デフォルトのバインディングもない場合には、 そのイベント型に対しては、バインディングがnilであるのと等価。
command
探索に使ったここまでのイベントは完全なキーを構成し、 そのバインディングはコマンドcommandである。 see What Is a Function
array
配列(文字列やベクトル)は、キーボードマクロである。 探索に使ったここまでのイベントは完全なキーを構成し、 そのバインディングは配列arrayである。 詳しくはKeyboard Macrosを参照。
keymap
探索に使ったここまでのイベントはプレフィックスキーを構成する。 キー列のつぎのイベントはこのキーマップkeymapで探す。
list
リストの意味は、リストの要素の型に依存する。
symbol
シンボルsymbolのかわりにその関数定義を使う。 それがまたシンボルであると、この処理を何回でも繰り返す。 最終的にこれは、キーマップ、コマンド、キーボードマクロの いずれかのオブジェクトになるはずである。 キーマップやコマンドであるリストは許されるが、 シンボルを介しては間接項目は使えない。

キーマップやキーボードマクロ(文字列やベクトル)は正しい関数ではないので、 関数定義としてキーマップ、文字列、ベクトルを持つシンボルは、 正しい関数ではない。 しかし、キーバインディングとしては正しい。 定義がキーボードマクロである場合には、そのシンボルは 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)))