]> git.eshelyaron.com Git - emacs.git/commitdiff
(derived-mode-merge-keymaps): Recursively merge prefix key submaps also.
authorRichard M. Stallman <rms@gnu.org>
Fri, 14 Apr 1995 05:56:31 +0000 (05:56 +0000)
committerRichard M. Stallman <rms@gnu.org>
Fri, 14 Apr 1995 05:56:31 +0000 (05:56 +0000)
lisp/derived.el

index f48156a101073b4987acfad486e9e06ccb51dc41..a1cfe8485f8e94b2eae26074c7a64051a01638e3 100644 (file)
@@ -297,8 +297,30 @@ Always merge its parent into it, since the merge is non-destructive."
 
 (defun derived-mode-merge-keymaps (old new)
   "Merge an old keymap into a new one.
-The old keymap is set to be the cdr of the new one, so that there will
+The old keymap is set to be the last cdr of the new one, so that there will
 be automatic inheritance."
+  (let ((tail new))
+    ;; Scan the NEW map for prefix keys.
+    (while (consp tail)
+      (and (consp (car tail))
+          (let* ((key (vector (car (car tail))))
+                 (subnew (lookup-key new key))
+                 (subold (lookup-key old key)))
+            ;; If KEY is a prefix key in both OLD and NEW, merge them.
+            (and (keymapp subnew) (keymapp subold)
+                 (derived-mode-merge-keymaps subold subnew))))
+      (and (vectorp (car tail))
+          ;; Search a vector of ASCII char bindings for prefix keys.
+          (let ((i (1- (length (car tail)))))
+            (while (>= i 0)
+              (let* ((key (vector i))
+                     (subnew (lookup-key new key))
+                     (subold (lookup-key old key)))
+                ;; If KEY is a prefix key in both OLD and NEW, merge them.
+                (and (keymapp subnew) (keymapp subold)
+                     (derived-mode-merge-keymaps subold subnew)))
+              (setq i (1- i)))))
+      (setq tail (cdr tail))))
   (setcdr (nthcdr (1- (length new)) new) old))
 
 (defun derived-mode-merge-syntax-tables (old new)