>From 4fecb645b6c03118ba46d508ceb9159018a5d6f4 Mon Sep 17 00:00:00 2001
From: Nicolas Goaziou
Date: Sat, 28 Feb 2015 00:30:43 +0100
Subject: [PATCH] Change `org-toggle-latex-fragment' behaviour
* lisp/org.el (org-remove-latex-fragment-image-overlays): Allow to
limit overlay removal through optional arguments. Define a new
return value.
(org-toggle-latex-fragment): Change behaviour. Update docstring
accordingly.
The new behaviour is the following:
- With a double prefix argument, toggle overlays buffer wide;
- With a single prefix overlay, or if there is no latex fragment at
point, toggle overlays in the current section;
- Otherwise, toggle overlay at point.
Suggested-by:
---
lisp/org.el | 133 +++++++++++++++++++++++++++++++++++++-----------------------
1 file changed, 82 insertions(+), 51 deletions(-)
diff --git a/lisp/org.el b/lisp/org.el
index d05a7b8..cd5c5be 100755
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -18748,65 +18748,96 @@ looks only before point, not after."
"List of overlays carrying the images of latex fragments.")
(make-variable-buffer-local 'org-latex-fragment-image-overlays)
-(defun org-remove-latex-fragment-image-overlays ()
- "Remove all overlays with LaTeX fragment images in current buffer."
- (mapc 'delete-overlay org-latex-fragment-image-overlays)
- (setq org-latex-fragment-image-overlays nil))
+(defun org-remove-latex-fragment-image-overlays (&optional beg end)
+ "Remove all overlays with LaTeX fragment images in current buffer.
+When optional arguments BEG and END are non-nil, remove all
+overlays between them instead. Return t when some overlays were
+removed, nil otherwise."
+ (let (removedp)
+ (setq org-latex-fragment-image-overlays
+ (let ((beg (or beg (point-min)))
+ (end (or end (point-max))))
+ (org-remove-if
+ (lambda (o)
+ (let ((s (overlay-start o))
+ (e (overlay-end o)))
+ (cond
+ ((= s e)
+ (delete-overlay o) t)
+ ((and (>= s beg) (<= e end))
+ (delete-overlay o)
+ (or removedp (setq removedp t))))))
+ org-latex-fragment-image-overlays)))
+ removedp))
(define-obsolete-function-alias
'org-preview-latex-fragment 'org-toggle-latex-fragment "24.4")
-(defun org-toggle-latex-fragment (&optional subtree)
+(defun org-toggle-latex-fragment (&optional arg)
"Preview the LaTeX fragment at point, or all locally or globally.
+
If the cursor is in a LaTeX fragment, create the image and overlay
-it over the source code. If there is no fragment at point, display
-all fragments in the current text, from one headline to the next. With
-prefix SUBTREE, display all fragments in the current subtree. With a
-double prefix arg \\[universal-argument] \\[universal-argument], or when \
-the cursor is before the first headline,
-display all fragments in the buffer.
-The images can be removed again with \\[org-toggle-latex-fragment]."
+it over the source code, if there is none, or remove it otherwise.
+If there is no fragment at point, display all fragments in the
+current section.
+
+With prefix ARG, preview or clear image for all fragments in the
+current section. With a double prefix ARG \\[universal-argument] \
+\\[universal-argument] preview or clear
+images for all fragments in the buffer."
(interactive "P")
(unless (buffer-file-name (buffer-base-buffer))
(user-error "Can't preview LaTeX fragment in a non-file buffer"))
- (if org-latex-fragment-image-overlays
- (progn (org-remove-latex-fragment-image-overlays)
- (message "LaTeX fragments images removed"))
- (when (display-graphic-p)
- (org-remove-latex-fragment-image-overlays)
- (org-with-wide-buffer
- (let (beg end msg)
- (cond
- ((equal subtree '(16))
- (setq beg (point-min) end (point-max)
- msg "Creating images for buffer...%s"))
- ((equal subtree '(4))
- (org-back-to-heading)
- (setq beg (point) end (org-end-of-subtree t)
- msg "Creating images for subtree...%s"))
- ((let ((context (org-element-context)))
- (when (memq (org-element-type context)
- '(latex-environment latex-fragment))
- (setq beg (org-element-property :begin context)
- end (org-element-property :end context)
- msg "Creating image...%s"))))
- ((org-before-first-heading-p)
- (setq beg (point-min) end (point-max)
- msg "Creating images for buffer...%s"))
- (t
- (org-back-to-heading)
- (setq beg (point) end (progn (outline-next-heading) (point))
- msg "Creating images for entry...%s")))
- (message msg "")
- (narrow-to-region beg end)
- (goto-char beg)
- (org-format-latex
- (concat org-latex-preview-ltxpng-directory
- (file-name-sans-extension
- (file-name-nondirectory
- (buffer-file-name (buffer-base-buffer)))))
- default-directory 'overlays msg 'forbuffer
- org-latex-create-formula-image-program)
- (message msg "done. Use `C-c C-x C-l' to remove images."))))))
+ (when (display-graphic-p)
+ (catch 'exit
+ (save-excursion
+ (let ((window-start (window-start)) msg)
+ (save-restriction
+ (let (datum)
+ (cond
+ ((equal arg '(16))
+ (if (org-remove-latex-fragment-image-overlays)
+ (progn (message "LaTeX fragments images removed in buffer")
+ (throw 'exit nil))
+ (setq msg "Creating images for buffer...")
+ (goto-char (point-min))))
+ ((or (equal arg '(4))
+ (not (memq
+ (org-element-type (setq datum (org-element-context)))
+ '(latex-environment latex-fragment))))
+ (let ((beg
+ (save-excursion
+ (org-with-limited-levels (outline-previous-heading))
+ (point)))
+ (end (save-excursion
+ (org-with-limited-levels (outline-next-heading))
+ (point))))
+ (if (org-remove-latex-fragment-image-overlays beg end)
+ (progn
+ (message "LaTeX fragment images removed in section")
+ (throw 'exit nil))
+ (setq msg "Creating images for section...")
+ (narrow-to-region beg end)
+ (goto-char beg))))
+ (t
+ (let* ((latex (or datum (org-element-context)))
+ (beg (org-element-property :begin latex))
+ (end (org-element-property :end latex)))
+ (if (org-remove-latex-fragment-image-overlays beg end)
+ (progn (message "LaTeX fragment image removed")
+ (throw 'exit nil))
+ (setq msg "Creating image...")
+ (narrow-to-region beg end)))))
+ (org-format-latex
+ (concat org-latex-preview-ltxpng-directory
+ (file-name-sans-extension
+ (file-name-nondirectory
+ (buffer-file-name (buffer-base-buffer)))))
+ default-directory 'overlays msg 'forbuffer
+ org-latex-create-formula-image-program)))
+ ;; Work around a bug that doesn't restore window's start when
+ ;; widening back the buffer.
+ (set-window-start nil window-start)
+ (message (concat msg "done")))))))
(defun org-format-latex
(prefix &optional dir overlays msg forbuffer processing-type)
--
2.3.1