Mercurial > emacs
changeset 72909:3462f8c114c9
(line-move-partial): Use window-line-visiblity to
quickly check whether last line is partially visible, and only do
the hard (and slow) part in that case.
author | Kim F. Storm <storm@cua.dk> |
---|---|
date | Fri, 15 Sep 2006 21:04:39 +0000 |
parents | 5c55bc17ef31 |
children | f84c05f61c25 |
files | lisp/simple.el |
diffstat | 1 files changed, 43 insertions(+), 37 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/simple.el Fri Sep 15 21:04:28 2006 +0000 +++ b/lisp/simple.el Fri Sep 15 21:04:39 2006 +0000 @@ -3487,43 +3487,49 @@ (set-window-vscroll nil (- vs (frame-char-height)) t))) ;; Move forward (down). - (let* ((evis (or (pos-visible-in-window-p (window-end nil t) nil t) - (pos-visible-in-window-p (1- (window-end nil t)) nil t))) - (rbot (nth 3 evis)) - (vpos (nth 5 evis)) - ppos py vs) - (cond - ;; Last window line should be visible - fail if not. - ((null evis) - nil) - ;; If last line of window is fully visible, move forward. - ((null rbot) - nil) - ;; If cursor is not in the bottom scroll margin, move forward. - ((< (setq ppos (posn-at-point) - py (cdr (or (posn-actual-col-row ppos) - (posn-col-row ppos)))) - (min (- (window-text-height) scroll-margin 1) (1- vpos))) - nil) - ;; When already vscrolled, we vscroll some more if we can, - ;; or clear vscroll and move forward at end of tall image. - ((> (setq vs (window-vscroll nil t)) 0) - (when (> rbot 0) - (set-window-vscroll nil (+ vs (min rbot (frame-char-height))) t))) - ;; If cursor just entered the bottom scroll margin, move forward, - ;; but also vscroll one line so redisplay wont recenter. - ((= py (min (- (window-text-height) scroll-margin 1) - (1- vpos))) - (set-window-vscroll nil (frame-char-height) t) - (line-move-1 arg noerror to-end) - t) - ;; If there are lines above the last line, scroll-up one line. - ((> vpos 0) - (scroll-up 1) - t) - ;; Finally, start vscroll. - (t - (set-window-vscroll nil (frame-char-height) t)))))) + (let ((wvis (window-line-visibility))) + (when (or (null wvis) + (and (consp wvis) + (or (>= (car wvis) (frame-char-height)) + (>= (cdr wvis) (frame-char-height))))) + (let* ((wend (window-end nil t)) + (evis (or (pos-visible-in-window-p wend nil t) + (pos-visible-in-window-p (1- wend) nil t))) + (rbot (nth 3 evis)) + (vpos (nth 5 evis)) + ppos py vs) + (cond + ;; Last window line should be visible - fail if not. + ((null evis) + nil) + ;; If last line of window is fully visible, move forward. + ((null rbot) + nil) + ;; If cursor is not in the bottom scroll margin, move forward. + ((< (setq ppos (posn-at-point) + py (cdr (or (posn-actual-col-row ppos) + (posn-col-row ppos)))) + (min (- (window-text-height) scroll-margin 1) (1- vpos))) + nil) + ;; When already vscrolled, we vscroll some more if we can, + ;; or clear vscroll and move forward at end of tall image. + ((> (setq vs (window-vscroll nil t)) 0) + (when (> rbot 0) + (set-window-vscroll nil (+ vs (min rbot (frame-char-height))) t))) + ;; If cursor just entered the bottom scroll margin, move forward, + ;; but also vscroll one line so redisplay wont recenter. + ((= py (min (- (window-text-height) scroll-margin 1) + (1- vpos))) + (set-window-vscroll nil (frame-char-height) t) + (line-move-1 arg noerror to-end) + t) + ;; If there are lines above the last line, scroll-up one line. + ((> vpos 0) + (scroll-up 1) + t) + ;; Finally, start vscroll. + (t + (set-window-vscroll nil (frame-char-height) t)))))))) ;; This is like line-move-1 except that it also performs