Next: fwd-sentence while loops, Up: forward-sentence [Contents][Index]
forward-sentence
function definitionHere is the code for forward-sentence
:
(defun forward-sentence (&optional arg) "Move forward to next end of sentence. With argument, repeat. With negative argument, move backward repeatedly to start of sentence. The variable `sentence-end' is a regular expression that matches ends of sentences. Also, every paragraph boundary terminates sentences as well."
(interactive "p") (or arg (setq arg 1)) (let ((opoint (point)) (sentence-end (sentence-end))) (while (< arg 0) (let ((pos (point)) (par-beg (save-excursion (start-of-paragraph-text) (point)))) (if (and (re-search-backward sentence-end par-beg t) (or (< (match-end 0) pos) (re-search-backward sentence-end par-beg t))) (goto-char (match-end 0)) (goto-char par-beg))) (setq arg (1+ arg)))
(while (> arg 0) (let ((par-end (save-excursion (end-of-paragraph-text) (point)))) (if (re-search-forward sentence-end par-end t) (skip-chars-backward " \t\n") (goto-char par-end))) (setq arg (1- arg))) (constrain-to-field nil opoint t)))
The function looks long at first sight and it is best to look at its skeleton first, and then its muscle. The way to see the skeleton is to look at the expressions that start in the left-most columns:
(defun forward-sentence (&optional arg) "documentation…" (interactive "p") (or arg (setq arg 1)) (let ((opoint (point)) (sentence-end (sentence-end))) (while (< arg 0) (let ((pos (point)) (par-beg (save-excursion (start-of-paragraph-text) (point)))) rest-of-body-of-while-loop-when-going-backwards (while (> arg 0) (let ((par-end (save-excursion (end-of-paragraph-text) (point)))) rest-of-body-of-while-loop-when-going-forwards handle-forms-and-equivalent
This looks much simpler! The function definition consists of documentation,
an interactive
expression, an or
expression, a let
expression, and while
loops.
Let’s look at each of these parts in turn.
We note that the documentation is thorough and understandable.
The function has an interactive "p"
declaration. This means that the
processed prefix argument, if any, is passed to the function as its
argument. (This will be a number.) If the function is not passed an
argument (it is optional) then the argument arg
will be bound to 1.
When forward-sentence
is called non-interactively without an
argument, arg
is bound to nil
. The or
expression
handles this. What it does is either leave the value of arg
as it
is, but only if arg
is bound to a value; or it sets the value of
arg
to 1, in the case when arg
is bound to nil
.
Next is a let
. That specifies the values of two local variables,
opoint
and sentence-end
. The local value of point, from
before the search, is used in the constrain-to-field
function which
handles forms and equivalents. The sentence-end
variable is set by
the sentence-end
function.
Next: fwd-sentence while loops, Up: forward-sentence [Contents][Index]