* lisp/tmm.el (tmm-prompt): Use map-keymap.

* doc/lispref/keymaps.texi (Format of Keymaps): Document the multiple
inheritance format.

Fixes: debbugs:12744
This commit is contained in:
Stefan Monnier 2012-10-28 10:56:51 -04:00
parent 3a51f0eb41
commit 70edffb130
4 changed files with 29 additions and 12 deletions

View file

@ -1,3 +1,8 @@
2012-10-28 Stefan Monnier <monnier@iro.umontreal.ca>
* keymaps.texi (Format of Keymaps): Document the multiple
inheritance format.
2012-10-28 Martin Rudalics <rudalics@gmx.at>
* windows.texi (Basic Windows): Reformulate description of live,

View file

@ -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

View file

@ -1,3 +1,7 @@
2012-10-28 Stefan Monnier <monnier@iro.umontreal.ca>
* tmm.el (tmm-prompt): Use map-keymap (bug#12744).
2012-10-27 Eli Zaretskii <eliz@gnu.org>
* profiler.el (profiler-report-make-entry-part): Fix help-echo

View file

@ -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