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

23.8 アクティブなキーマップの検索

Emacsがアクティブなキーマップをどのように検索するかについて、擬似Lispによるまとめを以下に示します。

(or (if overriding-terminal-local-map
        (find-in overriding-terminal-local-map))
    (if overriding-local-map
        (find-in overriding-local-map)
      (or (find-in (get-char-property (point) 'keymap))
          (find-in-any emulation-mode-map-alists)
          (find-in-any minor-mode-overriding-map-alist)
          (find-in-any minor-mode-map-alist)
          (if (get-char-property (point) 'local-map)
              (find-in (get-char-property (point) 'local-map))
            (find-in (current-local-map)))))
    (find-in (current-global-map)))

ここで、find-in と find-in-any は、それぞれ1つのキーマップとキーマップのalistを検索する擬似関数です。なお、set-transient-map 関数は overriding-terminal-local-map を設定することで動作します(アクティブなキーマップの制御を参照)。

上記の擬似コードにおいて、キーシーケンスがマウスイベント(マウスイベントを参照)で始まる場合、point の代わりにそのイベントの位置が使用され、現在のバッファの代わりにそのイベントのバッファが使用されます。特に、これは keymap および local-map プロパティの参照方法に影響します。display、before-string、または after-string プロパティが埋め込まれた文字列(特殊な意味を持つプロパティを参照)でマウスイベントが発生し、かつその文字列に nil、keymap、または local-map 以外のプロパティがある場合、それが基底となるバッファテキスト内の対応するプロパティを上書きします(つまり、基底テキストで指定されたプロパティは無視されます)。

アクティブなキーマップのいずれかにキーバインドが見つかり、そのバインドがコマンドである場合、検索は終了し、コマンドが実行されます。ただし、バインドが値を持つシンボルや文字列である場合、Emacsは入力されたキーシーケンスをその変数の値や文字列に置き換え、アクティブなキーマップの検索を再度開始します。キールックアップを参照してください。

最終的に見つかったコマンドも、再マッピングされる場合があります。コマンドの再マッピングを参照してください。