org-latex-preview: Support symbol entrypoint args

* lisp/org-latex-preview.el (org-latex-preview): Refactor to support a
symbol-value "mode" argument as well as prefix arguments.  This stops
forcing programmatic invocations from having to use uninformative
values, and actually makes the implementation slightly nicer to read I
think.

* lisp/org.el: Change the argument in the preview startup invocation to 'buffer.
This commit is contained in:
TEC 2024-01-06 23:15:50 +08:00
parent 5e7af27352
commit 5dbe159407
Signed by: tec
SSH Key Fingerprint: SHA256:eobz41Mnm0/iYWBvWThftS0ElEs1ftBr6jamutnXc/A
2 changed files with 68 additions and 50 deletions

View File

@ -858,60 +858,78 @@ BEG and END are buffer positions."
beg end))
;;;###autoload
(defun org-latex-preview (&optional arg)
"Toggle preview of the LaTeX fragment at point.
(defun org-latex-preview (&optional mode)
"Generate or hide LaTeX fragment previews.
If the cursor is on a LaTeX fragment, create the image and
overlay it over the source code, if there is none. Remove it
otherwise. If there is no fragment at point, display images for
all fragments in the current section. With an active region,
display images for all fragments in the region.
The particular behaviour depends on MODE (which recognises a
number of symbols and prefix arguments), or when MODE is nil the
context of the current buffer when called.
With a `\\[universal-argument]' prefix argument ARG, clear images \
for all fragments
in the current section.
- point: Toggle preview of the LaTeX fragment at point
- region: Display previews of all fragments in the selected region
- section: Display previews of all fragments in the current section
- buffer: Display previews of all fragments in the buffer
- clear-region: Clear all previews in the current region
- clear-section: Clear all previews in the current section
- clear-buffer: Clear all previews in the buffer
With a `\\[universal-argument] \\[universal-argument]' prefix \
argument ARG, display image for all
fragments in the buffer.
When MODE is nil and the cursor is on a LaTeX fragment, toggle
previewing of the LaTeX fragment at point. If the there is no
preview, generate a preview and overlay it on the text. Remove
the preview image otherwise. If there is no fragment at point,
display previews for all fragments in the current section, or
active region should it exist.
With a `\\[universal-argument] \\[universal-argument] \
\\[universal-argument]' prefix argument ARG, clear image for all
fragments in the buffer."
Prefix arguments are handled as follows:
- `\\[universal-argument]' is equivalent to setting MODE to clear-region (if a region
is currently active) or clear-section
- `\\[universal-argument] \\[universal-argument]' is equivalent to setting MODE to buffer
- `\\[universal-argument] \\[universal-argument] \\[universal-argument]' is equivalent to setting MODE to clear-buffer
MODE can also be a org-element LaTeX environment or fragment, which
will be treated as \"point\"."
(interactive "P")
(cond
((not (display-graphic-p)) nil)
;; Clear whole buffer.
((equal arg '(64))
(org-latex-preview-clear-overlays (point-min) (point-max))
(message "LaTeX previews removed from buffer"))
;; Preview whole buffer.
((equal arg '(16))
(org-latex-preview--preview-region (point-min) (point-max)))
;; Clear current section.
((equal arg '(4))
(org-latex-preview-clear-overlays
(if (use-region-p)
(region-beginning)
(if (org-before-first-heading-p) (point-min)
(save-excursion
(org-with-limited-levels (org-back-to-heading t) (point)))))
(if (use-region-p)
(region-end)
(org-with-limited-levels (org-entry-end-position)))))
((use-region-p)
(org-latex-preview--preview-region (region-beginning) (region-end)))
;; Toggle preview on LaTeX code at point.
((let ((datum (org-element-context)))
(and (memq (org-element-type datum) '(latex-environment latex-fragment))
(org-latex-preview--auto-aware-toggle datum))))
;; Preview current section.
(t
(let ((beg (if (org-before-first-heading-p) (point-min)
(save-excursion
(org-with-limited-levels (org-back-to-heading t) (point)))))
(end (org-with-limited-levels (org-entry-end-position))))
(org-latex-preview--preview-region beg end)))))
(when (display-graphic-p)
(when (integerp (car-safe mode)) ; Prefix argument
(setq mode
(pcase (car mode)
(64 'clear-buffer)
(16 'buffer)
(4 (if (use-region-p) 'clear-region 'clear-section))
(_ (and (use-region-p) 'region)))))
(unless mode ; Auto, i.e. element at point or section
(setq mode (if-let ((datum (org-element-context))
((memq (org-element-type datum) '(latex-environment latex-fragment))))
datum 'section)))
(pcase mode
('buffer
(org-latex-preview--preview-region (point-min) (point-max)))
('clear-buffer
(org-latex-preview-clear-overlays (point-min) (point-max))
(message "LaTeX previews removed from buffer"))
('section
(let ((beg (if (org-before-first-heading-p) (point-min)
(save-excursion
(org-with-limited-levels (org-back-to-heading t) (point)))))
(end (org-with-limited-levels (org-entry-end-position))))
(org-latex-preview--preview-region beg end)))
('clear-section
(org-latex-preview-clear-overlays
(if (org-before-first-heading-p) (point-min)
(save-excursion
(org-with-limited-levels (org-back-to-heading t) (point))))
(org-with-limited-levels (org-entry-end-position))))
('region
(org-latex-preview--preview-region (region-beginning) (region-end)))
('clear-region
(org-latex-preview-clear-overlays (region-beginning) (region-end)))
('point
(when-let ((datum (org-element-context))
((memq (org-element-type datum) '(latex-environment latex-fragment))))
(org-latex-preview--auto-aware-toggle datum)))
((guard (memq (org-element-type mode) '(latex-environment latex-fragment)))
(org-latex-preview--auto-aware-toggle mode))
(bad-value (error "Invalid `org-latex-preview' mode argument: %S" bad-value)))))
(defun org-latex-preview--auto-aware-toggle (datum)
"Toggle the preview of the LaTeX fragment/environment DATUM.

View File

@ -4802,7 +4802,7 @@ The following commands are available:
(org-unmodified
(when org-startup-with-beamer-mode (org-beamer-mode))
(when org-startup-with-inline-images (org-display-inline-images))
(when org-startup-with-latex-preview (org-latex-preview '(16)))
(when org-startup-with-latex-preview (org-latex-preview 'buffer))
(unless org-inhibit-startup-visibility-stuff (org-cycle-set-startup-visibility))
(when org-startup-truncated (setq truncate-lines t))
(when org-startup-numerated (require 'org-num) (org-num-mode 1))