*** empty log message ***
[bpt/emacs.git] / lisp / tmm.el
index c532ec1..cd674ce 100644 (file)
@@ -176,6 +176,8 @@ Its value should be an event that has a binding in MENU."
        ;; This way we only ask the user one question,
        ;; for which element of that pane.
        (setq choice (cdr (car tmm-km-list)))
+      (unless tmm-km-list
+       (error "Empty menu reached"))
       (and tmm-km-list
           (let ((index-of-default 0))
             (if tmm-mid-prompt
@@ -191,7 +193,8 @@ Its value should be an event that has a binding in MENU."
                     ;; Be careful to count only the elements of MENU
                     ;; that actually constitute menu bar items.
                     (if (and (consp (car tail))
-                             (stringp (car-safe (cdr (car tail)))))
+                             (or (stringp (car-safe (cdr (car tail))))
+                                 (eq (car-safe (cdr (car tail))) 'menu-item)))
                         (setq index-of-default (1+ index-of-default)))
                     (setq tail (cdr tail)))))
             (setq history (reverse (mapcar 'car tmm-km-list)))
@@ -220,7 +223,7 @@ Its value should be an event that has a binding in MENU."
           (string= (substring out 0 (length tmm-c-prompt)) tmm-c-prompt)
           (setq out (substring out (length tmm-c-prompt))
                 choice (cdr (assoc out tmm-km-list))))
-      (and (null choice)
+      (and (null choice) out
           (setq out (try-completion out tmm-km-list)
                 choice (cdr (assoc  out tmm-km-list)))))
     ;; CHOICE is now (STRING . MEANING).  Separate the two parts.
@@ -370,7 +373,8 @@ Stores a list of all the shortcuts in the free variable `tmm-short-cuts'."
              (re-search-forward
               (concat "\\(^\\|[ \t]\\)" (char-to-string c) tmm-mid-prompt))
              (choose-completion))
-         (erase-buffer)                ; In minibuffer
+         ;; In minibuffer
+         (delete-region (minibuffer-prompt-end) (point-max))
          (mapcar (lambda (elt)
                    (if (string=
                         (substring (car elt) 0 
@@ -384,8 +388,9 @@ Stores a list of all the shortcuts in the free variable `tmm-short-cuts'."
 
 (defun tmm-goto-completions ()
   (interactive)
-  (setq tmm-c-prompt (buffer-string))
-  (erase-buffer)
+  (let ((prompt-end (minibuffer-prompt-end)))
+    (setq tmm-c-prompt (buffer-substring prompt-end (point-max)))
+    (delete-region prompt-end (point-max)))
   (switch-to-buffer-other-window "*Completions*")
   (search-forward tmm-c-prompt)
   (search-backward tmm-c-prompt))
@@ -397,49 +402,60 @@ element of keymap, an `x-popup-menu' argument, or an element of
 `x-popup-menu' argument (when IN-X-MENU is not-nil).
 This function adds the element only if it is not already present.
 It uses the free variable `tmm-table-undef' to keep undefined keys."
-  (let (km str cache (event (car elt)))
+  (let (km str cache plist filter (event (car elt)))
     (setq elt (cdr elt))
     (if (eq elt 'undefined)
        (setq tmm-table-undef (cons (cons event nil) tmm-table-undef))
-      (or
-       (assoc event tmm-table-undef)
-       (and (if (listp elt)
-               (or (keymapp elt) (eq (car elt) 'lambda))
-             (fboundp elt))
-           (setq km elt))
-       (and (if (listp (cdr-safe elt))
-               (or (keymapp (cdr-safe elt))
-                   (eq (car (cdr-safe elt)) 'lambda))
-             (fboundp (cdr-safe elt)))
-           (setq km (cdr elt))
-           (and (stringp (car elt)) (setq str (car elt))))
-       (and (if (listp (cdr-safe (cdr-safe elt)))
-               (or (keymapp (cdr-safe (cdr-safe elt)))
-                   (eq (car (cdr-safe (cdr-safe elt))) 'lambda))
-             (fboundp (cdr-safe (cdr-safe elt))))
-           (setq km (cdr (cdr elt)))
-           (and (stringp (car elt)) (setq str (car elt)))
-           (or (and str
-                    (stringp (cdr (car (cdr elt)))) ; keyseq cache
-                    (setq cache (cdr (car (cdr elt))))
-                    cache (setq str (concat str cache))) str))
-       (and (if (listp (cdr-safe (cdr-safe (cdr-safe elt))))
-               (or (keymapp (cdr-safe (cdr-safe (cdr-safe elt))))
-                   (eq (car (cdr-safe (cdr-safe (cdr-safe elt)))) 'lambda))
-             (fboundp (cdr-safe (cdr-safe (cdr-safe elt)))))
-                                       ; New style of easy-menu
-           (setq km (cdr (cdr (cdr elt))))
-           (and (stringp (car elt)) (setq str (car elt)))
-           (or (and str
-                    (stringp (cdr (car (cdr (cdr elt))))) ; keyseq cache
-                    (setq cache (cdr (car (cdr (cdr elt)))))
-                    cache (setq str (concat str cache)))
-               str))
-           (and (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))
-                  )))
+      (unless (assoc event tmm-table-undef)
+       (cond ((if (listp elt)
+                  (or (keymapp elt) (eq (car elt) 'lambda))
+                (fboundp elt))
+              (setq km elt))
+             ((if (listp (cdr-safe elt))
+                  (or (keymapp (cdr-safe elt))
+                      (eq (car (cdr-safe elt)) 'lambda))
+                (fboundp (cdr-safe elt)))
+              (setq km (cdr elt))
+              (and (stringp (car elt)) (setq str (car elt))))
+             ((if (listp (cdr-safe (cdr-safe elt)))
+                  (or (keymapp (cdr-safe (cdr-safe elt)))
+                      (eq (car (cdr-safe (cdr-safe elt))) 'lambda))
+                (fboundp (cdr-safe (cdr-safe elt))))
+              (setq km (cdr (cdr elt)))
+              (and (stringp (car elt)) (setq str (car elt)))
+              (and str
+                   (stringp (cdr (car (cdr elt)))) ; keyseq cache
+                   (setq cache (cdr (car (cdr elt))))
+                   cache (setq str (concat str cache))))
+             ((eq (car-safe elt) 'menu-item)
+              (setq plist (cdr-safe (cdr-safe (cdr-safe elt))))
+              (setq km (nth 2 elt))
+              (setq str (nth 1 elt))
+              (setq filter (plist-get plist :filter))
+              (if filter
+                  (setq km (funcall filter km)))
+              (and str
+                   (consp (nth 3 elt))
+                   (stringp (cdr (nth 3 elt))) ; keyseq cache
+                   (setq cache (cdr (nth 3 elt)))
+                   cache
+                   (setq str (concat str cache))))
+             ((if (listp (cdr-safe (cdr-safe (cdr-safe elt))))
+                  (or (keymapp (cdr-safe (cdr-safe (cdr-safe elt))))
+                      (eq (car (cdr-safe (cdr-safe (cdr-safe elt)))) 'lambda))
+                (fboundp (cdr-safe (cdr-safe (cdr-safe elt)))))
+                                        ; New style of easy-menu
+              (setq km (cdr (cdr (cdr elt))))
+              (and (stringp (car elt)) (setq str (car elt)))
+              (and str
+                   (stringp (cdr (car (cdr (cdr elt))))) ; keyseq cache
+                   (setq cache (cdr (car (cdr (cdr elt)))))
+                   cache (setq str (concat str cache))))
+             ((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))
+                ))))
       (and km (stringp km) (setq str km))
       ;; Verify that the command is enabled;
       ;; if not, don't mention it.