|
@@ -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.
|