]> git.eshelyaron.com Git - emacs.git/commitdiff
(line-move-partial): Rework 2006-09-15 change to use
authorKim F. Storm <storm@cua.dk>
Mon, 18 Sep 2006 11:13:04 +0000 (11:13 +0000)
committerKim F. Storm <storm@cua.dk>
Mon, 18 Sep 2006 11:13:04 +0000 (11:13 +0000)
new window-line-height function.  Further optimize by not calling
pos-visible-in-window-p for window-end when window-line-height
returns useful information.

lisp/simple.el

index 3e089d4e1a801cf06c4a3860a2cb5aa5e21710b1..0a257863a7620638f05381666b92cfb575662741 100644 (file)
@@ -3487,49 +3487,51 @@ Outline mode sets this."
          (set-window-vscroll nil (- vs (frame-char-height)) t)))
 
     ;; Move forward (down).
-    (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))))))))
+    (let* ((lh (window-line-height -1))
+          (vpos (nth 1 lh))
+          (ypos (nth 2 lh))
+          (rbot (nth 3 lh))
+          ppos py vs)
+      (when (or (null lh)
+               (>= rbot (frame-char-height))
+               (<= ypos (- (frame-char-height))))
+       (unless lh
+         (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))))
+           (setq rbot (nth 3 evis)
+                 vpos (nth 5 evis))))
+       (cond
+        ;; If last line of window is fully visible, move forward.
+        ((or (null rbot) (= rbot 0))
+         nil)
+        ;; If cursor is not in the bottom scroll margin, move forward.
+        ((and (> vpos 0)
+              (< (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.
+        ((and (> vpos 0)
+              (= 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