From: Nicolas Goaziou <mail@nicolasgoaziou.fr>
To: Andreas Leha <andreas.leha@med.uni-goettingen.de>
Cc: emacs-orgmode@gnu.org
Subject: Re: Here is a patch I want to add to org.el……
Date: Tue, 03 Mar 2015 01:21:24 +0100 [thread overview]
Message-ID: <874mq3aq2j.fsf@nicolasgoaziou.fr> (raw)
In-Reply-To: <oluegp7nhgm.fsf@med.uni-goettingen.de> (Andreas Leha's message of "Mon, 02 Mar 2015 22:48:57 +0000")
[-- Attachment #1: Type: text/plain, Size: 291 bytes --]
Andreas Leha <andreas.leha@med.uni-goettingen.de> writes:
> I spoke a little too soon. I still like it, but there is a regression.
> See http://permalink.gmane.org/gmane.emacs.orgmode/95563
Indeed. I also fixed a few other things. Here's the update.
Thanks for the feedback.
Regards,
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Change-org-toggle-latex-fragment-behaviour.patch --]
[-- Type: text/x-diff, Size: 9765 bytes --]
From f79cd3a0499b1cc1fd9022d958f032d73defeac8 Mon Sep 17 00:00:00 2001
From: Nicolas Goaziou <mail@nicolasgoaziou.fr>
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.
(org-format-latex): Update docstring. Remove overlay when LaTeX
fragment is deleted.
* etc/ORG-NEWS: Signal change.
The new behaviour is the following:
- With a double prefix argument or with a single prefix argument
when point is before the first headline, toggle overlays in the
whole buffer;
- With a single prefix argument, toggle overlays in the current
subtree;
- On latex code, toggle overlay at point;
- Otherwise, toggle overlays in the current section.
Suggested-by: <kuangdash@163.com>
<http://permalink.gmane.org/gmane.emacs.orgmode/95492>
---
etc/ORG-NEWS | 14 ++++++
lisp/org.el | 147 ++++++++++++++++++++++++++++++++++++++---------------------
2 files changed, 109 insertions(+), 52 deletions(-)
diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS
index 65d63eb..252dc3b 100644
--- a/etc/ORG-NEWS
+++ b/etc/ORG-NEWS
@@ -120,6 +120,20 @@ end-users browser. You may force initial usage of MathML via
~org-html-mathjax-template~ or by setting the ~path~ property of
~org-html-mathjax-options~.
** New features
+*** New behaviour for `org-toggle-latex-fragment'.
+The new behaviour is the following:
+
+- With a double prefix argument or with a single prefix argument
+ when point is before the first headline, toggle overlays in the
+ whole buffer;
+
+- With a single prefix argument, toggle overlays in the current
+ subtree;
+
+- On latex code, toggle overlay at point;
+
+- Otherwise, toggle overlays in the current section.
+
*** Additional markup with =#+INCLUDE= keyword
The content of the included file can now be optionally marked up, for
instance as HTML. See the documentation for details.
diff --git a/lisp/org.el b/lisp/org.el
index d05a7b8..bbc9338 100755
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -18748,77 +18748,119 @@ 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)
+ (and (>= (overlay-start o) beg)
+ (<= (overlay-end o) end)
+ (progn (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 subtree or in the whole buffer when used before the first
+headline. 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
+ (cond
+ ((or (equal arg '(16))
+ (and (equal arg '(4))
+ (org-with-limited-levels (org-before-first-heading-p))))
+ (if (org-remove-latex-fragment-image-overlays)
+ (progn (message "LaTeX fragments images removed from buffer")
+ (throw 'exit nil))
+ (setq msg "Creating images for buffer...")))
+ ((equal arg '(4))
+ (org-with-limited-levels (org-back-to-heading t))
+ (let ((beg (point))
+ (end (progn (org-end-of-subtree t) (point))))
+ (if (org-remove-latex-fragment-image-overlays beg end)
+ (progn
+ (message "LaTeX fragment images removed from subtree")
+ (throw 'exit nil))
+ (setq msg "Creating images for subtree...")
+ (narrow-to-region beg end))))
+ ((let ((datum (org-element-context)))
+ (when (memq (org-element-type datum)
+ '(latex-environment latex-fragment))
+ (let* ((beg (org-element-property :begin datum))
+ (end (org-element-property :end datum)))
+ (if (org-remove-latex-fragment-image-overlays beg end)
+ (progn (message "LaTeX fragment image removed")
+ (throw 'exit nil))
+ (narrow-to-region beg end)
+ (setq msg "Creating image..."))))))
+ (t
+ (org-with-limited-levels
+ (let ((beg (if (org-at-heading-p) (line-beginning-position)
+ (outline-previous-heading)
+ (point)))
+ (end (progn (outline-next-heading) (point))))
+ (if (org-remove-latex-fragment-image-overlays beg end)
+ (progn
+ (message "LaTeX fragment images removed from section")
+ (throw 'exit nil))
+ (setq msg "Creating images for section...")
+ (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)
"Replace LaTeX fragments with links to an image, and produce images.
+
+When optional argument OVERLAYS is non-nil, display the image on
+top of the fragment instead of replacing it.
+
+PROCESSING-TYPE is the conversion method to use, as a symbol.
+
Some of the options can be changed using the variable
-`org-format-latex-options'."
+`org-format-latex-options', which see."
(when (and overlays (fboundp 'clear-image-cache)) (clear-image-cache))
(unless (eq processing-type 'verbatim)
(let* ((math-regexp "\\$\\|\\\\[([]\\|^[ \t]*\\\\begin{[A-Za-z0-9*]+}")
(cnt 0)
checkdir-flag)
(goto-char (point-min))
+ ;; Optimize overlay creation: (info "(elisp) Managing Overlays").
+ (when (and overlays (memq processing-type '(dvipng imagemagick)))
+ (overlay-recenter (point-max)))
(while (re-search-forward math-regexp nil t)
(unless (and overlays
(eq (get-char-property (point) 'org-overlay-type)
@@ -18893,6 +18935,7 @@ Some of the options can be changed using the variable
(overlay-put ov
'org-overlay-type
'org-latex-overlay)
+ (overlay-put ov 'evaporate t)
(if (featurep 'xemacs)
(progn
(overlay-put ov 'invisible t)
--
2.3.1
next prev parent reply other threads:[~2015-03-03 0:20 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-02-25 4:14 Here is a patch I want to add to org.el…… kuangdash
2015-02-25 4:41 ` kuangdash
2015-02-26 18:49 ` Nicolas Goaziou
2015-02-25 13:03 ` Nicolas Goaziou
2015-02-27 6:25 ` kuangdash
2015-02-27 9:29 ` Andreas Leha
2015-02-27 9:49 ` Nicolas Goaziou
2015-02-27 14:36 ` kuangdash
2015-02-27 17:32 ` Nicolas Goaziou
2015-02-27 19:38 ` kuangdash
2015-02-27 21:19 ` Nick Dokos
[not found] ` <54F0D25E.AC5A60.07341@m50-132.163.com>
2015-02-28 9:03 ` kuangdash
2015-02-28 15:43 ` Nick Dokos
2015-02-28 16:26 ` kuangdash
2015-02-27 15:26 ` Andreas Leha
2015-02-27 15:55 ` Rasmus
2015-02-27 22:22 ` Andreas Leha
2015-02-28 9:44 ` Rasmus
2015-02-27 23:37 ` Nicolas Goaziou
2015-02-28 11:01 ` Andreas Leha
2015-03-02 22:48 ` Andreas Leha
2015-03-03 0:21 ` Nicolas Goaziou [this message]
2015-03-03 9:38 ` Andreas Leha
2015-03-03 9:40 ` Andreas Leha
2015-03-03 21:00 ` Nicolas Goaziou
2015-03-03 21:11 ` Andreas Leha
2015-03-06 11:08 ` Nicolas Goaziou
2015-03-06 11:29 ` Andreas Leha
2015-02-27 9:46 ` Nicolas Goaziou
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.orgmode.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=874mq3aq2j.fsf@nicolasgoaziou.fr \
--to=mail@nicolasgoaziou.fr \
--cc=andreas.leha@med.uni-goettingen.de \
--cc=emacs-orgmode@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).