emacs-bug-tracker
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#51814: closed (follow-scroll-down leaves point in wrong place in a c


From: GNU bug Tracking System
Subject: bug#51814: closed (follow-scroll-down leaves point in wrong place in a corner case.)
Date: Sat, 13 Nov 2021 18:43:02 +0000

Your message dated Sat, 13 Nov 2021 18:42:29 +0000
with message-id <YZAHFS6O0tPV8lsz@ACM>
and subject line Re: bug#51814: follow-scroll-down leaves point in wrong place 
in a corner case.
has caused the debbugs.gnu.org bug report #51814,
regarding follow-scroll-down leaves point in wrong place in a corner case.
to be marked as done.

(If you believe you have received this mail in error, please contact
help-debbugs@gnu.org.)


-- 
51814: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=51814
GNU Bug Tracking System
Contact help-debbugs@gnu.org with problems
--- Begin Message --- Subject: follow-scroll-down leaves point in wrong place in a corner case. Date: Sat, 13 Nov 2021 17:46:18 +0000
Hello, Juri and Emacs.

On the emacs-28 branch and master.

This bug is a corner case, noted but not fixed in bug #51590.

>From a post in that bug thread:

[*] There is a situation which is not new, where if the buffer is too
short to fill all the windows, and it is already scrolled up far,
follow-scroll-down will scroll a correct amount, but leave point in a
random position.

I believe the following patch fixes this.  Juri, could you try it out,
please.

As a test buffer,
(i) open elisp.info in a default GUI window (34 lines);
(ii) C-x 3 ; split it with a vertical divider.
(iii) ] ; Move to next page in manual, "Introduction".
(iv) M-x follow-mode.
(v) C-u 20 C-v ; scroll-up a significant amount.

(vi) Move point to the line beginning "* Caveats".
(vii) M-x follow-scroll-down.

Note that point is in a random place.  This is a bug.

The cause of the bug is that the current code is "optimised" for the case
where there are enough buffer lines above point to scroll a full
follow-page, yet neglects the case where this doesn't hold.  The patch
does away with this optimisation.


diff --git a/lisp/follow.el b/lisp/follow.el
index 2ca2c1f17b..3761275bbf 100644
--- a/lisp/follow.el
+++ b/lisp/follow.el
@@ -669,24 +669,30 @@ follow-scroll-down
         (t
         (let* ((orig-point (point))
                 (windows (follow-all-followers))
-               (win (car (reverse windows)))
-               (start (window-start (car windows))))
+               (start (window-start (car windows)))
+                (lines 0))
           (if (eq start (point-min))
               (if (or (null scroll-error-top-bottom)
                       (bobp))
                   (signal 'beginning-of-buffer nil)
                 (goto-char (point-min)))
-            (select-window win)
-            (goto-char start)
-            (vertical-motion (- (- (window-height win)
-                                   (if header-line-format 2 1) ; always 
mode-line
-                                   (if tab-line-format 1 0)
-                                    next-screen-context-lines)))
-            (set-window-start win (point))
-             (if (< orig-point (window-end win t))
-                 (goto-char orig-point)
-               (goto-char start)
-              (vertical-motion (- next-screen-context-lines 1)))
+             (select-window (car windows))
+             (dolist (win windows)
+               (setq lines
+                     (+ lines
+                        (- (window-height win)
+                           (if header-line-format 2 1) ; Count mode-line, too.
+                           (if tab-line-format 1 0)))))
+             (setq lines (- lines next-screen-context-lines))
+             (goto-char start)
+             (let ((at-top (> (vertical-motion (- lines)) (- lines))))
+               (set-window-start (car windows) (point))
+               (if at-top
+                   (goto-char orig-point)
+                 (goto-char start)
+                 (vertical-motion (- next-screen-context-lines 1))
+                 (if (< orig-point (point))
+                     (goto-char orig-point))))
             (setq follow-internal-force-redisplay t))))))
 (put 'follow-scroll-down 'scroll-command t)
 

-- 
Alan Mackenzie (Nuremberg, Germany).



--- End Message ---
--- Begin Message --- Subject: Re: bug#51814: follow-scroll-down leaves point in wrong place in a corner case. Date: Sat, 13 Nov 2021 18:42:29 +0000
Hello, Juri

On Sat, Nov 13, 2021 at 19:58:12 +0200, Juri Linkov wrote:
> > I believe the following patch fixes this.  Juri, could you try it out,
> > please.

> > As a test buffer,
> > (i) open elisp.info in a default GUI window (34 lines);
> > (ii) C-x 3 ; split it with a vertical divider.
> > (iii) ] ; Move to next page in manual, "Introduction".
> > (iv) M-x follow-mode.
> > (v) C-u 20 C-v ; scroll-up a significant amount.

> > (vi) Move point to the line beginning "* Caveats".
> > (vii) M-x follow-scroll-down.

> > Note that point is in a random place.  This is a bug.

> Thanks, I confirm this bug is fixed with your patch.
> I've tested it with and without tab-line-mode in Info
> with the header line.

Thanks for the testing!  I've committed the patch to the emacs-28
branch, and I'm closing the bug with this post.

-- 
Alan Mackenzie (Nuremberg, Germany).


--- End Message ---

reply via email to

[Prev in Thread] Current Thread [Next in Thread]