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

23.17 スキャンキーマップ

本節では、ヘルプ情報を出力するために現在のすべてのキーマップを走査する関数について説明します。特定のキーマップ内のバインディングを表示するには、describe-keymapコマンドを使用できます(The GNU Emacs Manualのその他のヘルプコマンドを参照してください)。

関数: accessible-keymaps keymap &optional prefix

この関数は、keymapから(0個以上のプレフィックスキーを介して)到達可能なすべてのキーマップのリストを返します。戻り値は連想リストであり、要素は(key . map)という形式をしています。ここでkeyはプレフィックスキーであり、keymapにおけるその定義はmapとなります。

alistの要素は、keyの長さが増加するように順序付けられています。最初の要素は常に([] . keymap)となります。これは、指定されたキーマップが、イベントを伴わないプレフィックスを用いて自身からアクセス可能であるためです。

prefix が指定されている場合、それはプレフィックスキーシーケンスである必要があります。その場合、accessible-keymaps にはプレフィックスが prefix で始まるサブマップのみが含まれます。これらの要素は (accessible-keymaps) の値と同様に見え、唯一の違いは、一部の要素が省略されている点です。

以下の例では、返されたalistは、‘^[’と表示されるキーESCが、定義がスパースキーマップ(keymap (83 . center-paragraph) (115 . foo))であるプレフィックスキーであることを示しています。

(accessible-keymaps (current-local-map))
⇒(([] keymap
      (27 keymap   ; Note this keymap for ESC is repeated below.
          (83 . center-paragraph)
          (115 . center-line))
      (9 . tab-to-tab-stop))

   ("^[" keymap
    (83 . center-paragraph)
    (115 . foo)))

以下の例では、C-h は (keymap (118 . describe-variable)…) から始まるスパースキーマップを使用するプレフィックスキーです。別のプレフィックスである C-x 4 は、変数 ctl-x-4-map の値でもあるキーマップを使用します。イベント mode-line は、ウィンドウの特殊な領域におけるマウス操作のプレフィックスとして使用される、複数のダミーイベントのひとつです。

(accessible-keymaps (current-global-map))
⇒ (([] keymap [set-mark-command beginning-of-line ...
                   delete-backward-char])
    ("^H" keymap (118 . describe-variable) ...
     (8 . help-for-help))
    ("^X" keymap [x-flush-mouse-queue ...
     backward-kill-sentence])
    ("^[" keymap [mark-sexp backward-sexp ...
     backward-kill-word])
    ("^X4" keymap (15 . display-buffer) ...)
    ([mode-line] keymap
     (S-mouse-2 . mouse-split-window-horizontally) ...))

これらは、実際に目にするキーマップのすべてではありません。

関数: map-keymap function keymap

関数 map-keymap は、keymap 内の各バインディングに対して function を1回呼び出します。このとき、そのイベントタイプとバインディングの値という2つの引数を渡します。keymap に親がある場合は、その親のバインディングも含まれます。これは再帰的に動作します。つまり、親にさらに親がある場合は、その祖父母のバインディングも含まれる、といった具合です。

この関数は、キーマップ内のすべてのバインディングを確認する最も簡潔な方法です。

関数: where-is-internal command &optional keymap firstonly noindirect no-remap

この関数は、where-isコマンド(The GNU Emacs Manualのヘルプを参照)で使用されるサブルーチンです。キーマップの集合においてcommandにバインドされているすべてのキーシーケンス(長さを問わず)のリストを返します。

引数 command には任意のオブジェクトを指定でき、eq を用いてすべてのキーマップエントリと比較されます。

keymap が nil の場合、使用されるマップは overriding-local-map を無視した現在のアクティブなキーマップとなります(つまり、その値は nil であるものとして扱われます)。keymap がキーマップの場合、検索対象となるマップは keymap とグローバルキーマップです。keymap がキーマップのリストである場合、それらのキーマップのみが検索対象となります。

通常、keymap の式には overriding-local-map を使用するのが最適です。これにより、where-is-internal はアクティブなキーマップのみを正確に検索します。グローバルマップのみを検索する場合は、keymap に値 (keymap)(空のキーマップ)を指定してください。

firstonly が non-ascii の場合、値は考えられるすべてのキーシーケンスのリストではなく、最初に見つかったキーシーケンスを表す単一のベクトルとなります。firstonly が t の場合、値は最初のキーシーケンスとなります。ただし、すべて ASCII 文字(または ASCII 文字のメタバリアント)で構成されるキーシーケンスは、他のすべてのキーシーケンスよりも優先され、また戻り値がメニューバインディングになることは決してありません。

noindirect が nil でない場合、where-is-internal はメニュー項目の内部を調べてコマンドを探すことはありません。これにより、メニュー項目自体を検索することが可能になります。

5番目の引数 no-remap は、この関数がコマンドのリマッピングをどのように扱うかを決定します(コマンドのリマッピングを参照)。注目すべきケースは2つあります:

コマンド other-command が command に再マッピングされた場合:

no-remap が nil である場合、other-command のバインディングを特定し、それらを command のバインディングでもあるものとして扱う。no-remap が nil 以外である場合、それらのバインディングを特定する代わりに、ベクトル [remap other-command] を可能なキーシーケンスのリストに含める。

command が other-command に再マッピングされた場合:

no-remap が nil の場合、command ではなく other-command のバインディングを返す。no-remap が nil 以外の場合、リマップされている点は無視して、command のバインディングを返す。

コマンドが [some-event] のようなキーバインドにマッピングされており、かつ some-event が nil 以外の non-key-event プロパティを含むシンボルプリリストを持っている場合、そのバインドは where-is-internal によって無視されます。

コマンド: describe-bindings &optional prefix buffer-or-name

この関数は、現在有効なすべてのキーバインドの一覧を作成し、*Help* という名前のバッファに表示します。テキストはモードごとにグループ化されており、まずマイナーモード、次にメジャーモード、そしてグローバルバインドの順で表示されます。

prefix が nil でない場合、それはプレフィックスキーである必要があり、その場合、一覧には prefix で始まるキーのみが含まれます。

連続するASCIIコードを持つ複数の文字が同じ定義を持つ場合、それらは‘firstchar..lastchar’のようにまとめて表示されます。この場合、どの文字を指しているのかを理解するには、ASCIIコードを知っておく必要があります。例えば、デフォルトのグローバルマップでは、文字‘SPC .. ~’は1行で記述されています。SPCはASCII 32、~はASCII 126であり、その間の文字にはすべての通常の印字文字(例:英字、数字、句読点など)が含まれます。これらの文字はすべてself-insert-commandに紐付けられています。

buffer-or-name が nil 以外の場合、それはバッファまたはバッファ名である必要があります。その場合、describe-bindings は現在のバッファではなく、そのバッファのバインディングを一覧表示します。