1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2025-01-29 19:48:19 +00:00

(imenu-update-menubar): New function.

(imenu-add-to-menubar): Use an ordinary menu bar submenu.
Add imenu-add-to-menubar to menu-bar-update-hook to update the submenu.
(imenu--make-index-alist): Add noerror argument.
(imenu--menubar-select): New function.
(imenu--create-keymap-1, imenu--create-keymap-2): New arg COMMANDS.
(imenu): Allow a string as arg.
This commit is contained in:
Karl Heuer 1995-12-21 17:47:08 +00:00
parent bcdef904cb
commit 0a8e8bc63e

View File

@ -334,6 +334,10 @@ This function is called after the function pointed out by
(defvar imenu--index-alist nil)
(make-variable-buffer-local 'imenu--index-alist)
;; The latest buffer index used to update the menu bar menu.
(defvar imenu--last-menubar-index-alist nil)
(make-variable-buffer-local 'imenu--last-menubar-index-alist)
;; History list for 'jump-to-function-in-buffer'.
;; Making this buffer local caused it not to work!
(defvar imenu--history-list nil)
@ -410,7 +414,7 @@ This function is called after the function pointed out by
;;; ((NAME . POSITION) (NAME . POSITION) ...)
;;;
(defun imenu--make-index-alist ()
(defun imenu--make-index-alist (&optional noerror)
;; Create a list for this buffer only when needed.
(or (and imenu--index-alist
(or (not imenu-auto-rescan)
@ -420,8 +424,10 @@ This function is called after the function pointed out by
(setq imenu--index-alist
(save-excursion
(funcall imenu-create-index-function))))
(or imenu--index-alist
(or imenu--index-alist noerror
(error "No items suitable for an index found in this buffer"))
(or imenu--index-alist
(setq imenu--index-alist (list nil)))
;; Add a rescan option to the index.
(cons imenu--rescan-item imenu--index-alist))
;;;
@ -446,7 +452,7 @@ This function is called after the function pointed out by
alist)
t))
(defun imenu--create-keymap-2 (alist counter)
(defun imenu--create-keymap-2 (alist counter &optional commands)
(let ((map nil))
(mapcar
(function
@ -454,16 +460,21 @@ This function is called after the function pointed out by
(cond
((listp (cdr item))
(append (list (incf counter) (car item) 'keymap (car item))
(imenu--create-keymap-2 (cdr item) (+ counter 10))))
(imenu--create-keymap-2 (cdr item) (+ counter 10) commands)))
(t
(let ((end (cons '(nil) t)))
(let ((end (if commands (list 'lambda 'nil '(interactive)
(list 'imenu--menubar-select item))
(cons '(nil) t))))
(cons (car item)
(cons (car item) end))))
)))
alist)))
(defun imenu--create-keymap-1 (title alist)
(append (list 'keymap title) (imenu--create-keymap-2 alist 0)))
;; If COMMANDS is non-nil, make a real keymap
;; with a real command used as the definition.
;; If it is nil, make something suitable for x-popup-menu.
(defun imenu--create-keymap-1 (title alist &optional commands)
(append (list 'keymap title) (imenu--create-keymap-2 alist 0 commands)))
(defun imenu--in-alist (str alist)
@ -769,13 +780,47 @@ The returned value is on the form (INDEX-NAME . INDEX-POSITION)."
;;;###autoload
(defun imenu-add-to-menubar (name)
"Adds an \"imenu\" entry to the menubar for the current local keymap.
NAME is the string naming the menu to be added.
See 'imenu' for more information."
(interactive "sMenu name: ")
(and window-system
(define-key (current-local-map) [menu-bar index]
(cons name 'imenu))))
"Adds an \"imenu\" entry to the menu bar for the current major mode.
NAME is a string used to name the menu bar item.
See `imenu' for more information."
(interactive "sImenu menu item name: ")
(define-key (current-local-map) [menu-bar index]
(cons name (nconc (make-sparse-keymap "Imenu") (make-sparse-keymap))))
(add-hook 'menu-bar-update-hook 'imenu-update-menubar))
(defun imenu-update-menubar ()
(and (current-local-map)
(keymapp (lookup-key (current-local-map) [menu-bar index]))
(let ((index-alist (imenu--make-index-alist t)))
;; Don't bother updating if the index-alist has not changed
;; since the last time we did it.
(or (equal index-alist imenu--last-menubar-index-alist)
(let (menu menu1 old)
(setq imenu--last-menubar-index-alist index-alist)
(setq menu (imenu--split-menu
(if imenu-sort-function
(sort
(let ((res nil)
(oldlist index-alist))
;; Copy list method from the cl package `copy-list'
(while (consp oldlist) (push (pop oldlist) res))
(prog1 (nreverse res) (setcdr res oldlist)))
imenu-sort-function)
index-alist)
(buffer-name)))
(setq menu1 (imenu--create-keymap-1 (car menu)
(if (< 1 (length (cdr menu)))
(cdr menu)
(cdr (car (cdr menu))))
t))
(setq old (lookup-key (current-local-map) [menu-bar index]))
(if (keymapp old)
(setcdr (nthcdr 2 old) menu1)))))))
(defun imenu--menubar-select (item)
"Use Imenu to select the function or variable named in this menu item."
(interactive)
(imenu item))
;;;###autoload
(defun imenu (index-item)
@ -784,7 +829,10 @@ See `imenu-choose-buffer-index' for more information."
(interactive
(list (save-restriction
(widen)
(imenu-choose-buffer-index))))
(car (imenu-choose-buffer-index)))))
;; Convert a string to an alist element.
(if (stringp index-item)
(setq index-item (assoc index-item (imenu--make-index-alist))))
(and index-item
(progn
(push-mark)