GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Key-Lookup.html ・ emacs-doc.conao3.com

23.10 キールックアップ

キールックアップとは、指定されたキーマップからキーシーケンスのバインディングを探し出す処理のことです。バインディングの実行や使用は、キールックアップには含まれません。

キールックアップでは、キーシーケンス内の各イベントのイベントタイプのみが使用され、それ以外の部分は無視されます。実際、キールックアップに使用されるキーシーケンスでは、イベント全体(リスト)ではなく、マウスイベントをそのタイプ(シンボル)のみで指定することも可能です。入力イベントを参照してください。このようなキーシーケンスはcommand-executeを実行するには不十分ですが、キーのルックアップや再バインドには十分です。

キーシーケンスが複数のイベントで構成される場合、キールックアップ処理はイベントを順次処理します。まず最初のイベントのバインディングが検索され、それがキーマップである必要があります。次に、そのキーマップ内で2番目のイベントのバインディングが検索され、キーシーケンス内のすべてのイベントが使い果たされるまでこの処理が繰り返されます。(したがって、最後のイベントに対して見つかったバインディングは、キーマップである場合もあれば、そうでない場合もあります。)このように、キールックアップ処理は、キーマップ内で単一のイベントを検索するという、より単純な処理によって定義されています。その具体的な方法は、当該キーマップにおいてそのイベントに関連付けられているオブジェクトの型によって異なります。

キーマップでイベントタイプを参照して得られる値を、キーマップエントリと呼びましょう。(メニューアイテムのキーマップ要素に含まれるアイテム文字列やその他の追加要素は含まれません。これは、keymap-lookup やその他のキー参照関数が、戻り値にそれらを含めないためです。)任意の Lisp オブジェクトをキーマップエントリとして格納できますが、すべてがキー参照に適しているわけではありません。以下に、意味のあるキーマップエントリの型をまとめた表を示します。

nil

nil は、これまでのルックアップで使用されたイベントが未定義のキーであることを意味します。キーマップがイベントタイプについて一切言及しておらず、かつデフォルトのバインディングもない場合、それはそのイベントタイプに対する nil のバインディングと同等となります。

command

ルックアップフォームでこれまで使用されてきたイベントは完全なキーを構成しており、commandはそのバインディングです。関数とは何か?を参照してください。

array

配列(文字列またはベクトル)はキーボードマクロです。ルックアップフォームでこれまでに使用されたイベントが完全なキーを構成し、その配列がそのバインドとなります。詳細については、キーボードマクロを参照してください。

keymap

ルックアップでこれまで使用されたイベントは、プレフィックスキーを形成します。キーシーケンスの次のイベントは keymap でルックアップされます。

list

リストの意味は、そこに何が含まれているかによって異なります:

  • list の CAR がシンボル keymap である場合、そのリストはキーマップであり、キーマップとして扱われます(上記参照)。
  • list の CAR が lambda である場合、そのリストはラムダ式となります。これは関数であるとみなされ、そのように扱われます(上記参照)。キーバインドとして正しく実行されるためには、この関数はコマンドである必要があり、つまり interactive の指定がなければなりません。コマンドの定義 を参照してください。
symbol

symbol の代わりに symbol の関数定義が用いられます。それもまたシンボルである場合、この処理が何度でも繰り返されます。最終的に、キーマップ、コマンド、またはキーボードマクロとなるオブジェクトが得られるはずです。

なお、キーマップやキーボードマクロ(文字列およびベクトル)は有効な関数ではないため、キーマップ、文字列、またはベクトルを関数定義とするシンボルは、関数としては無効です。ただし、キーバインドとしては有効です。定義がキーボードマクロである場合、そのシンボルは command-execute の引数としても有効です(インタラクティブ呼び出しを参照)。

記号 undefined は特に注目に値します。これは、そのキーを未定義として扱うことを意味します。厳密に言えば、キーは定義されており、そのバインドはコマンド undefined です。しかし、そのコマンドは、未定義のキーに対して自動的に行われるのと同様の動作、すなわち(ding を呼び出すことで)ベルを鳴らしますが、エラーを通知することはありません。

undefined はローカルキーマップにおいて、グローバルキーバインドを上書きし、そのキーをローカルで未定義にするために使用されます。nil をローカルでバインドしても、グローバルバインドを上書きしないため、この目的は果たせません。

anything else

それ以外の種類のオブジェクトが見つかった場合、ルックアップでこれまで使用されたイベントが完全なキーを構成し、そのオブジェクトがそのバインディングとなるが、そのバインディングはコマンドとして実行可能ではない。

要するに、キーマップエントリは、キーマップ、コマンド、キーボードマクロ、それらのいずれかを指すシンボル、または nil のいずれかとなります。