bug#81462: [PATCH] Skip non-key events in `where-is-internal' with FIRSTONLY

Eli Zaretskii <[email protected]>
Newsgroups gmane.emacs.bugs
Message-ID <[email protected]>
Ping!  How can we make some further progress with this issue?

> Cc: [email protected], [email protected]
> Date: Mon, 27 Jul 2026 23:07:25 -0400
> From: Stefan Monnier via "Bug reports for GNU Emacs,
>  the Swiss army knife of text editors" <[email protected]>
> 
> >> Could you clarify why you think this is a bug?
> >> The doc says:
> >>
> >>     If FIRSTONLY is the symbol ‘non-ascii’, return the first binding
> >>     found, no matter what it is.
> >
> > At the end of the docstring for `where-is-internal', it says:
> >
> >     Keys that are represented as events that have a ‘non-key-event’ non-nil
> >     symbol property are ignored.
> 
> I see.  [ I don't think that addition was justified.  ]
> 
> > I figured that the intent was that such events in keymaps are not
> > really keys, cannot be invoked by users, and therefore should not be
> > listed by, e.g., where-is, describe-function, or
> > substitute-command-keys.  FWIW, shadowed key bindings are also skipped
> > even when FIRSTONLY is `non-ascii', so this seemed like an analogous
> > situation to me.
> 
> I'd argue they *can* be invoked by users, by causing the
> corresponding event.  I think it's not that different from the "events"
> used for menu entries.  Or the pseudo-events used for clicks on GUI
> elements like `mode-line`, `left-fringe`, ...
> 
> I think it's better to "demote" them (i.e. list them further down the
> list) rather than completely skip them.
> 
> >> BTW, I see that in bug#55940, Lars introduced the property `non-key-event`,
> >> but I'm not sure it's been fully thought through.  It seems wrong not to
> >> list them at all in `where-is-internal`.  I suspect it should be
> >> integrated into `preferred_sequence_p` instead.
> > The reason I was looking into this code at all was because I wanted to
> > tweak the behavior of where-is at my site.  Apologies in advance for
> > the verboseness below.
> 
> No apology needed, such background info is very welcome.
> 
> > Many of my site's users enable evil-mode, which happens to use some
> > non-key events for implementation reasons---see function
> > `evil-get-auxiliary-keymap'---and marking these synthetic events with
> > the `non-key-event' property might be a reasonable way to prevent
> > `substitute-command-keys' from returning them (albeit with some
> > additional patching here).
> >
> > As an example, from emacs -Q -L ~/src/evil-mode:
> >
> >   (evil-mode)
> >   (defun my-custom-command () (interactive))
> >   (keymap-global-set "C-x x z" #'my-custom-command) ;global key
> > binding for non-evil-mode users
> >   (evil-define-key 'normal lisp-interaction-mode-map
> >     (kbd "<f4>") #'my-custom-command)
> >   (evil-define-key 'insert lisp-interaction-mode-map
> >     (kbd "<f5>") #'my-custom-command)
> >
> > Now, invoking where-is or describe-function on my-custom-command
> > (assume you are in evil-normal-state) will tell you that the command
> > is bound to:
> >
> > my-custom-command is on <f4>, <normal-state> <f4>, <insert-state> <f5>, C-x x z
> >
> > Whereas the only key sequences you can actually type are <f4> and C-x
> > x z.  I would like to give the `normal-state' and `insert-state'
> > symbols a `non-key-event' property to prevent them from showing up in
> > this output at all.
> 
> Interesting.  This ties in with the recent discussion on emacs-devel
> about the "slow erosion of help's utility" for things like
> "metafunctions" (think `indent-for-tab-command`) and packages
> like Transient.
> 
> I'm thinking of adding what I think we should call "partial bindings"
> such that when a key lookup finds such a partial-binding it doesn't stop
> but keeps looking further and returns a "composite command" made up of
> all the partial bindings found (plus potentially a final non-partial
> binding), and partial bindings would have enough extra info to describe
> themselves (e.g. describe when they're active and when not).
> So `describe-function` could end up saying something like
> 
>     my-custom-command is on C-x x z, <f4> (in normal state), <f5>
>     (in insert state)
> 
> 
> === Stefan
> 
> 
> 
> 
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.