justbur / emacs-which-key

Emacs package that displays available keybindings in popup
GNU General Public License v3.0
1.73k stars 87 forks source link

Question about `which-key-undo` #354

Open A7R7 opened 1 year ago

A7R7 commented 1 year ago

TL;DR: How to bind which-key-undo to DEL after every prefix?

I'm an emacs noob comming from Neovim recently. Neovim also has a which-key plugin which by default uses DEL to undo keystrokes. I want to bring that feature to my emacs config.

From the readme we know that there's a which-key-undo command that can achieve this. Also, we can press C-h u in the which-key-mode-map to undo keystrokes. However, C-h u is not as fast as a simple DEL. Sometimes you just typed some wrong keystrokes and want to clear them quickly. Pressing other keys such as ESC that eventually leads to xxx is undefined is also an option, but that make me feel 'dangerous'.

So generally I'd like to bind which-key-undo to DEL. But that raises another question: I need to bind DEL after every prefix in emacs for it to work. It can be done manually, but that's troublesome. I wonder if there is a better practice to achieve this?

Your advice is highly appreciated!

justbur commented 1 year ago

Hm, I'm not familiar with how which-key works in neovim.

In this package, which-key was designed to be passive and not intercept all key presses, which is why a certain key like C-h is used to "escape" the normal key reading routine. You could try (current-active-maps) and recurse down through them defining DEL to be which-key-undo for every possible prefix. That only takes care of maps that are active though.

Another possibility, and maybe better, would be to define a list of prefixes and bind which-key-undo to DEL at each prefix in override-global-map. Something like

(setq my-prefixes '("C-x"))
(mapcar
 (lambda (x)
   (define-key override-global-map (kbd (concat x " DEL")) #'which-key-undo))
 my-prefixes)