]> git.eshelyaron.com Git - emacs.git/commitdiff
(line-move-1): Avoid using vertical-motion in easy cases.
authorRichard M. Stallman <rms@gnu.org>
Tue, 26 Apr 2005 18:31:19 +0000 (18:31 +0000)
committerRichard M. Stallman <rms@gnu.org>
Tue, 26 Apr 2005 18:31:19 +0000 (18:31 +0000)
lisp/simple.el

index 3082112ec1ba78cc0816f959ceef3f35a9c1c347..36f092672352d2c42a0fb1fd7add08a2de9a8550 100644 (file)
@@ -3403,19 +3403,33 @@ Outline mode sets this."
                  (goto-char (next-char-property-change (point))))
                ;; Now move a line.
                (end-of-line)
-               (and (zerop (vertical-motion 1))
-                    (if (not noerror)
-                        (signal 'end-of-buffer nil)
-                      (setq done t)))
+               ;; If there's no invisibility here, move over the newline.
+               (if (not (line-move-invisible-p (point)))
+                   ;; We avoid vertical-motion when possible
+                   ;; because that has to fontify.
+                   (if (eobp)
+                       (setq done t)
+                     (forward-line 1))
+                 ;; Otherwise move a more sophisticated way.
+                 ;; (What's the logic behind this code?)
+                 (and (zerop (vertical-motion 1))
+                      (if (not noerror)
+                          (signal 'end-of-buffer nil)
+                        (setq done t))))
                (unless done
                  (setq arg (1- arg))))
+             ;; The logic of this is the same as the loop above, 
+             ;; it just goes in the other direction.
              (while (and (< arg 0) (not done))
                (beginning-of-line)
-
-               (if (zerop (vertical-motion -1))
-                   (if (not noerror)
-                       (signal 'beginning-of-buffer nil)
-                     (setq done t)))
+               (if (not (line-move-invisible-p (1- (point))))
+                   (if (bobp)
+                       (setq done t)
+                     (forward-line -1))
+                 (if (zerop (vertical-motion -1))
+                     (if (not noerror)
+                         (signal 'beginning-of-buffer nil)
+                       (setq done t))))
                (unless done
                  (setq arg (1+ arg))
                  (while (and ;; Don't move over previous invis lines