diff options
author | Robert Pluim <rpluim@gmail.com> | 2022-08-02 14:22:32 +0200 |
---|---|---|
committer | Robert Pluim <rpluim@gmail.com> | 2022-08-02 14:29:43 +0200 |
commit | bf47851e0817abcf17eeb4a10d27cf18de2c68a2 (patch) | |
tree | 7fc3cb4b2dd1726eaa6d1e8807cee27155ba485a /lisp/keymap.el | |
parent | e5e840168c039f3daf9cce05e0b8ac4c49a450ec (diff) | |
download | emacs-bf47851e0817abcf17eeb4a10d27cf18de2c68a2.tar.gz emacs-bf47851e0817abcf17eeb4a10d27cf18de2c68a2.tar.bz2 emacs-bf47851e0817abcf17eeb4a10d27cf18de2c68a2.zip |
Signal error on duplicate key definitions
* lisp/keymap.el (define-keymap, defvar-keymap): Signal error if the
same key is specified twice. (Bug#56873)
* doc/lispref/keymaps.texi (Creating Keymaps): Document error
signaling behaviour.
* test/src/keymap-tests.el (keymap-test-duplicate-definitions): Test
duplicate definition detection.
Diffstat (limited to 'lisp/keymap.el')
-rw-r--r-- | lisp/keymap.el | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/lisp/keymap.el b/lisp/keymap.el index 376a30f1065..107565590c1 100644 --- a/lisp/keymap.el +++ b/lisp/keymap.el @@ -530,7 +530,8 @@ should be a MENU form as accepted by `easy-menu-define'. (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 @@ should be a MENU form as accepted by `easy-menu-define'. (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 @@ as the variable documentation string. (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))))) |