# HG changeset patch # User Karl Heuer # Date 762712026 0 # Node ID 1ad8f8ccdc2b5bf2f58729a3269a5504ef0bc050 # Parent 64fe0cc0138eef7b3d2fa1d1297589817ae0ff11 (substitute-key-definition): Avoid infinite recursion. diff -r 64fe0cc0138e -r 1ad8f8ccdc2b lisp/subr.el --- a/lisp/subr.el Thu Mar 03 15:59:31 1994 +0000 +++ b/lisp/subr.el Thu Mar 03 16:27:06 1994 +0000 @@ -133,6 +133,9 @@ ; (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. @@ -141,7 +144,9 @@ (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) @@ -163,7 +168,9 @@ (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))))) @@ -189,7 +196,9 @@ (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)))))