Daniel Colascione <danc at merrillpress.com>
(which-func-imenu-joiner-function): New. (which-function): Handle nested imenu trees.
This commit is contained in:
parent
c27c178cd2
commit
fd1c81ef84
1 changed files with 38 additions and 19 deletions
|
@ -152,6 +152,12 @@ Zero means compute the Imenu menu regardless of size."
|
|||
:type 'sexp)
|
||||
;;;###autoload (put 'which-func-format 'risky-local-variable t)
|
||||
|
||||
(defvar which-func-imenu-joiner-function #'last
|
||||
"Function to call when using imenu to join together multiple
|
||||
levels of nomenclature. Called with a single argument, a list of
|
||||
strings giving the names of the menus we had to traverse to get
|
||||
to the item. Return a single string, the new name of the item.")
|
||||
|
||||
(defvar which-func-cleanup-function nil
|
||||
"Function to transform a string before displaying it in the mode line.
|
||||
The function is called with one argument, the string to display.
|
||||
|
@ -281,25 +287,38 @@ If no function name is found, return nil."
|
|||
(boundp 'imenu--index-alist) imenu--index-alist)
|
||||
(let ((alist imenu--index-alist)
|
||||
(minoffset (point-max))
|
||||
offset elem pair mark)
|
||||
(while alist
|
||||
(setq elem (car-safe alist)
|
||||
alist (cdr-safe alist))
|
||||
;; Elements of alist are either ("name" . marker), or
|
||||
;; ("submenu" ("name" . marker) ... ).
|
||||
(unless (listp (cdr elem))
|
||||
(setq elem (list elem)))
|
||||
(while elem
|
||||
(setq pair (car elem)
|
||||
elem (cdr elem))
|
||||
(and (consp pair)
|
||||
(number-or-marker-p (setq mark (cdr pair)))
|
||||
(if (>= (setq offset (- (point) mark)) 0)
|
||||
(if (< offset minoffset) ; find the closest item
|
||||
(setq minoffset offset
|
||||
name (car pair)))
|
||||
;; Entries in order, so can skip all those after point.
|
||||
(setq elem nil)))))))
|
||||
offset pair mark imstack namestack)
|
||||
;; Elements of alist are either ("name" . marker), or
|
||||
;; ("submenu" ("name" . marker) ... ). The list can be
|
||||
;; arbitrarily nested.
|
||||
(while (or alist imstack)
|
||||
(if alist
|
||||
(progn
|
||||
(setq pair (car-safe alist)
|
||||
alist (cdr-safe alist))
|
||||
|
||||
(cond ((atom pair)) ; skip anything not a cons
|
||||
|
||||
((imenu--subalist-p pair)
|
||||
(setq imstack (cons alist imstack)
|
||||
namestack (cons (car pair) namestack)
|
||||
alist (cdr pair)))
|
||||
|
||||
((number-or-marker-p (setq mark (cdr pair)))
|
||||
(if (>= (setq offset (- (point) mark)) 0)
|
||||
(if (< offset minoffset) ; find the closest item
|
||||
(setq minoffset offset
|
||||
name (funcall
|
||||
which-func-imenu-joiner-function
|
||||
(reverse (cons (car pair) namestack)))))
|
||||
;; Entries in order, so can skip all those after point.
|
||||
(setq alist nil
|
||||
imstack nil)))))
|
||||
|
||||
(setq alist (car imstack)
|
||||
namestack (cdr namestack)
|
||||
imstack (cdr imstack))))))
|
||||
|
||||
;; Try using add-log support.
|
||||
(when (and (null name) (boundp 'add-log-current-defun-function)
|
||||
add-log-current-defun-function)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue