summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Goaziou <mail@nicolasgoaziou.fr>2017-08-13 16:20:20 +0200
committerNicolas Goaziou <mail@nicolasgoaziou.fr>2017-08-13 16:20:20 +0200
commit24a76fbe572923c55774bc9f8ecc8e6d1c7ff16d (patch)
tree020234c1f37feba88ef02f1dc07f4e64537b560d
parent5bf7730674b33aad81b834298c2ea68750e41cc5 (diff)
downloadorg-mode-24a76fbe572923c55774bc9f8ecc8e6d1c7ff16d.tar.gz
ob-core: Fix improper results indentation
* lisp/ob-core.el (org-babel-insert-result): Fix improper results indentation. * testing/lisp/test-ob.el (test-ob/preserve-results-indentation): Add test. Reported-by: Chunyang Xu <mail@xuchunyang.me> <http://lists.gnu.org/archive/html/emacs-orgmode/2017-08/msg00308.html>
-rw-r--r--lisp/ob-core.el41
-rw-r--r--testing/lisp/test-ob.el52
2 files changed, 73 insertions, 20 deletions
diff --git a/lisp/ob-core.el b/lisp/ob-core.el
index c630b70..a4ecfca 100644
--- a/lisp/ob-core.el
+++ b/lisp/ob-core.el
@@ -2269,21 +2269,22 @@ INFO may provide the values of these header arguments (in the
((member "prepend" result-params))) ; already there
(setq results-switches
(if results-switches (concat " " results-switches) ""))
- (let ((wrap (lambda (start finish &optional no-escape no-newlines
- inline-start inline-finish)
- (when inline
- (setq start inline-start)
- (setq finish inline-finish)
- (setq no-newlines t))
- (goto-char end)
- (insert (concat finish (unless no-newlines "\n")))
- (goto-char beg)
- (insert (concat start (unless no-newlines "\n")))
- (unless no-escape
- (org-escape-code-in-region (min (point) end) end))
- (goto-char end)
- (unless no-newlines (goto-char (point-at-eol)))
- (setq end (point-marker))))
+ (let ((wrap
+ (lambda (start finish &optional no-escape no-newlines
+ inline-start inline-finish)
+ (when inline
+ (setq start inline-start)
+ (setq finish inline-finish)
+ (setq no-newlines t))
+ (let ((before-finish (marker-position end)))
+ (goto-char end)
+ (insert (concat finish (unless no-newlines "\n")))
+ (goto-char beg)
+ (insert (concat start (unless no-newlines "\n")))
+ (unless no-escape
+ (org-escape-code-in-region
+ (min (point) before-finish) before-finish))
+ (goto-char end))))
(tabulablep
(lambda (r)
;; Non-nil when result R can be turned into
@@ -2337,7 +2338,7 @@ INFO may provide the values of these header arguments (in the
(insert (org-macro-escape-arguments
(org-babel-chomp result "\n"))))
(t (goto-char beg) (insert result)))
- (setq end (point-marker))
+ (setq end (copy-marker (point) t))
;; possibly wrap result
(cond
((assq :wrap (nth 2 info))
@@ -2374,11 +2375,12 @@ INFO may provide the values of these header arguments (in the
((and (not (funcall tabulablep result))
(not (member "file" result-params)))
(let ((org-babel-inline-result-wrap
- ;; Hard code {{{results(...)}}} on top of customization.
+ ;; Hard code {{{results(...)}}} on top of
+ ;; customization.
(format "{{{results(%s)}}}"
org-babel-inline-result-wrap)))
- (org-babel-examplify-region beg end results-switches inline)
- (setq end (point))))))
+ (org-babel-examplify-region
+ beg end results-switches inline)))))
;; Possibly indent results in par with #+results line.
(when (and (not inline) (numberp indent) (> indent 0)
;; In this case `table-align' does the work
@@ -2391,6 +2393,7 @@ INFO may provide the values of these header arguments (in the
(message "Code block returned no value.")
(message "Code block produced no output."))
(message "Code block evaluation complete.")))
+ (set-marker end nil)
(when outside-scope (narrow-to-region visible-beg visible-end))
(set-marker visible-beg nil)
(set-marker visible-end nil)))))))
diff --git a/testing/lisp/test-ob.el b/testing/lisp/test-ob.el
index a1bdc54..4f0f6be 100644
--- a/testing/lisp/test-ob.el
+++ b/testing/lisp/test-ob.el
@@ -1405,7 +1405,57 @@ echo \"$data\"
(org-babel-execute-src-block)
(let ((case-fold-search t)) (search-forward "RESULTS"))
(list (org-get-indentation)
- (progn (forward-line) (org-get-indentation)))))))
+ (progn (forward-line) (org-get-indentation))))))
+ ;; Properly indent examplified blocks.
+ (should
+ (equal
+ " #+begin_example
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+ #+end_example
+"
+ (org-test-with-temp-text
+ " #+begin_src emacs-lisp :results output
+ (dotimes (i 10) (princ i) (princ \"\\n\"))
+ #+end_src"
+ (org-babel-execute-src-block)
+ (search-forward "begin_example")
+ (downcase
+ (buffer-substring-no-properties (line-beginning-position)
+ (point-max))))))
+ ;; Properly indent "org" blocks.
+ (should
+ (equal
+ " #+begin_src org
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+ #+end_src
+"
+ (org-test-with-temp-text
+ " #+begin_src emacs-lisp :results output org
+ (dotimes (i 10) (princ i) (princ \"\\n\"))
+ #+end_src"
+ (org-babel-execute-src-block)
+ (search-forward "begin_src org")
+ (downcase
+ (buffer-substring-no-properties (line-beginning-position)
+ (point-max)))))))
(ert-deftest test-ob/safe-header-args ()
"Detect safe and unsafe header args."