;;; Code:
-(require 'newcomment)
-
(eval-when-compile (require 'cl))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;###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.
(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)
(index (nth 2 pat))
(function (nth 3 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)
+ (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))
- (if (setq cs (save-match-data (comment-beginning)))
- (goto-char cs) ; skip this one, it's in a comment
+ (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
;; Insert the item unless it is already present.
(unless (member item (cdr menu))
(setcdr menu
- (cons item (cdr 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.