help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

How do i lookup a key but also respect key translations? (was: bug#66755


From: Stefan Monnier
Subject: How do i lookup a key but also respect key translations? (was: bug#66755: 30.0.50)
Date: Thu, 26 Oct 2023 10:31:07 -0400
User-agent: Gnus/5.13 (Gnus v5.13)

>> Hello. So I am trying to define a function which obtains the command
>> that would be called if 'corfu-mode' was not enabled:

Sounds like pain.  Often the better solution is to step back and think
of some other way to get that result, e.g. temporarily disabling
corfu-mode beforehand.

>> (defun +corfu--get-passthrough-command ()
>>   (keymap-lookup
>>    (thread-last
>>      (current-active-maps t)
>>      (delq corfu-map)

I think you can get a similar result with

    (let ((corfu-mode nil))
      (current-active-maps t))

>> (keymap-lookup (current-active-maps t)
>>     (key-description (vector 'backspace)))
>>
>> returns nil whereas
>>
>> (keymap-lookup (current-active-maps t) (key-description (vector ?\C-?)))

Right, because you need to obey the various key-remapping keymaps, like
`function-key-map` and friends.

It's actually a fundamentally difficult problem.  Think of the case
where the "underlying binding" you're trying to find is actually
a keymap because the user decided to use his DEL key as a prefix key?
What should you do in that case?

If you can't know beforehand that you'll want to just "passthrough"
(hence you can't disable corfu ahead of time), a second best kind of
solution is to push the events back on `unread-command-events`.

Another approach that can be used sometime is to make the binding that
you sometimes want to fallthrough be dynamically enabled/disabled with
something like:

    (define-key map [THE-KEYS]
      `(menu-item THE-COMMAND
        :filter ,(lambda (cmd) (if (THE-CONDITION) cmd))))


-- Stefan




reply via email to

[Prev in Thread] Current Thread [Next in Thread]