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
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.
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
loop, using the expression
(setq arg (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.