From 70edffb13005de4aa58ba818559b85aa63a1cdd4 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sun, 28 Oct 2012 10:56:51 -0400 Subject: [PATCH] * lisp/tmm.el (tmm-prompt): Use map-keymap. * doc/lispref/keymaps.texi (Format of Keymaps): Document the multiple inheritance format. Fixes: debbugs:12744 --- doc/lispref/ChangeLog | 5 +++++ doc/lispref/keymaps.texi | 5 +++++ lisp/ChangeLog | 4 ++++ lisp/tmm.el | 27 +++++++++++++++------------ 4 files changed, 29 insertions(+), 12 deletions(-) diff --git a/doc/lispref/ChangeLog b/doc/lispref/ChangeLog index fe12e27a070..6b3febba631 100644 --- a/doc/lispref/ChangeLog +++ b/doc/lispref/ChangeLog @@ -1,3 +1,8 @@ +2012-10-28 Stefan Monnier + + * keymaps.texi (Format of Keymaps): Document the multiple + inheritance format. + 2012-10-28 Martin Rudalics * windows.texi (Basic Windows): Reformulate description of live, diff --git a/doc/lispref/keymaps.texi b/doc/lispref/keymaps.texi index 8fe729d50f2..f658f7e66fb 100644 --- a/doc/lispref/keymaps.texi +++ b/doc/lispref/keymaps.texi @@ -210,6 +210,11 @@ Aside from elements that specify bindings for keys, a keymap can also have a string as an element. This is called the @dfn{overall prompt string} and makes it possible to use the keymap as a menu. @xref{Defining Menus}. + +@item (keymap @dots{}) +If an element of a keymap is itself a keymap, it counts as if this inner keymap +were inlined in the outer keymap. This is used for multiple-inheritance, such +as in @code{make-composed-keymap}. @end table When the binding is @code{nil}, it doesn't constitute a definition diff --git a/lisp/ChangeLog b/lisp/ChangeLog index d7349617d58..c52ed5e6e8b 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,7 @@ +2012-10-28 Stefan Monnier + + * tmm.el (tmm-prompt): Use map-keymap (bug#12744). + 2012-10-27 Eli Zaretskii * profiler.el (profiler-report-make-entry-part): Fix help-echo diff --git a/lisp/tmm.el b/lisp/tmm.el index 4bc1c9af99a..6c2adf6837a 100644 --- a/lisp/tmm.el +++ b/lisp/tmm.el @@ -165,13 +165,15 @@ Its value should be an event that has a binding in MENU." ;; tmm-km-list is an alist of (STRING . MEANING). ;; It has no other elements. ;; The order of elements in tmm-km-list is the order of the menu bar. - (dolist (elt menu) - (cond - ((stringp elt) (setq gl-str elt)) - ((listp elt) (tmm-get-keymap elt not-menu)) - ((vectorp elt) - (dotimes (i (length elt)) - (tmm-get-keymap (cons i (aref elt i)) not-menu))))) + (if (not not-menu) + (map-keymap (lambda (k v) (tmm-get-keymap (cons k v))) menu) + (dolist (elt menu) + (cond + ((stringp elt) (setq gl-str elt)) + ((listp elt) (tmm-get-keymap elt not-menu)) + ((vectorp elt) + (dotimes (i (length elt)) + (tmm-get-keymap (cons i (aref elt i)) not-menu)))))) ;; Choose an element of tmm-km-list; put it in choice. (if (and not-menu (= 1 (length tmm-km-list))) ;; If this is the top-level of an x-popup-menu menu, @@ -432,7 +434,7 @@ It uses the free variable `tmm-table-undef' to keep undefined keys." (or (keymapp (cdr-safe (cdr-safe elt))) (eq (car (cdr-safe (cdr-safe elt))) 'lambda)) (and (symbolp (cdr-safe (cdr-safe elt))) - (fboundp (cdr-safe (cdr-safe elt))))) + (fboundp (cdr-safe (cdr-safe elt))))) (setq km (cddr elt)) (and (stringp (car elt)) (setq str (car elt)))) @@ -458,14 +460,15 @@ It uses the free variable `tmm-table-undef' to keep undefined keys." (eq (car (cdr-safe (cdr-safe (cdr-safe elt)))) 'lambda)) (and (symbolp (cdr-safe (cdr-safe (cdr-safe elt)))) (fboundp (cdr-safe (cdr-safe (cdr-safe elt)))))) - ; New style of easy-menu + ; New style of easy-menu (setq km (cdr (cddr elt))) (and (stringp (car elt)) (setq str (car elt)))) ((stringp event) ; x-popup or x-popup element - (if (or in-x-menu (stringp (car-safe elt))) - (setq str event event nil km elt) - (setq str event event nil km (cons 'keymap elt))))) + (setq str event) + (setq event nil) + (setq km (if (or in-x-menu (stringp (car-safe elt))) + elt (cons 'keymap elt))))) (unless (or (eq km 'ignore) (null str)) (let ((binding (where-is-internal km nil t))) (when binding -- 2.39.2