Mercurial > emacs
changeset 3927:1f1fefc400ed
(define-key-after): Delete duplicate bindings that come
after the new one. Do insert when we reach the end, if haven't before.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Wed, 30 Jun 1993 04:36:37 +0000 |
parents | c2583a21ea56 |
children | c5f9d7f928a7 |
files | lisp/subr.el |
diffstat | 1 files changed, 13 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- 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)