auctex
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: TeX-documentation-texdoc


From: Greg Bognar
Subject: Re: TeX-documentation-texdoc
Date: Tue, 24 Jan 2023 09:50:31 +0100

Great, it works now!  It opens the requested file in the viewer and gives an
error message if it does not exist.  (Well, it often opens a file even if I give
it a nonsensical string, like "ddddd", which opens the documentation for
baskervaldadf -- but I assume that's a texdoc thing.)

All the best,
Greg

-------------------------------------------------------------------------------
On Tue 24 Jan 2023 at 06:27 Ikumi Keita wrote:
> >>>>> Greg Bognar <greg.bognar@startmail.com> writes:
> > 1. Unfortunately, the new function definition below does not work with
> > okular. Same problem as before.
> 
> Too bad. :-)
> 
> > 2. All of the environment variables PDFVIEWER, PDFVIEWER_texdoc,
> > TEXDOCVIEW_pdf, and TEXDOC_VIEWER_PDF have an empty value.
> 
> Thank you. It seems that the reported behavior originates from okular's
> own nature.
> 
> Then can you test the code at the last of this message?
> 
> [Rationale] The reason that `TeX-documentation-texdoc' tries hard to
> collect and show the output from Texdoc is that the exit code wasn't
> meaningful once[1]. However, recent Texdoc is improved to return
> non-zero exit code when it can't find documentation for the given
> keyword[2].
> 
> Thus I think that AUCTeX need not collect the output now; it just has to
> look at the exit code. We can use `call-process' (with `executable-find'
> test in case that Texdoc isn't available) to run Texdoc.
> 
> This has a drawback that the user who sticks to older TeX Live
> distribution isn't notified at all when the given keyword didn't match
> any documentation, but I expect it's permissible. Mosè, what do you
> think about it?
> 
> Regards,
> Ikumi Keita
> #StandWithUkraine #StopWarInUkraine
> 
> [1] https://debbugs.gnu.org/cgi/bugreport.cgi?bug=28905#17
> [2] https://tug.org/texdoc/doc/texdoc.man1.pdf
> 
> ----------------------------------------------------------------------
> (defun TeX-documentation-texdoc (&optional arg)
>   "Run texdoc to read documentation.
> 
> Prompt for selection of the package of which to show the documentation.
> 
> If called with a prefix argument ARG, after selecting the
> package, prompt for selection of the manual of that package to
> show."
>   (interactive "P")
>   (let ((pkg (thing-at-point 'symbol))
>         buffer list doc)
>     ;; Strip off properties.  XXX: XEmacs doesn't have
>     ;; `substring-no-properties'.
>     (set-text-properties 0 (length pkg) nil pkg)
>     (setq pkg (TeX-read-string "View documentation for: " pkg))
>     (unless (zerop (length pkg))
>       (if arg
>           ;; Called with prefix argument: run "texdoc --list --nointeract 
> <pkg>"
>           (progn
>             ;; Create the buffer, insert the result of the command, and
>             ;; accumulate the list of manuals.
>             (with-current-buffer (get-buffer-create
>                                   (setq buffer (format "*texdoc: %s*" pkg)))
>               (erase-buffer)
>               (insert (shell-command-to-string
>                        (concat "texdoc --list --nointeract " pkg)))
>               (goto-char 1)             ; No need to use `point-min' here.
>               (save-excursion
>                 (while (re-search-forward
>                         ;; XXX: XEmacs doesn't support character classes in
>                         ;; regexps, like "[:alnum:]".
>                         "^ *\\([0-9]+\\) +\\([-~/a-zA-Z0-9_.${}#%,:\\ 
> ()]+\\)" nil t)
>                   (push (cons (match-string 1) (match-string 2)) list))))
>             (unwind-protect
>                 (cond
>                  ((null (executable-find "texdoc"))
>                   ;; Note: `shell-command-to-string' uses shell, only
>                   ;; `call-process' looks at `exec-path', thus only here makes
>                   ;; sense to use `executable-find' to test whether texdoc is
>                   ;; available.
>                   (message "texdoc not found"))
>                  (list
>                   ;; Go on if there are manuals listed: show the buffer, 
> prompt
>                   ;; for the number of the manual, then run
>                   ;;     texdoc --just-view <doc>
>                   (TeX-pop-to-buffer (get-buffer buffer))
>                   (condition-case nil
>                       (when (setq doc
>                                   (cdr (assoc (TeX-read-string "Please enter \
> the number of the file to view, anything else to skip: ") list)))
>                         (call-process "texdoc" nil 0 nil "--just-view" doc))
>                     ;; Exit gently if a `quit' signal is thrown.
>                     (quit nil)))
>                  (t (message "No documentation found for %s" pkg)))
>               ;; In any case quit-and-kill the window.
>               (when (get-buffer-window buffer)
>                 (quit-window t (get-buffer-window buffer)))))
>         ;; Called without prefix argument: just run "texdoc --view <pkg>".
>         ;; The folowing code to the end of `defun' used to be just
>         ;; (message "%s" (shell-command-to-string (concat "texdoc --view " 
> pkg)))
>         ;; , but in some cases it blocks emacs until the user
>         ;; quits the viewer (bug#28905).
>         ;; (2023-01-24) Now we use `call-process' instead of
>         ;; `start-process-shell-command'.  This can introduce
>         ;; discrepancy in the process environment, especially PATH.
>         ;; But we need to do so to support both okular and evince.  We
>         ;; hope that it doesn't cause major problem.
>         (if (executable-find "texdoc")
>             ;; Recent Texdoc returns exit code 3 when it can't find the
>             ;; specified document, according to
>             ;; <URL:https://tug.org/texdoc/doc/texdoc.man1.pdf>
>             (if (= (call-process "texdoc" nil nil nil "--view" pkg) 3)
>                 (message "No documentation found for %s" pkg))
>           (message "texdoc not found"))))))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]