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
.
- Мінлива де-майорів режими можуть мати найвищий пріоритет keybinds незначних-мод,
minor-mode-overriding-map-alist
.
- Фактичні режими мінорного режиму , чиї ключі зберігаються в
minor-mode-map-alist
.
- У точці (знову) через
local-map
властивість тексту. Якщо це існує, пункт 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
.