Next: Functions for Key Lookup, Previous: Controlling Active Maps, Up: Keymaps [Contents][Index]
キールックアップ(key lookup: キー照合)とは、与えられたキーマップからキーシーケンスのバインディングを見つけ出すことです。そのバインディングの使用や実行は、キールックアップの一部ではありません。
キールックアップは、キーシーケンス内の各イベントのイベント型だけを使用し、そのイベントの残りは無視します。実際のところ、キールックアップに使用されるキーシーケンスは、マウスイベントをイベント全体(リスト)のかわりにイベント型のみ(シンボル)を用いるでしょう。Input Eventsを参照してください。そのような“キーシーケンス”は、command-execute
による実行には不十分ですが、キーのルックアップやリバインドには十分です。
キーシーケンスが複数イベントから構成されるとき、キールックアップはイベントを順に処理します。最初のイベントのバインディングが見つかったとき、それはキーマップでなければなりません。そのキーマップ内で2つ目のイベントを見つけ出し、そのキーシーケンス内のすべてのイベントが消費されるまで、このプロセスを続けます(故に、最後のイベントにたいして見つかったイベントはキーマップかどうかわからない)。したがって、キールックアッププロセスは、キーマップ内で単一イベントを見つけ出す、よりシンプルなプロセスで定義されます。これが行なわれる方法は、キーマップ内でそのイベントに関連するオブジェクトの型に依存します。
キーマップ内のイベント型ルックアップによる値発見を説明するために、キーマップエントリー(keymap
entry)という用語を導入しましょう。(これにはメニューアイテムにたいするキーマップ内のアイテム文字列や、他の余計な要素は含まれません。なぜなら、lookup-key
や他のキーマップルックアップ関数が、リターン値にそれらを含まないからです。)
任意のLispオブジェクトがキーマップエントリーとしてキーマップに格納されるかもしれませんが、すべてがキールックアップに意味をもつわけではありません。以下のテーブルは、キーマップエントリーで重要な型です:
nil
nil
は、それまでにルックアップに使用されたイベントが、未定義キーを形成することを意味する。最終的にキーマップがイベント型を調べるのに失敗して、デフォルトバインディングも存在しないときは、そのイベント型のバインディングがnil
であるのと同じである。
それまでにルックアップに使用されたイベントがコンプリートキーを形成し、そのバインディングはcommandである。What Is a Functionを参照のこと。
array(文字列かベクター)は、キーボードマクロである。それまでにルックアップに使用されたイベントはコンプリートキーを形成し、そのバインディングはarrayである。詳細はKeyboard Macrosを参照のこと。
それまでにルックアップに使用されたイベントはプレフィクスキーを形成する。そのキーシーケンスの次のイベントは、keymap内でルックアップされる。
listの意味は、そのリストが何を含んでいるかに依存する:
keymap
の場合、そのリストはキーマップであり、キーマップとして扱われる(上記参照)。
lambda
の場合、そのリストはラムダ式である。これは関数とみなされ、そのように扱われる(上記参照)。キーバインディングとして正しく実行されるために、この関数はコマンドでなければならず、interactive
指定をもたなければならない。Defining Commandsを参照のこと。
(othermap . othertype)
キールックアップはインダイレクトエントリーに遭遇したときは、かわりにothermap内でothertypeのバインディングをルックアップして、それを使用する。
この機能により、あるキーを他のキーにたいするalistとして定義することが可能になる。たとえば、CARがesc-map
と呼ばれるキーマップで、CDRが32(SPCのコード)の場合は、“それが何であろうとMeta-SPCのグローバルバインディングを使用する”ことを意味する。
symbolの関数定義がsymbolのかわりに使用される。もし関数定義もシンボルの場合は、任意の回数このプロセスが繰り返される。これは最終的にキーマップであるようなオブジェクト、コマンド、またはキーボードマクロに行き着くはずである。それがキーマップかコマンドの場合はリストも許されるが、シンボルを通じて見つけ出された場合、インダイレクトエントリーは理解されない。
キーマップおよびキーボードマクロ(文字列かベクター)は有効な関数ではないので、関数定義にキーマップ、文字列、ベクターをもつシンボルは、関数としては無効であることに注意されたい。しかし、キーバインディングとしては有効である。その定義がキーボードマクロの場合、そのシンボルはcommand-execute
(Interactive Callを参照)の引数としても有効である。
シンボルundefined
は特記するに値する。これはそのキーを未定義として扱うことを意味する。厳密に言うと、そのキーは定義されているが、そのバインディングがコマンドundefined
なのである。しかし、このコマンドは未定義キーにたいして自動的に行われるのと同じことを行う。これは(ding
を呼び出して)bellを鳴らすが、エラーはシグナルしない。
undefined
は、グローバルキーバインディングをオーバーライドして、そのキーをローカルに“未定義”にするために使用される。nil
にローカルにバインドしても、グローバルバインディングをオーバーライドしないであろうから、これを行うのに失敗するだろう。
オブジェクトの他の型が見つかった場合、それまでにルックアップで使用されたイベントはコンプリートキーを形成し、そのオブジェクトがバインディングになるが、そのバインディングはコマンドとして実行不可能である。
要約すると、キーマップエントリーはキーマップ、コマンド、キーボードマクロ、あるいはそれらに導出されるシンボル、インダイレクトエントリー、あるいはnil
のいずれかです。