With a file like this: * headline 1 ** headline 2
We currently produce an imenu tree that looks like this: '(("headline 1" ("headline 2" . marker-2))) imenu has no clue where "headline 1" is located and thus the user can't navigate to it. With this patch installed imenu knows where non-leaf headlines are as the tree will now look like this: '(("headline 1" . marker-1) ("headline 1" ("headline 2" . marker-2))) Quirks: With the default `imenu-flatten' value of nil, it is still impossible to visit non-leaf headlines and no change is perceived. Setting `imenu-flatten' to 'group works as expected with the quirk that top level headlines don't end up in the group. Ex: * Headline 1 Group is "*" Setting the group to "Headline 1" somehow might be nice but would require upstream changes in imenu. ** Headline 2 Group is "Headline 1" *** Headline 3 Group is "Headline 1:Headline 2" Everything seems to work as expected when `imenu-flatten' is set to 'prefix or 'annotation. * lisp/org-compat.el (org-imenu-get-tree): Add the current headline to the tree as a simple item even if it isn't a leaf. --- lisp/org-compat.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lisp/org-compat.el b/lisp/org-compat.el index d6620f962..a1152186d 100644 --- a/lisp/org-compat.el +++ b/lisp/org-compat.el @@ -1447,8 +1447,8 @@ This also applied for speedbar access." (let* ((m (point-marker)) (item (propertize headline 'org-imenu-marker m 'org-imenu t))) (push m org-imenu-markers) - (if (>= level last-level) - (push (cons item m) (aref subs level)) + (push (cons item m) (aref subs level)) + (unless (>= level last-level) (push (cons item (cl-mapcan #'identity (cl-subseq subs (1+ level)))) (aref subs level)) -- 2.45.1