branch: externals/org
commit 1ed9e42238bc0cc721f41dec8ab5f01a65d862d9
Author: Ihor Radchenko <[email protected]>
Commit: Ihor Radchenko <[email protected]>
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/[email protected]
---
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))