Emacs 25
@YoungFrogがコメントで述べたように、Emacs 25.1以降、C-h k
キーバインドを記述する古き良き方法は、キーが見つかったキーマップも教えてくれます。
Emacs 25より前
ここ
にはいくつかのコードがありますが
、すべてを網羅しているわけではないため不完全です。以下は改善されたバージョンです。
キーは9(!)の方法でバインドできます。以下のため@Drewのおかげ、このリンク(もで補足この完全なリストで)。優先順では、次のとおりです。
- 端末固有のキーのセット
overriding-terminal-local-map
。これはset-transient-map
関数によって定義されます。
- バッファローカルオーバーライドマップ
overriding-local-map
。これが設定されている場合、項目3〜8はスキップされます(おそらくこれらの多くが表示されない理由)。
keymap
テキストプロパティを介したポイント(実際のテキストまたはオーバーレイに表示される可能性があります)。
- 使用可能なマイナーモードのさまざまな可能なセットを本質的にシミュレートする変数
emulation-mode-map-alists
。
- メジャーモードがマイナーモードのキーバインドをオーバーライドできる変数
minor-mode-overriding-map-alist
。
- キーバインドがに保存されている実際のマイナーモード
minor-mode-map-alist
。
- (再び)ポイントで、
local-map
textプロパティを介して。これが存在する場合、項目8はスキップされます。
- 関数によって返される標準のバッファローカルキーマップ(メジャーモードまたはバッファローカルキーバインドが行く)
current-local-map
。
- グローバルキーマップで返され、
current-global-map
。
半項目10もあります。上記の手順で見つかったコマンドはすべて、再マップされている可能性があります。
次の関数は、これらの可能性のいくつか(最も可能性の高いもの)を照会し、結果を返すか出力します。
(defun locate-key-binding (key)
"Determine in which keymap KEY is defined."
(interactive "kPress key: ")
(let ((ret
(list
(key-binding-at-point key)
(minor-mode-key-binding key)
(local-key-binding key)
(global-key-binding key))))
(when (called-interactively-p 'any)
(message "At Point: %s\nMinor-mode: %s\nLocal: %s\nGlobal: %s"
(or (nth 0 ret) "")
(or (mapconcat (lambda (x) (format "%s: %s" (car x) (cdr x)))
(nth 1 ret) "\n ")
"")
(or (nth 2 ret) "")
(or (nth 3 ret) "")))
ret))
最初のものを除いて、これらのそれぞれに組み込み関数があります。そのため、1つを作成する必要があります(上記にリンクされたコードの改良版でもあります)。
(defun key-binding-at-point (key)
(mapcar (lambda (keymap) (when (keymapp keymap)
(lookup-key keymap key)))
(list
;; More likely
(get-text-property (point) 'keymap)
(mapcar (lambda (overlay)
(overlay-get overlay 'keymap))
(overlays-at (point)))
;; Less likely
(get-text-property (point) 'local-map)
(mapcar (lambda (overlay)
(overlay-get overlay 'local-map))
(overlays-at (point))))))
ポイントが添付ファイル上にあるときに動作がアクティブであると言っているので、このキーバインドがオーバーレイまたはテキストプロパティで実行される可能性が高くなります。
それでもうまくいかない場合は、次のコマンドも試してください。添付ファイルの上にカーソルを置いてくださいM-x
keymaps-at-point
。
(defun keymaps-at-point ()
"List entire keymaps present at point."
(interactive)
(let ((map-list
(list
(mapcar (lambda (overlay)
(overlay-get overlay 'keymap))
(overlays-at (point)))
(mapcar (lambda (overlay)
(overlay-get overlay 'local-map))
(overlays-at (point)))
(get-text-property (point) 'keymap)
(get-text-property (point) 'local-map))))
(apply #'message
(concat
"Overlay keymap: %s\n"
"Overlay local-map: %s\n"
"Text-property keymap: %s\n"
"Text-property local-map: %s")
map-list)))
Searching Keymaps
。ノードFunctions for Key Lookup
およびも参照してくださいActive Keymaps
。