(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))
+ (when (member key seen-keys)
+ ;; Since the keys can be computed dynamically, it can
+ ;; very well happen that we get duplicate definitions
+ ;; due to some unfortunate configuration rather than
+ ;; due to an actual bug. While such duplicates are
+ ;; not desirable, they shouldn't prevent the users
+ ;; from getting their job done.
+ (message "Duplicate definition for key: %S %s" key keymap))
+ (push key seen-keys)
(keymap-set keymap key def)))))
keymap)))
;;; Code:
(require 'ert)
+(require 'cl-lib)
(defun keymap-tests--make-keymap-test (fun)
(should (eq (car (funcall fun)) 'keymap))
ert-keymap-duplicate
"a" #'next-line
"a" #'previous-line))
- (should-error
- (define-keymap
- "a" #'next-line
- "a" #'previous-line)))
+ (let ((msg ""))
+ ;; FIXME: It would be nicer to use `current-message' rather than override
+ ;; `message', but `current-message' returns always nil in batch mode :-(
+ (cl-letf (((symbol-function 'message)
+ (lambda (fmt &rest args) (setq msg (apply #'format fmt args)))))
+ (should
+ (string-match "duplicate"
+ (progn
+ (define-keymap
+ "a" #'next-line
+ "a" #'previous-line)
+ msg))))))
(ert-deftest keymap-unset-test-remove-and-inheritance ()
"Check various behaviors of keymap-unset. (Bug#62207)"