]> code.delx.au - gnu-emacs/blobdiff - lisp/imenu.el
Much whitespace and capitalization change.
[gnu-emacs] / lisp / imenu.el
index 238adfe950520cd34ce4b5871e6d0a79bd5b1983..32dda9fd3c6469d04f8a0f3c83ed83ce2ca5865b 100644 (file)
@@ -124,7 +124,9 @@ If `on-mouse' use a popup menu when `imenu' was invoked with the mouse."
 (defcustom imenu-eager-completion-buffer
   (not (eq imenu-always-use-completion-buffer-p 'never))
   "If non-nil, eagerly popup the completion buffer."
-  :type 'boolean)
+  :type 'boolean
+  :group 'imenu
+  :version "21.4")
 
 (defcustom imenu-after-jump-hook nil
   "*Hooks called after jumping to a place in the buffer.
@@ -159,16 +161,17 @@ element should come before the second.  The arguments are cons cells;
   :type 'integer
   :group 'imenu)
 
-(defcustom imenu-scanning-message "Scanning buffer for index (%3d%%)"
-  "*Progress message during the index scanning of the buffer.
-If non-nil, user gets a message during the scanning of the buffer.
-
-Relevant only if the mode-specific function that creates the buffer
-index use `imenu-progress-message', and not useful if that is fast, in
-which case you might as well set this to nil."
-  :type '(choice string
-                (const :tag "None" nil))
-  :group 'imenu)
+;; No longer used.  KFS 2004-10-27
+;; (defcustom imenu-scanning-message "Scanning buffer for index (%3d%%)"
+;;   "*Progress message during the index scanning of the buffer.
+;; If non-nil, user gets a message during the scanning of the buffer.
+;;
+;; Relevant only if the mode-specific function that creates the buffer
+;; index use `imenu-progress-message', and not useful if that is fast, in
+;; which case you might as well set this to nil."
+;;   :type '(choice string
+;;              (const :tag "None" nil))
+;;   :group 'imenu)
 
 (defcustom imenu-space-replacement "."
   "*The replacement string for spaces in index names.
@@ -211,8 +214,6 @@ menu.  See the info section on Regexps for more information.
 INDEX points to the substring in REGEXP that contains the name (of the
 function, variable or type) that is to appear in the menu.
 
-The variable is buffer-local.
-
 The variable `imenu-case-fold-search' determines whether or not the
 regexp matches are case sensitive, and `imenu-syntax-alist' can be
 used to alter the syntax table for the search.
@@ -240,9 +241,7 @@ A nested sub-alist element looks like (INDEX-NAME SUB-ALIST).
 The function `imenu--subalist-p' tests an element and returns t
 if it is a sub-alist.
 
-This function is called within a `save-excursion'.
-
-The variable is buffer-local.")
+This function is called within a `save-excursion'.")
 ;;;###autoload
 (make-variable-buffer-local 'imenu-create-index-function)
 
@@ -302,16 +301,22 @@ The function in this variable is called when selecting a normal index-item.")
 ;; is calculated.
 ;; PREVPOS is the variable in which we store the last position displayed.
 (defmacro imenu-progress-message (prevpos &optional relpos reverse)
-  `(and
-    imenu-scanning-message
-    (let ((pos ,(if relpos
-                   relpos
-                 `(imenu--relative-position ,reverse))))
-      (if ,(if relpos t
-            `(> pos (+ 5 ,prevpos)))
-         (progn
-           (message imenu-scanning-message pos)
-           (setq ,prevpos pos))))))
+
+;; Made obsolete/empty, as computers are now faster than the eye, and
+;; it had problems updating the messages correctly, and could shadow
+;; more important messages/prompts in the minibuffer.  KFS 2004-10-27.
+
+;;  `(and
+;;    imenu-scanning-message
+;;    (let ((pos ,(if relpos
+;;                 relpos
+;;               `(imenu--relative-position ,reverse))))
+;;      (if ,(if relpos t
+;;          `(> pos (+ 5 ,prevpos)))
+;;       (progn
+;;         (message imenu-scanning-message pos)
+;;         (setq ,prevpos pos)))))
+)
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -321,9 +326,12 @@ The function in this variable is called when selecting a normal index-item.")
 ;;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-;; Return the current/previous sexp and the location of the sexp (its
-;; beginning) without moving the point.
+;; FIXME: This is the only imenu-example-* definition that's actually used,
+;; and it seems to only be used by cperl-mode.el.  We should just move it to
+;; cperl-mode.el and remove the rest.
 (defun imenu-example--name-and-position ()
+  "Return the current/previous sexp and its (beginning) location.
+Don't move point."
   (save-excursion
     (forward-sexp -1)
     ;; [ydi] modified for imenu-use-markers
@@ -553,12 +561,10 @@ A nested sub-alist element looks like (INDEX-NAME SUB-ALIST).")
             (cond
              ((consp (cdr item))
               (imenu--truncate-items (cdr item)))
-             (t
-              ;; truncate if necessary
-              (if (and (numberp imenu-max-item-length)
-                       (> (length (car item)) imenu-max-item-length))
-                  (setcar item (substring (car item) 0
-                                          imenu-max-item-length)))))))
+             ;; truncate if necessary
+             ((and (numberp imenu-max-item-length)
+                   (> (length (car item)) imenu-max-item-length))
+              (setcar item (substring (car item) 0 imenu-max-item-length))))))
          menulist))
 
 
@@ -737,8 +743,8 @@ for modes which use `imenu--generic-function'.  If it is not set, but
 ;;;###autoload
 (make-variable-buffer-local 'imenu-case-fold-search)
 
-;; Originally "Built on some ideas that Erik Naggum <erik@naggum.no>
-;; once posted to comp.emacs" but since substantially re-written.
+;; This function can be called with quitting disabled,
+;; so it needs to be careful never to loop!
 (defun imenu--generic-function (patterns)
   "Return an index of the current buffer as an alist.
 
@@ -766,7 +772,7 @@ the alist look like:
  (INDEX-NAME . INDEX-POSITION)
 or like:
  (INDEX-NAME INDEX-POSITION FUNCTION ARGUMENTS...)
-They may also be nested index alists like: 
+They may also be nested index alists like:
  (INDEX-NAME . INDEX-ALIST)
 depending on PATTERNS."
 
@@ -792,6 +798,9 @@ depending on PATTERNS."
     (unwind-protect                    ; for syntax table
        (save-match-data
          (set-syntax-table table)
+         (if (or comment-start comment-start-skip)
+             (comment-normalize-vars))
+
          ;; map over the elements of imenu-generic-expression
          ;; (typically functions, variables ...)
          (dolist (pat patterns)
@@ -799,32 +808,49 @@ depending on PATTERNS."
                  (regexp (nth 1 pat))
                  (index (nth 2 pat))
                  (function (nth 3 pat))
-                 (rest (nthcdr 4 pat)))
+                 (rest (nthcdr 4 pat))
+                 start
+                 cs)
              ;; Go backwards for convenience of adding items in order.
              (goto-char (point-max))
-             (while (re-search-backward regexp nil t)
-               (imenu-progress-message prev-pos nil t)
+             (while (and (re-search-backward regexp nil t)
+                         ;; Exit the loop if we get an empty match,
+                         ;; because it means a bad regexp was specified.
+                         (not (= (match-beginning 0) (match-end 0))))
+               (setq start (point))
+               (goto-char (match-end index))
                (setq beg (match-beginning index))
-               ;; Add this sort of submenu only when we've found an
-               ;; item for it, avoiding empty, duff menus.
-               (unless (assoc menu-title index-alist)
-                 (push (list menu-title) index-alist))
-               (if imenu-use-markers
-                   (setq beg (copy-marker beg)))
-               (let ((item
-                      (if function
-                          (nconc (list (match-string-no-properties index)
-                                       beg function)
-                                 rest)
-                        (cons (match-string-no-properties index)
-                              beg)))
-                     ;; This is the desired submenu,
-                     ;; starting with its title (or nil).
-                     (menu (assoc menu-title index-alist)))
-                 ;; Insert the item unless it is already present.
-                 (unless (member item (cdr menu))
-                   (setcdr menu
-                           (cons item (cdr menu))))))))
+               (setq cs (and (or comment-start comment-start-skip)
+                             (save-match-data
+                               (comment-beginning))))
+               (if cs
+                   (goto-char (min cs beg)) ; skip this one, it's in a comment
+                 (goto-char beg)
+                 (imenu-progress-message prev-pos nil t)
+                 ;; Add this sort of submenu only when we've found an
+                 ;; item for it, avoiding empty, duff menus.
+                 (unless (assoc menu-title index-alist)
+                   (push (list menu-title) index-alist))
+                 (if imenu-use-markers
+                     (setq beg (copy-marker beg)))
+                 (let ((item
+                        (if function
+                            (nconc (list (match-string-no-properties index)
+                                         beg function)
+                                   rest)
+                          (cons (match-string-no-properties index)
+                                beg)))
+                       ;; This is the desired submenu,
+                       ;; starting with its title (or nil).
+                       (menu (assoc menu-title index-alist)))
+                   ;; Insert the item unless it is already present.
+                   (unless (member item (cdr menu))
+                     (setcdr menu
+                             (cons item (cdr menu)))))
+                 ;; Move to the start of the entire match,
+                 ;; to ensure we keep moving backwards
+                 ;; as long as the match is nonempty.
+                 (goto-char start)))))
          (set-syntax-table old-table)))
     (imenu-progress-message prev-pos 100 t)
     ;; Sort each submenu by position.
@@ -858,7 +884,7 @@ depending on PATTERNS."
 (defun imenu--completion-buffer (index-alist &optional prompt)
   "Let the user select from INDEX-ALIST in a completion buffer with PROMPT.
 
-Returns t for rescan and otherwise a position number."
+Return one of the entries in index-alist or nil."
   ;; Create a list for this buffer only when needed.
   (let ((name (thing-at-point 'symbol))
        choice
@@ -884,13 +910,11 @@ Returns t for rescan and otherwise a position number."
                                  prepared-index-alist
                                  nil t nil 'imenu--history-list name)))
 
-    (cond ((not (stringp name)) nil)
-         ((string= name (car imenu--rescan-item)) t)
-         (t
-          (setq choice (assoc name prepared-index-alist))
-          (if (imenu--subalist-p choice)
-              (imenu--completion-buffer (cdr choice) prompt)
-            choice)))))
+    (when (stringp name)
+      (setq choice (assoc name prepared-index-alist))
+      (if (imenu--subalist-p choice)
+         (imenu--completion-buffer (cdr choice) prompt)
+       choice))))
 
 (defun imenu--mouse-menu (index-alist event &optional title)
   "Let the user select from a buffer index from a mouse menu.
@@ -941,9 +965,9 @@ The returned value is of the form (INDEX-NAME . INDEX-POSITION)."
                     (or (eq imenu-use-popup-menu t) mouse-triggered))
                (imenu--mouse-menu index-alist last-nonmenu-event)
              (imenu--completion-buffer index-alist prompt)))
-      (and (eq result t)
+      (and (equal result imenu--rescan-item)
           (imenu--cleanup)
-          (setq imenu--index-alist nil)))
+          (setq result t imenu--index-alist nil)))
     result))
 
 ;;;###autoload
@@ -977,8 +1001,7 @@ A trivial interface to `imenu-add-to-menubar' suitable for use in a hook."
 (defvar imenu-buffer-menubar nil)
 
 (defvar imenu-menubar-modified-tick 0
-  "The value of (buffer-modified-tick) as of last call to `imenu-update-menubar'.
-This value becomes local in every buffer when it is set.")
+  "The value of (buffer-modified-tick) as of last call to `imenu-update-menubar'.")
 (make-variable-buffer-local 'imenu-menubar-modified-tick)
 
 (defun imenu-update-menubar ()
@@ -1019,7 +1042,7 @@ This value becomes local in every buffer when it is set.")
     nil))
 
 (defun imenu-default-goto-function (name position &optional rest)
-  "Move the point to the given position.
+  "Move to the given position.
 
 NAME is ignored.  POSITION is where to move.  REST is also ignored.
 The ignored args just make this function have the same interface as a
@@ -1059,5 +1082,5 @@ for more information."
 
 (provide 'imenu)
 
-;;; arch-tag: 98a2f5f5-4b91-4704-b18c-3aacf77d77a7
+;; arch-tag: 98a2f5f5-4b91-4704-b18c-3aacf77d77a7
 ;;; imenu.el ends here