Mercurial > emacs
changeset 61864:af1b504ffc35
(line-move-1): Avoid using vertical-motion in easy cases.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Tue, 26 Apr 2005 18:31:19 +0000 |
parents | 2fe5da3b3da2 |
children | d2d61028720d |
files | lisp/simple.el |
diffstat | 1 files changed, 23 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/simple.el Tue Apr 26 18:24:52 2005 +0000 +++ b/lisp/simple.el Tue Apr 26 18:31:19 2005 +0000 @@ -3403,19 +3403,33 @@ (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