diff lisp/follow.el @ 100779:a0ff5fd45390

(follow-select-if-visible): Improve the check for the last line of the window. (follow-post-command-hook): Perform redisplay in more circumstances, to avoid getting point stuck on partially visible lines.
author Chong Yidong <cyd@stupidchicken.com>
date Tue, 30 Dec 2008 16:21:20 +0000
parents 3d5ce6a8b477
children a9dc0e7c3f2b
line wrap: on
line diff
--- a/lisp/follow.el	Tue Dec 30 16:19:50 2008 +0000
+++ b/lisp/follow.el	Tue Dec 30 16:21:20 2008 +0000
@@ -1033,21 +1033,27 @@
 (defun follow-select-if-visible (dest win-start-end)
   "Select and return a window, if DEST is visible in it.
 Return the selected window."
-  (let (win)
+  (let (win win-end)
     (while (and (not win) win-start-end)
       ;; Don't select a window that was just moved. This makes it
       ;; possible to later select the last window after a `end-of-buffer'
       ;; command.
       (when (follow-pos-visible dest (caar win-start-end) win-start-end)
-	(setq win (caar win-start-end))
+	(setq win (caar win-start-end)
+	      win-end (car (cddr (car win-start-end))))
 	(select-window win))
       (setq win-start-end (cdr win-start-end)))
     ;; The last line of the window may be partially visible; if so,
     ;; and if point is visible in the next window, select the next
     ;; window instead.
-    (and (/= dest (point-max))
+    (and win
+	 (/= dest (point-max))
     	 win-start-end
     	 (follow-pos-visible dest (caar win-start-end) win-start-end)
+	 (save-excursion
+	   (goto-char dest)
+	   (vertical-motion 1 win)
+	   (>= (point) win-end))
     	 (setq win (caar win-start-end))
     	 (select-window win))
     win))
@@ -1373,13 +1379,13 @@
 		 ((and visible aligned)
 		  (follow-debug-message "same"))
 		 ;; Pick a position in any window.  If the display is
-		 ;; ok, this will pick the `correct' window.  If the
-		 ;; display is wierd (e.g., after a delete at the
-		 ;; beginning of the window) do this anyway.
+		 ;; ok, this will pick the `correct' window.
 		 ((follow-select-if-visible dest win-start-end)
 		  (follow-debug-message "visible")
-		  (setq visible t)
-		  (goto-char dest))
+		  (goto-char dest)
+		  ;; We have to perform redisplay, since scrolling is
+		  ;; needed in case the line is partially visible.
+		  (setq visible nil))
 		 ;; Not visible anywhere else, lets pick this one.
 		 ;; (Is this case used?)
 		 (visible
@@ -1411,16 +1417,10 @@
 		(let ((p (window-point win)))
 		  (set-window-start win (window-start win) nil)
 		  (set-window-point win p))))
-	    (unless (or visible
-			;; Use the UPDATE argument of window-end
-			;; instead of calling follow-pos-visible
-			;; (which may be inaccurate for partially
-			;; visible lines).
-			(and (>= dest (window-start))
-			     (< dest (window-end nil t))))
-	      ;; If point is not visible in the selected window,
-	      ;; perform a redisplay; this causes scrolling.
-	      (sit-for 0)
+	    (unless visible
+	      ;; If point may not be visible in the selected window,
+	      ;; perform a redisplay; this ensures scrolling.
+	      (redisplay)
 	      (setq selected-window-up-to-date t)
 	      (follow-avoid-tail-recenter)
 	      (setq win-start-end (follow-windows-start-end windows))