branch: externals/org
commit 1ed9e42238bc0cc721f41dec8ab5f01a65d862d9
Author: Ihor Radchenko <yanta...@gmail.com>
Commit: Ihor Radchenko <yanta...@gmail.com>

    org-todo: Fix point moving after setting todo keyword in empty heading
    
    * lisp/org.el (org-todo): Insert new todo keyword before
    `save-excursion' markers.  This avoids apparent point movement when a
    new keyword is inserted into an empty heading.
    Before: "* <point>" -> "*<point> TODO";
    After: "* <point>" -> "* TODO<point>";
    
    Fixes https://orgmode.org/list/87mtg6265i....@yandex.com
---
 lisp/org.el | 21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/lisp/org.el b/lisp/org.el
index c675fc1541..1d5fc39038 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -8976,14 +8976,19 @@ When called through ELisp, arg is also interpreted in 
the following way:
                    (throw 'exit nil)))))
            (store-match-data match-data)
             (org-fold-core-ignore-modifications
-                (save-excursion
-                  (goto-char (match-beginning 0))
-                  (setf (buffer-substring (match-beginning 0) (match-end 0)) 
"")
-                  (insert-and-inherit next)
-                  (unless (org-invisible-p (line-beginning-position))
-                    (org-fold-region (line-beginning-position)
-                                  (line-end-position)
-                                  nil))))
+                (goto-char (match-beginning 0))
+              (replace-match "")
+              ;; We need to use `insert-before-markers-and-inherit'
+              ;; because: (1) We want to preserve the folding state
+              ;; text properties; (2) We do not want to make point
+              ;; move before new todo state when inserting a new todo
+              ;; into an empty heading.  In (2), the above
+              ;; `save-excursion' is relying on markers saved before.
+              (insert-before-markers-and-inherit next)
+              (unless (org-invisible-p (line-beginning-position))
+                (org-fold-region (line-beginning-position)
+                              (line-end-position)
+                              nil)))
            (cond ((and org-state (equal this org-state))
                   (message "TODO state was already %s" (org-trim next)))
                  ((not (pos-visible-in-window-p hl-pos))

Reply via email to