ob-core: Fix infloop when filling a region with a source block

* lisp/ob-core.el (org-babel-do-in-edit-buffer): Do not move point.

Reported-by: Yasushi SHOJI <yasushi.shoji@gmail.com>
<http://lists.gnu.org/r/emacs-orgmode/2018-02/msg00006.html>
This commit is contained in:
Nicolas Goaziou 2018-02-01 15:40:51 +01:00
parent ddc8e8eb23
commit b4cc12fc32

View file

@ -980,13 +980,24 @@ with a prefix argument then this is passed on to
(defmacro org-babel-do-in-edit-buffer (&rest body)
"Evaluate BODY in edit buffer if there is a code block at point.
Return t if a code block was found at point, nil otherwise."
`(let ((org-src-window-setup 'switch-invisibly))
(when (and (org-babel-where-is-src-block-head)
(declare (debug (body)))
`(let* ((element (org-element-at-point))
;; This function is not supposed to move point. However,
;; `org-edit-src-code' always moves point back into the
;; source block. It is problematic if the point was before
;; the code, e.g., on block's opening line. In this case,
;; we want to restore this location after executing BODY.
(outside-position
(and (<= (line-beginning-position)
(org-element-property :post-affiliated element))
(point-marker)))
(org-src-window-setup 'switch-invisibly))
(when (and (org-babel-where-is-src-block-head element)
(org-edit-src-code))
(unwind-protect (progn ,@body)
(org-edit-src-exit))
(org-edit-src-exit)
(when outside-position (goto-char outside-position)))
t)))
(def-edebug-spec org-babel-do-in-edit-buffer (body))
(defun org-babel-do-key-sequence-in-edit-buffer (key)
"Read key sequence and execute the command in edit buffer.