# HG changeset patch # User Chong Yidong # Date 1230649775 0 # Node ID 3d5ce6a8b477fee366fd127a78b5fde5a4eae352 # Parent e3c9285f6d4977fca22a5a0f09627ee702e567c3 (follow-calculate-first-window-start-from-below): Avoid looping forever if vertical-motion returns an unexpected value. diff -r e3c9285f6d49 -r 3d5ce6a8b477 lisp/follow.el --- a/lisp/follow.el Tue Dec 30 15:09:13 2008 +0000 +++ b/lisp/follow.el Tue Dec 30 15:09:35 2008 +0000 @@ -1208,22 +1208,25 @@ (setq win (or win (selected-window))) (setq start (or start (window-start win))) (save-excursion - (let ((done nil) - win-start - res) + (let (done win-start res opoint) ;; Always calculate what happens when no line is displayed in the first ;; window. (The `previous' res is needed below!) (goto-char guess) (vertical-motion 0 (car windows)) (setq res (point)) (while (not done) + (setq opoint (point)) (if (not (= (vertical-motion -1 (car windows)) -1)) ;; Hit roof! (setq done t res (point-min)) (setq win-start (follow-calc-win-start windows (point) win)) - (cond ((= win-start start) ; Perfect match, use this value - (setq done t) - (setq res (point))) + (cond ((>= (point) opoint) + ;; In some pathological cases, vertical-motion may + ;; return -1 even though point has not decreased. In + ;; that case, avoid looping forever. + (setq done t res (point))) + ((= win-start start) ; Perfect match, use this value + (setq done t res (point))) ((< win-start start) ; Walked to far, use preious result (setq done t)) (t ; Store result for next iteration