Carefully manage save/restore of point in `notmuch-wash-toggle-invisible-action'.
authorDmitry Kurochkin <dmitry.kurochkin@gmail.com>
Tue, 24 May 2011 23:02:43 +0000 (03:02 +0400)
committerCarl Worth <cworth@cworth.org>
Tue, 24 May 2011 23:33:09 +0000 (16:33 -0700)
Before the change, save-excursion was used to save the point.  But the
marker saved by save-excursion was inside a region that was deleted,
so that approach is unreliable, (leading to point jumping to a new
position past the button). This patch instead saves point in an
integer variable, and when restoring, carefully avoids moving point
past the button, (in case the new button label is shorter than the old
button label).

emacs/notmuch-wash.el

index 8455eee0998f05e6e22bd2b81ee050cdcc29f698..e8134bf77c5002d16b590ad00590c3d915006232 100644 (file)
@@ -82,13 +82,14 @@ collapse the remaining lines into a button.")
   (let* ((new-start (button-start cite-button))
         (overlay (button-get cite-button 'overlay))
         (button-label (notmuch-wash-button-label overlay))
+        (old-point (point))
         (inhibit-read-only t))
-    (save-excursion
-      (goto-char new-start)
-      (insert button-label)
-      (let ((old-end (button-end cite-button)))
-       (move-overlay cite-button new-start (point))
-       (delete-region (point) old-end))))
+    (goto-char new-start)
+    (insert button-label)
+    (let ((old-end (button-end cite-button)))
+      (move-overlay cite-button new-start (point))
+      (delete-region (point) old-end))
+    (goto-char (min old-point (1- (button-end cite-button)))))
   (force-window-update)
   (redisplay t))