# HG changeset patch # User Karl Heuer # Date 907183261 0 # Node ID 3812bb3ae00622c247857a0cd87fe1402fbceed7 # Parent 856a82c440faa9fce144952a7dd39e06610f4e56 (imenu--generic-function): Sort each submenu by position. (imenu--sort-by-position): New function. diff -r 856a82c440fa -r 3812bb3ae006 lisp/imenu.el --- a/lisp/imenu.el Wed Sep 30 19:20:04 1998 +0000 +++ b/lisp/imenu.el Wed Sep 30 19:21:01 1998 +0000 @@ -128,7 +128,7 @@ Set it to `imenu--sort-by-name' if you want alphabetic sorting. -The function should take two arguments and return T if the first +The function should take two arguments and return t if the first element should come before the second. The arguments are cons cells; \(NAME . POSITION). Look at `imenu--sort-by-name' for an example." :type '(choice (const :tag "No sorting" nil) @@ -443,11 +443,14 @@ ;;; ;;; Sort function ;;; Sorts the items depending on their index name. -;;; An item look like (NAME . POSITION). +;;; An item looks like (NAME . POSITION). ;;; (defun imenu--sort-by-name (item1 item2) (string-lessp (car item1) (car item2))) +(defun imenu--sort-by-position (item1 item2) + (< (cdr item1) (cdr item2))) + (defun imenu--relative-position (&optional reverse) ;; Support function to calculate relative position in buffer ;; Beginning of buffer is 0 and end of buffer is 100 @@ -814,15 +817,24 @@ rest) (cons (match-string-no-properties index) beg))) - (menu (cdr (assoc menu-title index-alist)))) - ;; avoid duplicates from, e.g. cc-mode patterns - (unless (member item menu) - ;; insert the item after the (sub-)menu title - (setcdr (assoc menu-title index-alist) - (cons item menu)))))))) + ;; 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))))))))) patterns) (set-syntax-table old-table))) (imenu-progress-message prev-pos 100 t) + ;; Sort each submenu by position. + ;; This is in case one submenu gets items from two different regexps. + (let ((tail index-alist)) + (while tail + (if (listp (car tail)) + (setcdr (car tail) + (sort (cdr (car tail)) 'imenu--sort-by-position))) + (setq tail (cdr tail)))) (let ((main-element (assq nil index-alist))) (nconc (delq main-element (delq 'dummy index-alist)) (cdr main-element)))))