Subject: Re: bug#43617: 27.1; Define-minor-mode keybindings not get precedence over global keymap

From: Lars Ingebrigtsen <[email-masked]>
Date: Sat, 26 Sep 2020 16:04:56 +0200

[email-masked] writes:

> Start emacs with the -Q flag, use the following code to create
> keybindings with define-minor-mode:
>
> (define-minor-mode pdf-continuous-scroll-mode
>   "Emulate continuous scroll with two synchronized buffers"
>   nil
>   " Continuous"
>   '(((kbd "j") . (lambda () (interactive) (print "pushed j")))
>     ((kbd "C-n") . (lambda () (interactive)(print "pushed C-n"))))
>   (print "toggled minor mode"))
>
> Now activate the just defined pdf-continuous-scroll-mode.
> The "C-n" keybinding does not work correctly while the "j"
> keybinding does (i.e. prints "pushed j").

Hm.  It seems like there's a difference between \C-n and (kbd "C-n")
here for some reason.  With this definition:

(define-minor-mode pdf-continuous-scroll-mode-3
  "Emulate continuous scroll with two synchronized buffers"
  nil
  " Continuous"
  '(((kbd "j") . (lambda () (interactive) (print "pushed j")))
    ("\C-n" . (lambda () (interactive)(print "pushed C-n"))))
  (print "toggled minor mode"))

we get the keymap:

(keymap
 (14 lambda nil
     (interactive)
     (print "pushed C-n"))
 (106 lambda nil
      (interactive)
      (print "pushed j")))

With `kbd', we get the following keymap, which surely has to be wrong:

(keymap
 (67 keymap
     (45 keymap
	 (110 lambda nil
	      (interactive)
	      (print "pushed C-n"))))
 (106 lambda nil
      (interactive)
      (print "pushed j")))

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no