From c01ee596b5946168f30e5c37b7ac368be6e6564c Mon Sep 17 00:00:00 2001 From: Karl Heuer Date: Wed, 30 Sep 1998 19:21:01 +0000 Subject: [PATCH] (imenu--generic-function): Sort each submenu by position. (imenu--sort-by-position): New function. --- lisp/imenu.el | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/lisp/imenu.el b/lisp/imenu.el index 3b062dedd3..2f353e111e 100644 --- a/lisp/imenu.el +++ b/lisp/imenu.el @@ -128,7 +128,7 @@ in the buffer. 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 @@ This variable is local in all buffers, once set.") ;;; ;;; 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 @@ PATTERNS." 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))))) -- 2.20.1