Next: , Previous: , Up: Keymaps   [Contents][Index]


21.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-text-property (point) 'local-map)
              (find-in (get-char-property (point) 'local-map))
            (find-in (current-local-map)))))
    (find-in (current-global-map)))

ここでfind-infind-in-anyはそれぞれ、1つのキーマップとキーマップのalistを検索する仮の関数です。関数set-transient-mapoverriding-terminal-local-map (Controlling Active Mapsを参照)をセットすることによって機能する点に注意してください。

上記の処理概要ではキーシーケンスがマウスイベント(Mouse Eventsを参照)で始まる場合には、ポイント位置のかわりにそのイベント位置、カレントバッファーのかわりにそのイベントのバッファーが使用されます。これは特にプロパティkeymaplocal-mapをルックアップする方法に影響を与えます。displaybefore-stringafter-stringプロパティ(Special Propertiesを参照)が埋め込まれていてkeymaplocal-mapプロパティが非nilの文字列上でマウスイベントが発生すると、それは基調となるバッファーテキストの対応するプロパティをオーバーライドします(バッファーテキストにより指定されたプロパティは無視される)。

アクティブなキーマップの1つでキーバインディングが見つかって、そのバインディングがコマンドなら検索は終了してそのコマンドが実行されます。しかしそのバインディングが値をもつ変数か文字列なら、Emacsは入力キーシーケンスをその変数の値か文字列で置き換えて、アクティブなキーマップの検索を再開します。 Key Lookupを参照してください。

最終的に見つかったコマンドもリマップされるかもしれません。Remapping Commandsを参照してください。