# HG changeset patch # User Richard M. Stallman # Date 741414997 0 # Node ID 1f1fefc400ed1a92f22f632bc7109f353c655d30 # Parent c2583a21ea56c77b356a055f2a2a2920bdf43ac3 (define-key-after): Delete duplicate bindings that come after the new one. Do insert when we reach the end, if haven't before. diff -r c2583a21ea56 -r 1f1fefc400ed lisp/subr.el --- a/lisp/subr.el Wed Jun 30 04:14:08 1993 +0000 +++ b/lisp/subr.el Wed Jun 30 04:36:37 1993 +0000 @@ -189,7 +189,7 @@ 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 @@ (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)