Как найти, на какой карте привязка ключа программно в 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)))
Другие вопросы по тегам