summaryrefslogtreecommitdiff
path: root/lisp/imenu.el
diff options
context:
space:
mode:
authorKarl Heuer <kwzh@gnu.org>1998-09-30 19:21:01 +0000
committerKarl Heuer <kwzh@gnu.org>1998-09-30 19:21:01 +0000
commitc01ee596b5946168f30e5c37b7ac368be6e6564c (patch)
tree7cfec4799aeda2598590f20ea7f742b6d4747fe0 /lisp/imenu.el
parent2a1c4b9034d07d3e939714e8dc7c1fc4523bb941 (diff)
downloademacs-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.el28
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)))))