Go to the previous, next section.
The version 18 implementation of
zap-to-char is slightly
different from the version 19 implementation: it zaps the text up to but
not including the zapped-to-character; and zaps to the end of the buffer
if the specified character is not found.
The difference is in the second argument to the
command. Where the version 19 implementation looks like this:
(progn (search-forward (char-to-string char) nil nil arg) (point))
The version 18 implementation looks like this:
(if (search-forward (char-to-string char) nil t arg) (progn (goto-char (if (> arg 0) (1- (point)) (1+ (point)))) (point)) (if (> arg 0) (point-max) (point-min)))
This looks considerably more complicated, but the code can be readily understood if it is looked at part by part.
The first part is:
(if (search-forward (char-to-string char) nil t arg)
This fits into an
if expression that does the following job, as
we shall see:
(if able-to-locate-zapped-for-character-and-move-point-to-it then-move-point-to-the-exact-spot-and-return-this-location else-move-to-end-of-buffer-and-return-that-location)
Evaluation of the
if expression specifies the second argument to
kill-region . Since the first argument is point, this process
makes it possible for
kill-region to remove the text between
point and the zapped-to location.
We have already described how
search-forward moves point as a
side effect. The value that
search-forward returns is
if the search is successful and either
nil or an error message
depending on the value of the third argument to
In this case,
t is the third argument and it causes the function
nil when the search fails. As we will see, it is easy
to write the code for handling the case when the search returns
In the version 18 implementation of
zap-to-char , the search
takes place because the
if causes the search expression to be
evaluated as its true-or-false-test. If the search is successful,
Emacs evaluates the then-part of the
if expression. On the
other hand, if the search fails, Emacs evaluates the else-part of the
if expression, when the search succeeds, a
expression is executed--which is to say, it is run as a program.
As we said earlier,
progn is a function that causes each of its
arguments to be evaluated in sequence and then returns the value of the
last one. The preceding expressions are evaluated only for the side
effects they perform. The values produced by them are discarded.
In this version of
zap-to-char , the
progn expression is
executed when the
search-forward function finds the character for
which it is searching. The
progn expression has to do two
things: put point in exactly the right position; and return the location
of point so that
kill-region will know how far to kill to.
The reason for all the code in the
progn is that when
search-forward finds the string it is looking for, it leaves
point immediately after the last character in the target string. (In
this case the target string is just one character long.) If the search
search-forward leaves point just before the first
character in the target.
However, this version of the
zap-to-char function is designed so
that it does not remove the character being zapped to. For example, if
zap-to-char is to remove all the text up to a `z', this
version will not remove the `z' as well. So point has to be moved
just enough that the zapped-to character is not removed.
Go to the previous, next section.