Below, I show 2 commands to be run with point on a source block. I expect that those commands modify an Org file identically, but they do not. It fails when `org-indent-block' is called in a loop after each `(insert (org-element-interpret-data copy))' and it works when `org-indent-block' is called in a separate loop after insertion of all `(org-element-interpret-data copy)'s:
#+begin_src emacs-lisp :results silent (defun make-2-indent-fails () "Make 2 modified blocks, but fails." (interactive) (let ((copy (org-element-copy (org-element-at-point))) (n 0)) (delete-region (org-element-begin copy) (org-element-end copy)) (while (< n 2) (cl-incf n) (org-element-put-property copy :value (format "copy %s" n)) (insert (org-element-interpret-data copy)) (org-indent-block)))) (defun make-2-indent-works () "Make 2 modified blocks, and works." (interactive) (let ((copy (org-element-copy (org-element-at-point))) (n 0)) (delete-region (org-element-begin copy) (org-element-end copy)) (while (< n 2) (cl-incf n) (org-element-put-property copy :value (format "copy %s" n)) (insert (org-element-interpret-data copy))) (org-previous-block n) (while (> n 0) (cl-decf n) (org-indent-block)))) #+end_src Example block: --- #+begin_src emacs-lisp <point> #+end_src --- make-2-indent-fails results in --- #+begin_src emacs-lisp copy 1 #+end_src --- make-2-indent-works results in --- #+begin_src emacs-lisp copy 1 #+end_src #+begin_src emacs-lisp copy 2 #+end_src --- I think that it is also weird that this bug does not show up in this ERT test while it does outside ERT: #+begin_src emacs-lisp :results silent (ert-deftest test-make-2-indent-fails () "Test unfolded `make-2-indent-fails'." (org-test-with-temp-text " ,#+begin_src emacs-lisp <point> ,#+end_src " (let ((copy (org-element-copy (org-element-at-point))) (word "copy") (n 0)) (delete-region (org-element-begin copy) (org-element-end copy)) (while (< n 2) (cl-incf n) (org-element-put-property copy :value (format "%s %s" word n)) ;; Why does this work inside ERT and not outside ERT? (insert (org-element-interpret-data copy)) (org-indent-block)) (message "`%s'" (buffer-substring (point-min) (point-max))) (goto-char (point-min)) (while (> n 0) (cl-decf n) (should (re-search-forward word))) (should-not (re-search-forward word nil 'noerror))))) #+end_src Regards -- Gerard