From 97a235cf1cd029920b0a7dbcdc300abd7215499c Mon Sep 17 00:00:00 2001 From: Ihor Radchenko Date: Fri, 13 Jan 2023 11:57:19 +0300 Subject: [PATCH] org-clock-timestamps-change: Preserve point position * lisp/org-clock.el (org-clock-timestamps-change): Try harder to preserve point position. `save-excursion' is not sufficient here, when the timestamp gets deleted in the process. Reported-by: Johannes Dahl Link: https://orgmode.org/list/CAHuokSbJxM4kqjdT94aHmjnKqzOvpJpq3tJqOEqdswaBC=JnfA@mail.gmail.com --- lisp/org-clock.el | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/lisp/org-clock.el b/lisp/org-clock.el index 4e72141cd..55372e564 100644 --- a/lisp/org-clock.el +++ b/lisp/org-clock.el @@ -1800,17 +1800,25 @@ Optional argument N tells to change by that many units." (time-subtract (org-time-string-to-time org-last-changed-timestamp) (org-time-string-to-time ts))) - (save-excursion - (goto-char begts) - (org-timestamp-change - (round (/ (float-time tdiff) - (pcase timestamp? - (`minute 60) - (`hour 3600) - (`day (* 24 3600)) - (`month (* 24 3600 31)) - (`year (* 24 3600 365.2))))) - timestamp? 'updown))))))) + ;; `save-excursion' won't work because + ;; `org-timestamp-change' deletes and re-inserts the + ;; timestamp. + (let ((origin (point))) + (save-excursion + (goto-char begts) + (org-timestamp-change + (round (/ (float-time tdiff) + (pcase timestamp? + (`minute 60) + (`hour 3600) + (`day (* 24 3600)) + (`month (* 24 3600 31)) + (`year (* 24 3600 365.2))))) + timestamp? 'updown)) + ;; Move back to initial position, but never beyond updated + ;; clock. + (unless (< (point) origin) + (goto-char origin)))))))) ;;;###autoload (defun org-clock-cancel ()