org-latex-preview: Add ignored auto environments

* lisp/org-latex-preview.el (org-latex-preview-live--src-buffer-setup,
org-latex-preview-auto--maybe-track-element-here,
org-latex-preview-auto-ignored-environments): Introduce a new
customisation variable `org-latex-preview-auto-ignored-environments',
for specifying environments that should not be automatically previewed.
This commit is contained in:
TEC 2024-01-07 21:54:01 +08:00
parent 2ca8200554
commit 988e24b254
Signed by: tec
SSH Key Fingerprint: SHA256:eobz41Mnm0/iYWBvWThftS0ElEs1ftBr6jamutnXc/A
1 changed files with 90 additions and 72 deletions

View File

@ -249,6 +249,12 @@ There are three recognised value symbols:
(const :tag "Fringe marker" fringe) (const :tag "Fringe marker" fringe)
(const :tag "Processing face" face))) (const :tag "Processing face" face)))
(defcustom org-latex-preview-auto-ignored-environments '("figure")
"List of LaTeX environments that should not be automatically previewed."
:type '(repeat string)
:package-version '(Org . "9.7")
:group 'org-latex-preview)
(defcustom org-latex-preview-auto-ignored-commands nil (defcustom org-latex-preview-auto-ignored-commands nil
"List of movement commands that should not affect preview display. "List of movement commands that should not affect preview display.
@ -716,6 +722,12 @@ If an org-latex-overlay is already present, nothing is done."
(if (eq (char-before (org-element-property :end element)) (if (eq (char-before (org-element-property :end element))
?\n) ?\n)
1 0))) 1 0)))
((not (and (eq type 'latex-environment)
(save-excursion
(goto-char elem-beg)
(looking-at "\\\\begin{\\([^}]+\\)}"))
(member (match-string 1)
org-latex-preview-auto-ignored-environments))))
(ov (org-latex-preview--ensure-overlay elem-beg elem-end))) (ov (org-latex-preview--ensure-overlay elem-beg elem-end)))
(overlay-put ov 'preview-state 'modified) (overlay-put ov 'preview-state 'modified)
(if (<= elem-beg pos elem-end) (if (<= elem-beg pos elem-end)
@ -1113,8 +1125,6 @@ This is meant to be called via `org-src-mode-hook'."
(let* ((org-buf (marker-buffer org-src--beg-marker)) (let* ((org-buf (marker-buffer org-src--beg-marker))
(src-buf (current-buffer)) (src-buf (current-buffer))
(org-buf-visible-p (window-live-p (get-buffer-window org-buf))) (org-buf-visible-p (window-live-p (get-buffer-window org-buf)))
preamble
element
;; Do not use (org-element-property :begin element) to ;; Do not use (org-element-property :begin element) to
;; find the bounds -- this is fragile under typos. ;; find the bounds -- this is fragile under typos.
(beg (save-excursion (goto-char (point-min)) (beg (save-excursion (goto-char (point-min))
@ -1123,18 +1133,26 @@ This is meant to be called via `org-src-mode-hook'."
(end (save-excursion (goto-char (point-max)) (end (save-excursion (goto-char (point-max))
(skip-chars-backward "\n \t\r") (skip-chars-backward "\n \t\r")
(point))) (point)))
(numbering-offsets) (ov) (orig-ov)) preamble element skip-env-p numbering-offsets ov orig-ov)
(setq org-latex-preview-auto--marker (point-marker)) (setq org-latex-preview-auto--marker (point-marker))
;; Copy the LaTeX preview overlay from the source Org buffer ;; Copy the LaTeX preview overlay from the source Org buffer
;; into the org-src buffer and show a preview image over the ;; into the org-src buffer and show a preview image over the
;; former: ;; former:
(with-current-buffer org-buf (with-current-buffer org-buf
(setq element (org-element-context)) (setq element (org-element-context))
(when (setq orig-ov (when (eq (org-element-type element) 'latex-environment)
(let ((props (get-char-property-and-overlay (setq skip-env-p
(point) 'org-overlay-type))) (and (save-excursion
(and (eq (car props) 'org-latex-overlay) (goto-char (or (org-element-property :post-affiliated element)
(cdr props)))) (org-element-property :begin element)))
(looking-at "\\\\begin{\\([^}]+\\)}"))
(member (match-string 1) org-latex-preview-auto-ignored-environments))))
(when (and (not skip-env-p)
(setq orig-ov
(let ((props (get-char-property-and-overlay
(point) 'org-overlay-type)))
(and (eq (car props) 'org-latex-overlay)
(cdr props)))))
(org-latex-preview-live--clearout orig-ov) (org-latex-preview-live--clearout orig-ov)
(setq ov (copy-overlay orig-ov) (setq ov (copy-overlay orig-ov)
preamble (or org-latex-preview--preamble-content preamble (or org-latex-preview--preamble-content
@ -1143,74 +1161,74 @@ This is meant to be called via `org-src-mode-hook'."
(overlay-put ov 'view-text t) (overlay-put ov 'view-text t)
(move-overlay ov beg end src-buf)) (move-overlay ov beg end src-buf))
(org-latex-preview-auto--close-previous-overlay)) (org-latex-preview-auto--close-previous-overlay))
(unless skip-env-p
(or ov (setq ov (org-latex-preview--ensure-overlay beg end)))
;; Adjust numbering if required
(when (and org-latex-preview-numbered
(eq (org-element-type element) 'latex-environment))
(with-current-buffer org-buf
(when-let ((numbering-table (org-latex-preview--environment-numbering-table)))
(setq numbering-offsets (list (gethash element numbering-table))))))
(or ov (setq ov (org-latex-preview--ensure-overlay beg end))) (when (buffer-local-value 'org-latex-preview-live org-buf)
;; Adjust numbering if required (if org-buf-visible-p
(when (and org-latex-preview-numbered ;; Source Org buffer is visible: display live previews
(eq (org-element-type element) 'latex-environment)) ;; over the fragment there
(with-current-buffer org-buf (progn
(when-let ((numbering-table (org-latex-preview--environment-numbering-table))) (setq-local org-latex-preview-live--generator
(setq numbering-offsets (list (gethash element numbering-table)))))) (thread-first
(lambda (&rest _)
(when (buffer-local-value 'org-latex-preview-live org-buf) (let* ((content
(if org-buf-visible-p (string-trim (buffer-substring-no-properties
;; Source Org buffer is visible: display live previews (point-min) (point-max)))))
;; over the fragment there (with-current-buffer org-buf
(progn (org-latex-preview-place
(setq-local org-latex-preview-live--generator org-latex-preview-process-default
(thread-first (list (list (overlay-start orig-ov)
(lambda (&rest _) (overlay-end orig-ov)
(let* ((content content))
(string-trim (buffer-substring-no-properties numbering-offsets))))
(point-min) (point-max)))))
(with-current-buffer org-buf
(org-latex-preview-place
org-latex-preview-process-default
(list (list (overlay-start orig-ov)
(overlay-end orig-ov)
content))
numbering-offsets))))
(org-latex-preview-live--throttle) (org-latex-preview-live--throttle)
(org-latex-preview-live--debounce (org-latex-preview-live--debounce
org-latex-preview-live-debounce))) org-latex-preview-live-debounce)))
(add-hook 'after-change-functions org-latex-preview-live--generator 90 'local)) (add-hook 'after-change-functions org-latex-preview-live--generator 90 'local))
;; Source Org buffer not visible: display live previews in org-src buffer ;; Source Org buffer not visible: display live previews in org-src buffer
;; Set the element type ahead of time since we cannot call ;; Set the element type ahead of time since we cannot call
;; org-element-context in the org-src buffer ;; org-element-context in the org-src buffer
(setq org-latex-preview-live--element-type (setq org-latex-preview-live--element-type
(with-current-buffer org-buf (with-current-buffer org-buf
(or (and (string-prefix-p (or (and (string-prefix-p
"\\[" (org-element-property :value element)) "\\[" (org-element-property :value element))
'latex-environment) 'latex-environment)
(org-element-type element)))) (org-element-type element))))
;; Show live preview if available ;; Show live preview if available
(org-latex-preview-live--ensure-overlay ov) (org-latex-preview-live--ensure-overlay ov)
;; Set up hooks for live preview updates in the org-src buffer ;; Set up hooks for live preview updates in the org-src buffer
(add-hook 'org-latex-preview-overlay-update-functions (add-hook 'org-latex-preview-overlay-update-functions
#'org-latex-preview-live--update-overlay #'org-latex-preview-live--update-overlay
nil 'local) nil 'local)
(setq-local org-latex-preview-live--generator (setq-local org-latex-preview-live--generator
(thread-first (thread-first
(lambda (&rest _) (lambda (&rest _)
(org-latex-preview-place (org-latex-preview-place
org-latex-preview-process-default org-latex-preview-process-default
(list (list (save-excursion (goto-char (point-min)) (list (list (save-excursion (goto-char (point-min))
(skip-chars-forward "\n \t\r") (skip-chars-forward "\n \t\r")
(point)) (point))
(save-excursion (goto-char (point-max)) (save-excursion (goto-char (point-max))
(skip-chars-backward "\n \t\r") (skip-chars-backward "\n \t\r")
(point)))) (point))))
numbering-offsets preamble)) numbering-offsets preamble))
(org-latex-preview-live--throttle) (org-latex-preview-live--throttle)
(org-latex-preview-live--debounce (org-latex-preview-live--debounce
org-latex-preview-live-debounce))) org-latex-preview-live-debounce)))
(add-hook 'org-latex-preview-overlay-open-functions #'org-latex-preview-live--ensure-overlay nil 'local) (add-hook 'org-latex-preview-overlay-open-functions #'org-latex-preview-live--ensure-overlay nil 'local)
(add-hook 'org-latex-preview-overlay-close-functions #'org-latex-preview-live--clearout nil 'local) (add-hook 'org-latex-preview-overlay-close-functions #'org-latex-preview-live--clearout nil 'local)
(add-hook 'after-change-functions org-latex-preview-live--generator 90 'local))) (add-hook 'after-change-functions org-latex-preview-live--generator 90 'local)))
;; Turn on auto-mode behavior in the org-src buffer ;; Turn on auto-mode behavior in the org-src buffer
(add-hook 'pre-command-hook #'org-latex-preview-auto--handle-pre-cursor nil 'local) (add-hook 'pre-command-hook #'org-latex-preview-auto--handle-pre-cursor nil 'local)
(add-hook 'post-command-hook #'org-latex-preview-auto--handle-post-cursor nil 'local)))) (add-hook 'post-command-hook #'org-latex-preview-auto--handle-post-cursor nil 'local)))))
;; Eldoc support for live previews ;; Eldoc support for live previews
(defun org-latex-preview-live--display-in-eldoc (callback) (defun org-latex-preview-live--display-in-eldoc (callback)