Emacs 25
Conforme mencionado pelo @YoungFrog nos comentários, começando com o Emacs 25.1 , o C-h k
método antigo de descrever as combinações de teclas também informará em qual mapa de teclas a chave foi encontrada.
Antes do Emacs 25
Há algum código
aqui
sobre isso, mas é incompleto, pois não cobre tudo. Abaixo está uma versão melhorada.
As chaves podem ser vinculadas de 9 (!) Maneiras. Obrigado a @Drew por este link (também complementado por isso ) com a lista completa. Por ordem de precedência, são eles:
- Um conjunto de chaves específico do terminal
overriding-terminal-local-map
. Isso é definido pela set-transient-map
função
- Um mapa de substituição local do buffer
overriding-local-map
,. Se este estiver definido, os itens 3 a 8 são ignorados (provavelmente por que você não vê muitos deles).
- No momento, através da propriedade do
keymap
texto (que pode ser feita em texto real ou em sobreposições).
- Uma variável que simula essencialmente diferentes conjuntos possíveis de modos menores habilitados
emulation-mode-map-alists
,.
- Uma variável em que os modos principais podem substituir os atalhos de teclado dos modos secundários
minor-mode-overriding-map-alist
,.
- Os modos secundários reais , cujas teclas são armazenadas
minor-mode-map-alist
.
- No ponto (novamente), através da
local-map
propriedade de texto. Se isso existir, o item 8 será ignorado.
- O mapa de teclas padrão do buffer local (para onde vão os atalhos de teclado do modo principal ou do buffer local), retornado pela função
current-local-map
.
- O mapa de teclas global , retornado por
current-global-map
.
Também há um semi-item 10. Qualquer comando encontrado através do procedimento acima também pode ter sido remapeado.
A função a seguir consulta algumas dessas possibilidades (as mais prováveis) e retorna ou imprime o resultado.
(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))
Existem funções internas para cada uma delas, exceto a primeira, portanto, devemos criar uma (também uma versão aprimorada do código vinculado acima).
(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))))))
Como você está dizendo que o comportamento está ativo quando point está em um anexo, há uma boa chance de que esse atalho de teclado ocorra em uma sobreposição ou propriedade de texto.
Se isso não funcionar , tente o seguinte comando também. Apenas coloque o cursor no anexo e faça 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
. Veja também nósFunctions for Key Lookup
eActive Keymaps
.