Mercurial > emacs
changeset 100776:3d5ce6a8b477
(follow-calculate-first-window-start-from-below): Avoid looping
forever if vertical-motion returns an unexpected value.
author | Chong Yidong <cyd@stupidchicken.com> |
---|---|
date | Tue, 30 Dec 2008 15:09:35 +0000 |
parents | e3c9285f6d49 |
children | b816bc48d9b2 |
files | lisp/follow.el |
diffstat | 1 files changed, 9 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- 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