]> code.delx.au - gnu-emacs/blobdiff - lisp/imenu.el
Much whitespace and capitalization change.
[gnu-emacs] / lisp / imenu.el
index 6859c0c74c7759b31eb0792216edf8fee89559cd..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.
@@ -298,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)))))
+)
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -734,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.
 
@@ -763,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."
 
@@ -789,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)
@@ -796,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.