Subject: bug#78834: Feature request: make keymapp dereference symbol value slot

From: arthur miller <[email-masked]>
Date: Wed, 18 Jun 2025 22:33:24 +0000

Currently keymapp returns nil, when passed a symbol if a keymap
object is only in a symbol's value slot, but not fbound:

(keymapp emacs-lisp-mode-map) => t
(keymapp 'emacs-lisp-mode-map) => nil

(boundp 'emacs-lisp-mode-map) => t
(fboundp 'emacs-lisp-mode-map) => nil

Keymapp uses internally get_keymap to check if an object is a keymap,
and get_keymap does not check value slot of symbols. However, the
comment above says:

"Check that OBJECT is a keymap (after dereferencing through any
   symbols).  If it is, return it."

Now, I don't know why is it the case, why the value slot is not
derefenced. I guess it is by design; after all this time this function
is in existence, that must be known. I don't understand the reason
though, by just looking at it at the moment, so I do wonder why is it
so?

Anyway, that leaves me in a bit awkward situation where I can ask a
question: (keymapp some-symbol) and get two different answers:

(keymapp 'emacs-lisp-mode-map) => nil
(keymapp 'vc-mode-map) => t

because one is fbound and the other is not. The background for this is
that I want to collect all loaded keymaps in the system:

(defun collect-keymaps ()
  (cl-loop for k being the symbol when (keymapp k) collect k))

But I don't get them all, since keymapp won't recognize those that are
not fbound. That makes the whole thing quite less effective, since I
have to additionally check if a symbol is bound and if its symbol value
is a keymap.

As a suggestion, the attached patch dereferences symbol value slots as
well. If it is not a wrong thing to do for some reason I am not aware
of, I would like to suggest it as a "fix" or a "feature request",
whichever is best describing the issue.