From a434024c4e452b4f2495921832b00e801568939e Mon Sep 17 00:00:00 2001 From: Jose A Ortega Ruiz Date: Wed, 28 Sep 2022 03:02:57 +0100 Subject: [PATCH] docview: new customization options for imenu * doc/emacs/misc.texi (DocView Navigation): * lisp/doc-view.el (doc-view-imenu-title-format, doc-view-imenu-flatten): (doc-view--imenu-subtree): customizable format for imenu entry titles, and flag to disable nested submenus. * lisp/doc-view.el (doc-view--pdf-outline): clean up whitespace markers '\r' and '\t' in imenu item titles. --- doc/emacs/misc.texi | 9 +++++++-- lisp/doc-view.el | 29 +++++++++++++++++++++++++---- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/doc/emacs/misc.texi b/doc/emacs/misc.texi index 04f7f2e921..cef2580f3b 100644 --- a/doc/emacs/misc.texi +++ b/doc/emacs/misc.texi @@ -585,11 +585,16 @@ DocView Navigation @code{doc-view-resolution}. @vindex doc-view-imenu-enabled +@vindex doc-view-imenu-flatten +@vindex doc-view-imenu-format When the @command{mutool} program is available, DocView will use it to generate entries for an outline menu, making it accessible via the @code{imenu} facility (@pxref{Imenu}). To disable this functionality -even when @command{mutool} can be found on your system, customize -the variable @code{doc-view-imenu-enabled} to the @code{nil} value. +even when @command{mutool} can be found on your system, customize the +variable @code{doc-view-imenu-enabled} to the @code{nil} value. You +can further customize how @code{imenu} items are formatted and +displayed using the variables @code{doc-view-imenu-format} and +@code{doc-view-flatten}. @node DocView Searching @subsection DocView Searching diff --git a/lisp/doc-view.el b/lisp/doc-view.el index fa583df12b..9e3bb6e46c 100644 --- a/lisp/doc-view.el +++ b/lisp/doc-view.el @@ -219,6 +219,23 @@ doc-view-imenu-enabled :type 'boolean :version "29.1") +(defcustom doc-view-imenu-title-format "%t (%p)" + "Format string for document section titles in imenu. + +The special markers '%t' and '%p' are replaced by the section +title and page number in this format string, which uses +`format-spec'. + +For instance, setting this variable to \"%t\" will produce items +showing only titles and no page number." + :type 'string + :version "29.1") + +(defcustom doc-view-imenu-flatten nil + "Whether to generate a flat list of sections instead of a nested tree." + :type 'boolean + :version "29.1") + (defcustom doc-view-svg-background "white" "Background color for svg images. See `doc-view-mupdf-use-svg'." @@ -1898,7 +1915,8 @@ doc-view--pdf-outline (goto-char (point-min)) (while (re-search-forward doc-view--outline-rx nil t) (push `((level . ,(length (match-string 1))) - (title . ,(match-string 2)) + (title . ,(replace-regexp-in-string "\\\\[rt]" " " + (match-string 2))) (page . ,(string-to-number (match-string 3)))) outline))) (nreverse outline))) @@ -1911,11 +1929,14 @@ doc-view--imenu-subtree level. Returns that imenu alist together with any other pending outline entries at an upper level." (let ((level (alist-get 'level (car outline))) + (nested (not doc-view-imenu-flatten)) (index nil)) - (while (and (car outline) (<= level (alist-get 'level (car outline)))) + (while (and (car outline) + (or nested (<= level (alist-get 'level (car outline))))) (let-alist (car outline) - (let ((title (format "%s (%s)" .title .page))) - (if (> .level level) + (let ((title (format-spec doc-view-imenu-title-format + `((?t . ,.title) (?p . ,.page))))) + (if (and nested (> .level level)) (let ((sub (doc-view--imenu-subtree outline act)) (fst (car index))) (setq index (cdr index)) -- 2.37.2