docview: imenu: check return value of 'mutool'
While 'mutool' supports many filetypes, 'mutool show' only supports PDF files. This would lead to cryptic imenu errors when opening other file types (like EPUB) since we would parse the error output. During my testing this caused 'imenu--index-alist' to have a value of '(nil). * lisp/doc-view.el (doc-view--pdf-outline): Error when 'mutool' returns an error. Use 'call-process' to get the return value and remove the call to 'shell-quote-argument' as 'call-process' doesn't want any escapes. (doc-view-mode): Handle possible error from 'doc-view-imenu-setup'. (doc-view-imenu-enabled): Remove superfluous (and ... t). (doc-view-imenu-setup): Remove check for mutool already ensured by 'doc-view-imenu-enabled' being non-nil. (Bug#64516)
This commit is contained in:
parent
3c041e3e96
commit
65108998b1
1 changed files with 11 additions and 5 deletions
|
@ -147,6 +147,8 @@
|
|||
(require 'filenotify)
|
||||
(eval-when-compile (require 'subr-x))
|
||||
|
||||
(autoload 'imenu-unavailable-error "imenu")
|
||||
|
||||
;;;; Customization Options
|
||||
|
||||
(defgroup doc-view nil
|
||||
|
@ -214,7 +216,7 @@ are available (see Info node `(emacs)Document View')."
|
|||
:type 'boolean
|
||||
:version "30.1")
|
||||
|
||||
(defcustom doc-view-imenu-enabled (and (executable-find "mutool") t)
|
||||
(defcustom doc-view-imenu-enabled (executable-find "mutool")
|
||||
"Whether to generate an imenu outline when \"mutool\" is available."
|
||||
:type 'boolean
|
||||
:version "29.1")
|
||||
|
@ -1910,9 +1912,10 @@ structure is extracted by `doc-view--imenu-subtree'."
|
|||
(let ((fn (or file-name (buffer-file-name))))
|
||||
(when fn
|
||||
(let ((outline nil)
|
||||
(fn (shell-quote-argument (expand-file-name fn))))
|
||||
(fn (expand-file-name fn)))
|
||||
(with-temp-buffer
|
||||
(insert (shell-command-to-string (format "mutool show %s outline" fn)))
|
||||
(unless (= 0 (call-process "mutool" nil (current-buffer) nil "show" fn "outline"))
|
||||
(imenu-unavailable-error "Unable to create imenu index using `mutool'"))
|
||||
(goto-char (point-min))
|
||||
(while (re-search-forward doc-view--outline-rx nil t)
|
||||
(push `((level . ,(length (match-string 1)))
|
||||
|
@ -1961,7 +1964,7 @@ GOTO-PAGE-FN other than `doc-view-goto-page'."
|
|||
|
||||
(defun doc-view-imenu-setup ()
|
||||
"Set up local state in the current buffer for imenu, if needed."
|
||||
(when (and doc-view-imenu-enabled (executable-find "mutool"))
|
||||
(when doc-view-imenu-enabled
|
||||
(setq-local imenu-create-index-function #'doc-view-imenu-index
|
||||
imenu-submenus-on-top nil
|
||||
imenu-sort-function nil
|
||||
|
@ -2236,7 +2239,10 @@ toggle between displaying the document or editing it as text.
|
|||
(setq mode-name "DocView"
|
||||
buffer-read-only t
|
||||
major-mode 'doc-view-mode)
|
||||
(doc-view-imenu-setup)
|
||||
(condition-case imenu-error
|
||||
(doc-view-imenu-setup)
|
||||
(imenu-unavailable (message "imenu support unavailable: %s"
|
||||
(cadr imenu-error))))
|
||||
(doc-view-initiate-display)
|
||||
;; Switch off view-mode explicitly, because doc-view-mode is the
|
||||
;; canonical view mode for PDF/PS/DVI files. This could be
|
||||
|
|
Loading…
Add table
Reference in a new issue