From 4e623d4593c81773d0129b7adaab21440bc293f8 Mon Sep 17 00:00:00 2001 From: TEC Date: Tue, 7 Feb 2023 02:42:04 +0800 Subject: [PATCH] org-latex-preview: Rework auto toggle behaviour * lisp/org-latex-preview.el (org-latex-preview--auto-aware-toggle): Adjust the toggle behaviour to hopefully behave more intuitively. --- lisp/org-latex-preview.el | 62 ++++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 27 deletions(-) diff --git a/lisp/org-latex-preview.el b/lisp/org-latex-preview.el index 7aff89e3f..f80db6958 100644 --- a/lisp/org-latex-preview.el +++ b/lisp/org-latex-preview.el @@ -880,38 +880,46 @@ fragments in the buffer." "Toggle the preview of the LaTeX fragment/environment DATUM. This is done with care to work nicely with `org-latex-preview-auto-mode', should it be enabled." - (let ((beg (org-element-property :begin datum)) - (end (org-element-property :end datum))) + (let* ((beg (org-element-property :begin datum)) + (end (org-element-property :end datum)) + (ov (cl-some + (lambda (o) + (and (eq (overlay-get o 'org-overlay-type) + 'org-latex-overlay) + o)) + (overlays-at beg)))) ;; If using auto-mode, an overlay will already exist but ;; not be showing an image. We can detect this ;; situtation via the preview-state overlay property, and ;; in such cases the most reasonable action is to just ;; (re)generate the preview image. - (pcase (cl-some - (lambda (o) - (and (eq (overlay-get o 'org-overlay-type) - 'org-latex-overlay) - o)) - (overlays-at beg)) - ;; When not using auto-mode, or there is no overlay. - ((or (pred not) (guard (not org-latex-preview-auto-mode))) - (if (org-latex-preview-clear-overlays beg end) - (message "LaTeX preview removed") - (org-latex-preview--preview-region beg end))) - ;; When on a just written/edited fragment that should be previewed. - ((and ov (guard (eq (overlay-get ov 'preview-state) 'modified))) - (org-latex-preview-auto--regenerate-overlay ov) - (overlay-put ov 'view-text t)) - ;; When on an unmodified fragment that is currently showing an image, - ;; hide the image. - ((and ov (guard (overlay-get ov 'display))) - (org-latex-preview-auto--open-this-overlay)) - ;; Since we're on an unmodified fragment but not showing an image, - ;; let's try to show the image if possible. - (ov - (overlay-put ov 'view-text t) - (overlay-put ov 'face (overlay-get ov 'hidden-face)) - (overlay-put ov 'display (overlay-get ov 'preview-image)))))) + (cond + ;; When not using auto-mode. + ((not org-latex-preview-auto-mode) + (if (org-latex-preview-clear-overlays beg end) + (message "LaTeX preview removed") + (org-latex-preview--place-from-elements + org-latex-preview-default-process (list datum)))) + ;; When using auto-mode, but no current preview. + ((not ov) + (org-latex-preview--place-from-elements + org-latex-preview-default-process (list datum)) + (message "Creating LaTeX preview")) + ;; When on a just written/edited fragment that should be previewed. + ((eq (overlay-get ov 'preview-state) 'modified) + (org-latex-preview-auto--regenerate-overlay ov) + (overlay-put ov 'view-text t)) + ;; When on an unmodified fragment that is currently showing an image, + ;; clear the image. + ((overlay-get ov 'display) + (org-latex-preview-clear-overlays beg end) + (message "LaTeX preview removed")) + ;; Since we're on an unmodified fragment but not showing an image, + ;; let's try to show the image if possible. + (ov + (overlay-put ov 'view-text t) + (overlay-put ov 'face (overlay-get ov 'hidden-face)) + (overlay-put ov 'display (overlay-get ov 'preview-image)))))) (defun org-latex-preview-collect-fragments (&optional beg end) "Collect all LaTeX maths fragments/environments between BEG and END."