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))
Для каждой из них есть встроенные функции, кроме первой, поэтому мы должны создать ее (также улучшенную версию кода, указанного выше).
(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
.