; (copy-sequence keymap)
; (copy-alist keymap)))
+(defvar key-substitution-in-progress nil
+ "Used internally by substitute-key-definition.")
+
(defun substitute-key-definition (olddef newdef keymap &optional oldmap prefix)
"Replace OLDDEF with NEWDEF for any keys in KEYMAP now defined as OLDDEF.
In other words, OLDDEF is replaced with NEWDEF where ever it appears.
(or prefix (setq prefix ""))
(let* ((scan (or oldmap keymap))
(vec1 (vector nil))
- (prefix1 (vconcat prefix vec1)))
+ (prefix1 (vconcat prefix vec1))
+ (key-substitution-in-progress
+ (cons scan key-substitution-in-progress)))
;; Scan OLDMAP, finding each char or event-symbol that
;; has any definition, and act on it with hack-key.
(while (consp scan)
(setq inner-def (symbol-function inner-def)))
(if (eq defn olddef)
(define-key keymap prefix1 (nconc (nreverse skipped) newdef))
- (if (keymapp defn)
+ (if (and (keymapp defn)
+ (not (memq inner-def
+ key-substitution-in-progress)))
(substitute-key-definition olddef newdef keymap
inner-def
prefix1)))))
(if (eq defn olddef)
(define-key keymap prefix1
(nconc (nreverse skipped) newdef))
- (if (keymapp defn)
+ (if (and (keymapp defn)
+ (not (memq inner-def
+ key-substitution-in-progress)))
(substitute-key-definition olddef newdef keymap
inner-def
prefix1)))))