diff options
author | Karl Heuer <kwzh@gnu.org> | 1998-09-30 19:21:01 +0000 |
---|---|---|
committer | Karl Heuer <kwzh@gnu.org> | 1998-09-30 19:21:01 +0000 |
commit | c01ee596b5946168f30e5c37b7ac368be6e6564c (patch) | |
tree | 7cfec4799aeda2598590f20ea7f742b6d4747fe0 /lisp/imenu.el | |
parent | 2a1c4b9034d07d3e939714e8dc7c1fc4523bb941 (diff) | |
download | emacs-c01ee596b5946168f30e5c37b7ac368be6e6564c.tar.gz |
(imenu--generic-function): Sort each submenu by position.
(imenu--sort-by-position): New function.
Diffstat (limited to 'lisp/imenu.el')
-rw-r--r-- | lisp/imenu.el | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/lisp/imenu.el b/lisp/imenu.el index 3b062dedd39..2f353e111ec 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))))) |