summaryrefslogtreecommitdiff
path: root/lisp/keymap.el
diff options
context:
space:
mode:
authorRobert Pluim <rpluim@gmail.com>2022-08-02 14:22:32 +0200
committerRobert Pluim <rpluim@gmail.com>2022-08-02 14:29:43 +0200
commitbf47851e0817abcf17eeb4a10d27cf18de2c68a2 (patch)
tree7fc3cb4b2dd1726eaa6d1e8807cee27155ba485a /lisp/keymap.el
parente5e840168c039f3daf9cce05e0b8ac4c49a450ec (diff)
downloademacs-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.el16
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)))))