Reputation: 7292
key-binding
probes keys in the currently active keymaps. For those keymaps, such as minibuffer ones, or isearch-mode-map
which are restrictive and become inactive as soon as the user presses a key outside of a limited set of defined keys, I am not able to invoke key-binding
without deactivating those keymaps.
How do I:
Determine which keymaps come into effect after invoking certain commands (for example, isearch-mode-map
is set as the overriding-local-map by isearch-forward-regexp
) in a way that does not involve analyzing source code. Is there a hook that I can use to track/log the state of a variable?
Probe keys in those keymaps. For example, to what is RET
bound in isearch-mode-map
?
My closest solution has been to bind this function:
(defun probe_keybinding ()
(interactive)
(message (prin1-to-string (key-binding (read-key-sequence-vector "Enter key to probe"))))
)
to an uncommon key like 'S-f9' and invoke it when the keymaps in which I am interested are active (eg in the middle of a find-file
in the minibuffer or a eval-expression
). This does not always work, for example, isearch-forward-regexp
exits as soon as a non-recognized key is entered.
Upvotes: 3
Views: 144
Reputation: 30701
Another element of the answer is to look at individual keymaps. Unfortunately, if you just do C-h v isearch-mode-map
(or any other keymap variable) you will see a Lisp expression that is not very readable.
Instead, you can use describe-keymap
, from library help-fns+.el
. It is bound to C-h M-k
, and it shows you all of the (non-menu) keys bound in a keymap, in a human-readable way. More description here.
Upvotes: 2
Reputation: 65854
There's no easy way to determine which keymaps will come into use in response to particular commands. Any function can call (use-local-map ...)
whenever it likes, so the only way to be sure is to read the source code.
Having said that, the Emacs code does follow conventions that make it possible to find the answer in many cases. If foo-mode
has a keymap, then the keymap will usually be named foo-mode-map
. You can see a list of variables with names ending in -map
by running M-x apropos RET -map$ RET
.
You can look up a key in a keymap with the function lookup-key
. See "Functions for Key Lookup" in the Emacs Lisp manual. So to find out what RET
is bound to in isearch-mode-map
, evaluate:
(lookup-key isearch-mode-map (kbd "RET"))
===> isearch-exit
Upvotes: 4