Как найти, на какой карте привязка ключа программно в Emacs
Например, с помощью Ch k я могу спросить Emacs "что делает C-right в этом буфере?". Если в моей настройке текущий буфер был буфером Lisp, Emacs ответил бы на paredit-forward-slurp-sexp. Исходя из этого, я могу предположить, что привязка C-right к paredit-forward-slurp-sexp происходит из карты режимов paredit, потому что перед именем команды стоит paredit, но это эвристика. Как я могу сделать это программно, то есть, как я могу спросить "откуда берется привязка C-права в этом буфере?"
Пишет функцию, которая в этом случае проверяет текущую глобальную карту, текущую карту основных режимов, карту-режим paredit-forward-forward-mode-map, карту-paredit-forward-slurp-mode, карту-paredit-forward-slurp-sexp- режим-карта единственный выход?
1 ответ
Вот код, который вы можете адаптировать к вашим потребностям:
(defun bunch-of-keybindings (key)
(list
(minor-mode-key-binding key)
(local-key-binding key)
(global-key-binding key)))
Пример ввода:
(bunch-of-keybindings (kbd "C-c @ C-c"))
Выход:
(((hs-minor-mode . hs-toggle-hiding)) 1 2)
Числа означают, что на локальной и глобальной карте ничего не найдено.
UPD: добавлено overlay-key-binding
Таблицы клавиш также могут быть прикреплены к оверлеям, и в этом случае они имеют приоритет, когда курсор находится внутри оверлея. Например, yasnippet
Является ли это. Вот функция, чтобы проверить это:
(defun overlay-key-binding (key)
(mapcar (lambda (keymap) (lookup-key keymap key))
(cl-remove-if-not
#'keymapp
(mapcar (lambda (overlay)
(overlay-get overlay 'keymap))
(overlays-at (point))))))
Итак, обновленный список:
(defun bunch-of-keybindings (key)
(list
(minor-mode-key-binding key)
(local-key-binding key)
(global-key-binding key)
(overlay-key-binding key)))