while
loop
The second part of the body of the let*
deals with forward
motion. It is a while
loop that repeats itself so long as the
value of arg
is greater than zero. In the most common use of
the function, the value of the argument is 1, so the body of the
while
loop is evaluated exactly once, and the cursor moves
forward one paragraph.
This part handles three situations: when point is between paragraphs, when point is within a paragraph and there is a fill prefix, and when point is within a paragraph and there is no fill prefix.
The while
loop looks like this:
(while (> arg 0) (beginning-of-line) ;; between paragraphs (while (prog1 (and (not (eobp)) (looking-at paragraph-separate)) (forward-line 1))) ;; within paragraphs, with a fill prefix (if fill-prefix-regexp ;; There is a fill prefix; it overrides paragraph-start. (while (and (not (eobp)) (not (looking-at paragraph-separate)) (looking-at fill-prefix-regexp)) (forward-line 1)) ;; within paragraphs, no fill prefix (if (re-search-forward paragraph-start nil t) (goto-char (match-beginning 0)) (goto-char (point-max)))) (setq arg (1- arg)))
We can see immediately that this is a decrementing counter while
loop, using the expression (setq (1- arg))
as the decrementer.
The body of the loop consists of three expressions:
;; between paragraphs (beginning-of-line) (while body-of-while) ;; within paragraphs, with fill prefix (if true-or-false-test then-part ;; within paragraphs, no fill prefix else-part
When the Emacs Lisp interpreter evaluates the body of the
while
loop, the first thing it does is evaluate the
(beginning-of-line)
expression and move point to the beginning
of the line. Then there is an inner while
loop. This
while
loop is designed to move the cursor out of the blank
space between paragraphs, if it should happen to be there. Finally
there is an if
expression that actually moves point to the end
of the paragraph.
Go to the first, previous, next, last section, table of contents.