emacs-devel
[Top][All Lists]
Advanced

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

Re: Buffer-local key-translation-map


From: Eli Zaretskii
Subject: Re: Buffer-local key-translation-map
Date: Sat, 23 Dec 2023 10:50:42 +0200

Stefan, any comments?

> From: Spencer Baugh <sbaugh@janestreet.com>
> Date: Thu, 14 Dec 2023 18:30:28 -0500
> 
> 
> Is it OK to have key-translation-map be a buffer-local variable?
> 
> If there's a key translation in function-key-map which I wish to change
> on a per-buffer basis, is it correct to delete that key translation from
> function-key-map and add it back in a buffer-local key-translation-map?
> 
> More context:
> 
> In graphical frames, Emacs maps <escape> to ESC with function-key-map.
> evil-mode users would usually prefer for this to not happen; they never
> want to hit <escape> and have it be potentially interpreted as the start
> of a key sequence.  (For example, if an evil-mode user types C-x
> <escape>, they would prefer that the key sequence be aborted, not that
> it be interpreted as potentially the start of C-x M-: or other such
> bindings)
> 
> The most obvious way to do this is simply:
> 
> (define-key function-key-map (kbd "<escape>") nil)
> 
> However, this affects all buffers identically.  A user might want to
> have some buffers in evil-mode (really evil-local-mode) and some not;
> or, more likely, a user might want to make use of "Emacs state", which
> allows disabling all evil-mode keybindings in a per-buffer way.  For
> such buffers, <escape> should still map to ESC.
> 
> So then, the next obvious thought is to run:
> 
> (setq-local function-key-map
>  (define-keymap :parent function-key-map
>   "<escape>" nil))
> 
> in any buffer which wants to use evil-mode keybindings, and therefore
> disable mapping <escape> to ESC.
> 
> However, function-key-map and local-function-key-map cannot be
> buffer-local variables.
> 
> But luckily key-translation-map can!  So then we could just move the
> translation of <escape> to ESC to be in key-translation-map, where it
> can be overridden buffer-locally.  Which looks like:
> 
> (define-key function-key-map (kbd "<escape>") nil)
> (define-key key-translation-map (kbd "<escape>") (kbd "ESC"))
> ;; in evil-mode buffers
> (setq-local key-translation-map
>  (define-keymap :parent key-translation-map
>   "<escape>" nil))
> 
> This seems to work fine.  But is this supported?  Is there a better way
> to do this?
> 
> 
> 



reply via email to

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