]> git.eshelyaron.com Git - emacs.git/commitdiff
(define-key-after): Delete duplicate bindings that come
authorRichard M. Stallman <rms@gnu.org>
Wed, 30 Jun 1993 04:36:37 +0000 (04:36 +0000)
committerRichard M. Stallman <rms@gnu.org>
Wed, 30 Jun 1993 04:36:37 +0000 (04:36 +0000)
after the new one.  Do insert when we reach the end, if haven't before.

lisp/subr.el

index e7bc2e13a24e6b06cb1e9ff32553d931810a9852..23e9da8459216d7669d1251cf5302840c7b3be53 100644 (file)
@@ -189,7 +189,7 @@ of the map.
 The order matters when the keymap is used as a menu."
   (or (keymapp keymap)
       (signal 'wrong-type-argument (list 'keymapp keymap)))
-  (let ((tail keymap) done
+  (let ((tail keymap) done inserted
        (first (aref key 0)))
     (while (and (not done) tail)
       ;; Delete any earlier bindings for the same key.
@@ -197,11 +197,20 @@ The order matters when the keymap is used as a menu."
          (setcdr tail (cdr (cdr tail))))
       ;; When we reach AFTER's binding, insert the new binding after.
       ;; If we reach an inherited keymap, insert just before that.
+      ;; If we reach the end of this keymap, insert at the end.
       (if (or (eq (car-safe (car tail)) after)
-             (eq (car tail) 'keymap))
+             (eq (car (cdr tail)) 'keymap)
+             (null (cdr tail)))
          (progn
-           (setcdr tail (cons (cons (aref key 0) definition) (cdr tail)))
-           (setq done t)))
+           ;; Stop the scan only if we find a parent keymap.
+           ;; Keep going past the inserted element
+           ;; so we can delete any duplications that come later.
+           (if (eq (car (cdr tail)) 'keymap)
+               (setq done t))
+           ;; Don't insert more than once.
+           (or inserted
+               (setcdr tail (cons (cons (aref key 0) definition) (cdr tail))))
+           (setq inserted t)))
       (setq tail (cdr tail)))))
 
 (defun keyboard-translate (from to)