[Top][All Lists]

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

Re: input-decode-map: Silently ignore certain sequences

From: Anders Lindgren
Subject: Re: input-decode-map: Silently ignore certain sequences
Date: Sun, 16 Dec 2018 13:20:28 +0100


I found myself in a similar situation with an experimental package I've been working on, mode-line-keyboard [1]. In this package I need to ignore event, like key down, all together. My solution is to bind functions to input-event-map that calls `read-key` recursively, as I found that returning nil breaks a key sequence. I just realised that I haven't tried [] so I might need to revisit this.

Anyway, I found the key map handing in Emacs really confusing. To help me out I put together a companion package, keymap-logger [2], that logs most things that is passed to and transformed by the various keymaps like input-key-map and key-translation-map. Maybe it can help you to gain some insight of what is going on.

    -- Anders

[1]: https://github.com/Lindydancer/mode-line-keyboard
[2]: https://github.com/Lindydancer/keymap-logger

On Thu, Dec 13, 2018 at 8:11 PM Yuri Khan <address@hidden> wrote:
Hello emacs-devel,

I am trying to implement an input-decode-map for the Kitty terminal
emulator [1], specifically, for its full keyboard mode extension [2].
This would solve one of the two major deficiences of Emacs in a
terminal emulator, namely, the inability to distinguish many
keystrokes. (The other one, lack of full color, is also solved by
Kitty, with the right terminfo modifications.)

In the full keyboard mode, the terminal passes to the application
*all* keystrokes, in a very machine-friendly format. That is, for
events other than character input (i.e. normal characters, shifted
characters, Enter, Tab, and Backspace), it sends an escape sequence
containing a key code, a modifier bit mask, and whether the key was
pressed, released, or autorepeated.

This is a bit too much for an application such as Emacs; in
particular, it is not interested in key release events, or events
regarding modifier keys.

To give an example, Kitty sends the sequence “ESC _ K p A B b ESC \”
for the event “Left Alt pressed”.

I can get Emacs to ignore this sequence by doing this:

    (define-key input-decode-map "\e_KpABb\e\\" [])

However, input decoding is accompanied by echoing the current key
sequence prefix, and when the sequence is complete, Emacs clears the
echo area. With key release events, this happens *a lot*. This is
suboptimal because sometimes Emacs asks a question in the echo area
and waits for a key.

For example, when the user presses C-x C-c, (kill-emacs) may ask
whether to save files. Then the release event for C-c comes, and the
echo area is cleared.

Is there a way to turn off echoing for prefixes of sequences matched
against input-decode-map, so that echoing still works for “manual” key
sequences but not sequences sent by the terminal?

If not, would such an option be considered useful?

[1]: https://sw.kovidgoyal.net/kitty/
[2]: https://sw.kovidgoyal.net/kitty/protocol-extensions.html#keyboard-handling

reply via email to

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