* bug#56873: Make `defvar-keymap' warn on conflicting and redundant bindings @ 2022-08-01 16:47 Stefan Kangas 2022-08-02 8:25 ` Robert Pluim 0 siblings, 1 reply; 9+ messages in thread From: Stefan Kangas @ 2022-08-01 16:47 UTC (permalink / raw) To: 56873 Severity: wishlist It would be useful if `defvar-keymap' could warn on conflicting bindings, such as in: (defvar-keymap foo "a" #'next-line "a" #'previous-line) It would also be useful to warn about redundant bindings, such as in: (defvar-keymap foo "a" #'next-line "a" #'next-line) ^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#56873: Make `defvar-keymap' warn on conflicting and redundant bindings 2022-08-01 16:47 bug#56873: Make `defvar-keymap' warn on conflicting and redundant bindings Stefan Kangas @ 2022-08-02 8:25 ` Robert Pluim 2022-08-02 9:48 ` Lars Ingebrigtsen 2022-08-02 10:09 ` Stefan Kangas 0 siblings, 2 replies; 9+ messages in thread From: Robert Pluim @ 2022-08-02 8:25 UTC (permalink / raw) To: Stefan Kangas; +Cc: 56873 >>>>> On Mon, 1 Aug 2022 16:47:10 +0000, Stefan Kangas <stefan@marxist.se> said: Stefan> Severity: wishlist Stefan> It would be useful if `defvar-keymap' could warn on conflicting Stefan> bindings, such as in: Stefan> (defvar-keymap foo Stefan> "a" #'next-line Stefan> "a" #'previous-line) Is that a common occurence? Stefan> It would also be useful to warn about redundant bindings, such as in: Stefan> (defvar-keymap foo Stefan> "a" #'next-line Stefan> "a" #'next-line) Thatʼs just a special case of conflicting bindings. This will do it, but I wonder if `warn' is overkill. I put it in `define-keymap', but it could equally well go in `defvar-keymap'. diff --git a/lisp/keymap.el b/lisp/keymap.el index 376a30f106..b44a961d73 100644 --- a/lisp/keymap.el +++ b/lisp/keymap.el @@ -530,7 +530,8 @@ define-keymap (keymap keymap) (prefix (define-prefix-command prefix nil name)) (full (make-keymap name)) - (t (make-sparse-keymap name))))) + (t (make-sparse-keymap name)))) + seen-keys) (when suppress (suppress-keymap keymap (eq suppress 'nodigits))) (when parent @@ -544,6 +545,9 @@ define-keymap (let ((def (pop definitions))) (if (eq key :menu) (easy-menu-define nil keymap "" def) + (if (member key seen-keys) + (warn "Duplicate definition for key: %S" key) + (push key seen-keys)) (keymap-set keymap key def))))) keymap))) Robert -- ^ permalink raw reply related [flat|nested] 9+ messages in thread
* bug#56873: Make `defvar-keymap' warn on conflicting and redundant bindings 2022-08-02 8:25 ` Robert Pluim @ 2022-08-02 9:48 ` Lars Ingebrigtsen 2022-08-02 15:46 ` Drew Adams 2022-08-02 10:09 ` Stefan Kangas 1 sibling, 1 reply; 9+ messages in thread From: Lars Ingebrigtsen @ 2022-08-02 9:48 UTC (permalink / raw) To: Robert Pluim; +Cc: Stefan Kangas, 56873 Robert Pluim <rpluim@gmail.com> writes: > Thatʼs just a special case of conflicting bindings. This will do it, > but I wonder if `warn' is overkill. I think it should signal an error. ^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#56873: Make `defvar-keymap' warn on conflicting and redundant bindings 2022-08-02 9:48 ` Lars Ingebrigtsen @ 2022-08-02 15:46 ` Drew Adams 0 siblings, 0 replies; 9+ messages in thread From: Drew Adams @ 2022-08-02 15:46 UTC (permalink / raw) To: Lars Ingebrigtsen, Robert Pluim; +Cc: Stefan Kangas, 56873@debbugs.gnu.org > > but I wonder if `warn' is overkill. > I think it should signal an error. Why? I don't understand what the "error" is. A warning is one thing - lets you know about a possible typo or logic mistake. But an error? Will you raise an error for these also? Why not? (setq a nil a t) (setq a 42 a 42) What about generated code? Is there something _necessarily wrong_ with the code you want to raise an error for? Where's the error beef? ^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#56873: Make `defvar-keymap' warn on conflicting and redundant bindings 2022-08-02 8:25 ` Robert Pluim 2022-08-02 9:48 ` Lars Ingebrigtsen @ 2022-08-02 10:09 ` Stefan Kangas 2022-08-02 11:53 ` Robert Pluim 1 sibling, 1 reply; 9+ messages in thread From: Stefan Kangas @ 2022-08-02 10:09 UTC (permalink / raw) To: Robert Pluim; +Cc: 56873 Robert Pluim <rpluim@gmail.com> writes: > Stefan> (defvar-keymap foo > Stefan> "a" #'next-line > Stefan> "a" #'previous-line) > > Is that a common occurence? I don't know. I've only seen such a mistake once, but flagging it might help us find more. Your patch looks fine to me, but I agree with Lars that it should be an error instead of a warning. (And putting it in `define-keymap' is indeed better.) ^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#56873: Make `defvar-keymap' warn on conflicting and redundant bindings 2022-08-02 10:09 ` Stefan Kangas @ 2022-08-02 11:53 ` Robert Pluim 2022-08-02 12:01 ` Lars Ingebrigtsen 2022-08-02 12:17 ` Stefan Kangas 0 siblings, 2 replies; 9+ messages in thread From: Robert Pluim @ 2022-08-02 11:53 UTC (permalink / raw) To: Stefan Kangas; +Cc: Lars Ingebrigtsen, 56873 [-- Attachment #1: Type: text/plain, Size: 960 bytes --] >>>>> On Tue, 2 Aug 2022 10:09:43 +0000, Stefan Kangas <stefan@marxist.se> said: Stefan> Robert Pluim <rpluim@gmail.com> writes: Stefan> (defvar-keymap foo Stefan> "a" #'next-line Stefan> "a" #'previous-line) >> >> Is that a common occurence? Stefan> I don't know. I've only seen such a mistake once, but flagging it might Stefan> help us find more. There are in fact 4 instances in Emacsʼ sources. Stefan> Your patch looks fine to me, but I agree with Lars that it should be an Stefan> error instead of a warning. (And putting it in `define-keymap' is Stefan> indeed better.) I put it in both, and it turns out we have errors in both, which I propose to fix like this (this preserves current behaviour, due to the 'last definition wins' nature of define-keymap). I decided that for coherence, the gnus-summary-up-thread binding should go as well (itʼs available on "T-u" anyway). [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: duplicate-definitions.patch --] [-- Type: text/x-diff, Size: 1658 bytes --] diff --git c/lisp/gnus/gnus-srvr.el i/lisp/gnus/gnus-srvr.el index a520bfcd8b..54be0f8e6a 100644 --- c/lisp/gnus/gnus-srvr.el +++ i/lisp/gnus/gnus-srvr.el @@ -699,7 +699,6 @@ gnus-browse-mode-map "n" #'gnus-browse-next-group "p" #'gnus-browse-prev-group "DEL" #'gnus-browse-prev-group - "<delete>" #'gnus-browse-prev-group "N" #'gnus-browse-next-group "P" #'gnus-browse-prev-group "M-n" #'gnus-browse-next-group diff --git c/lisp/gnus/gnus-sum.el i/lisp/gnus/gnus-sum.el index bf2a083fec..90b57695c5 100644 --- c/lisp/gnus/gnus-sum.el +++ i/lisp/gnus/gnus-sum.el @@ -1958,8 +1958,6 @@ :keymap "C-M-b" #'gnus-summary-prev-thread "M-<down>" #'gnus-summary-next-thread "M-<up>" #'gnus-summary-prev-thread - "C-M-u" #'gnus-summary-up-thread - "C-M-d" #'gnus-summary-down-thread "&" #'gnus-summary-execute-command "c" #'gnus-summary-catchup-and-exit "C-w" #'gnus-summary-mark-region-as-read diff --git c/lisp/ibuffer.el i/lisp/ibuffer.el index 742d21d0b0..65430d7d11 100644 --- c/lisp/ibuffer.el +++ i/lisp/ibuffer.el @@ -447,7 +447,6 @@ ibuffer-mode-map "d" #'ibuffer-mark-for-delete "C-d" #'ibuffer-mark-for-delete-backwards - "k" #'ibuffer-mark-for-delete "x" #'ibuffer-do-kill-on-deletion-marks ;; immediate operations diff --git c/lisp/wdired.el i/lisp/wdired.el index a5858ed190..106d57174d 100644 --- c/lisp/wdired.el +++ i/lisp/wdired.el @@ -902,7 +902,6 @@ wdired-perm-mode-map "x" #'wdired-set-bit "-" #'wdired-set-bit "S" #'wdired-set-bit - "s" #'wdired-set-bit "T" #'wdired-set-bit "t" #'wdired-set-bit "s" #'wdired-set-bit [-- Attachment #3: Type: text/plain, Size: 33 bytes --] The detection looks like this: [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #4: keymap-duplicate-detection.patch --] [-- Type: text/x-diff, Size: 2266 bytes --] diff --git i/lisp/keymap.el w/lisp/keymap.el index 376a30f106..107565590c 100644 --- i/lisp/keymap.el +++ w/lisp/keymap.el @@ -530,7 +530,8 @@ define-keymap (keymap keymap) (prefix (define-prefix-command prefix nil name)) (full (make-keymap name)) - (t (make-sparse-keymap name))))) + (t (make-sparse-keymap name)))) + seen-keys) (when suppress (suppress-keymap keymap (eq suppress 'nodigits))) (when parent @@ -544,6 +545,9 @@ define-keymap (let ((def (pop definitions))) (if (eq key :menu) (easy-menu-define nil keymap "" def) + (if (member key seen-keys) + (error "Duplicate definition for key: %S %s" key keymap) + (push key seen-keys)) (keymap-set keymap key def))))) keymap))) @@ -571,6 +575,16 @@ defvar-keymap (push (pop defs) opts)))) (unless (zerop (% (length defs) 2)) (error "Uneven number of key/definition pairs: %s" defs)) + (let ((defs defs) + key seen-keys) + (while defs + (setq key (pop defs)) + (pop defs) + (when (not (eq key :menu)) + (if (member key seen-keys) + (error "Duplicate definition for key '%s' in keymap '%s'" + key variable-name) + (push key seen-keys))))) `(defvar ,variable-name (define-keymap ,@(nreverse opts) ,@defs) ,@(and doc (list doc))))) diff --git i/test/src/keymap-tests.el w/test/src/keymap-tests.el index b0876664ed..ce96be6869 100644 --- i/test/src/keymap-tests.el +++ w/test/src/keymap-tests.el @@ -430,6 +430,18 @@ test-non-key-events (make-non-key-event 'keymap-tests-event) (should (equal (where-is-internal 'keymap-tests-command) '([3 103])))) +(ert-deftest keymap-test-duplicate-definitions () + "Check that defvar-keymap rejects duplicate key definitions." + (should-error + (defvar-keymap + ert-keymap-duplicate + "a" #'next-line + "a" #'previous-line)) + (should-error + (define-keymap + "a" #'next-line + "a" #'previous-line))) + (provide 'keymap-tests) ;;; keymap-tests.el ends here ^ permalink raw reply related [flat|nested] 9+ messages in thread
* bug#56873: Make `defvar-keymap' warn on conflicting and redundant bindings 2022-08-02 11:53 ` Robert Pluim @ 2022-08-02 12:01 ` Lars Ingebrigtsen 2022-08-02 12:33 ` Robert Pluim 2022-08-02 12:17 ` Stefan Kangas 1 sibling, 1 reply; 9+ messages in thread From: Lars Ingebrigtsen @ 2022-08-02 12:01 UTC (permalink / raw) To: Robert Pluim; +Cc: Stefan Kangas, 56873 Robert Pluim <rpluim@gmail.com> writes: > I put it in both, and it turns out we have errors in both, which I > propose to fix like this (this preserves current behaviour, due to the > 'last definition wins' nature of define-keymap). I decided that for > coherence, the gnus-summary-up-thread binding should go as well (itʼs > available on "T-u" anyway). Looks good to me; please go ahead and push. ^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#56873: Make `defvar-keymap' warn on conflicting and redundant bindings 2022-08-02 12:01 ` Lars Ingebrigtsen @ 2022-08-02 12:33 ` Robert Pluim 0 siblings, 0 replies; 9+ messages in thread From: Robert Pluim @ 2022-08-02 12:33 UTC (permalink / raw) To: Lars Ingebrigtsen; +Cc: Stefan Kangas, 56873 tags 56873 fixed close 56873 29.1 quit >>>>> On Tue, 02 Aug 2022 14:01:18 +0200, Lars Ingebrigtsen <larsi@gnus.org> said: Lars> Robert Pluim <rpluim@gmail.com> writes: >> I put it in both, and it turns out we have errors in both, which I >> propose to fix like this (this preserves current behaviour, due to the >> 'last definition wins' nature of define-keymap). I decided that for >> coherence, the gnus-summary-up-thread binding should go as well (itʼs >> available on "T-u" anyway). Lars> Looks good to me; please go ahead and push. Closing. Committed as bf47851e08 ^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#56873: Make `defvar-keymap' warn on conflicting and redundant bindings 2022-08-02 11:53 ` Robert Pluim 2022-08-02 12:01 ` Lars Ingebrigtsen @ 2022-08-02 12:17 ` Stefan Kangas 1 sibling, 0 replies; 9+ messages in thread From: Stefan Kangas @ 2022-08-02 12:17 UTC (permalink / raw) To: Robert Pluim; +Cc: Lars Ingebrigtsen, 56873 Robert Pluim <rpluim@gmail.com> writes: > The detection looks like this: LGTM. ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2022-08-02 15:46 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-08-01 16:47 bug#56873: Make `defvar-keymap' warn on conflicting and redundant bindings Stefan Kangas 2022-08-02 8:25 ` Robert Pluim 2022-08-02 9:48 ` Lars Ingebrigtsen 2022-08-02 15:46 ` Drew Adams 2022-08-02 10:09 ` Stefan Kangas 2022-08-02 11:53 ` Robert Pluim 2022-08-02 12:01 ` Lars Ingebrigtsen 2022-08-02 12:33 ` Robert Pluim 2022-08-02 12:17 ` Stefan Kangas
Code repositories for project(s) associated with this external index https://git.savannah.gnu.org/cgit/emacs.git https://git.savannah.gnu.org/cgit/emacs/org-mode.git This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.