progn
expression
The body of the progn
consists of two expressions. Spread out to
delineate the different parts more clearly, and with comments added, the
progn
expression looks like this:
(progn (goto-char ; First expression inprogn
. (if (> arg 0) ; Ifarg
is positive, (1- (point)) ; move back one character; (1+ (point)))) ; else move forward one character. (point)) ; Second expression inprogn
: ; return position of point.
The progn
expression does this: when the search is forward
(arg
is positive), Emacs leaves point just after the searched-for
character. By moving point back one position, the character is
uncovered. In this case, the expression in the progn
reads as
follows: (goto-char (1- (point)))
. This moves point one
character back. (The 1-
function subtracts one from its
argument, just as 1+
adds ones to its argument.) On the other
hand, if the argument to zap-to-character
is negative, the search
will be backwards. The if
detects this and the expression reads:
(goto-char (1+ (point)))
. (The 1+
function adds one to
its argument.)
The second and last argument to progn
is the expression
(point)
. This expression returns the value of the position to
which point is moved by the first argument to progn
. This
value is then returned by the if
expression of which it is a
part and is passed to kill-region
as kill-region
's
second argument.
In brief, the function works like this: the first argument to
kill-region
is the position of the cursor when the
zap-to-char
command is given--the value of point at that time.
The search function then moves point if the search is successful. The
progn
expression moves point just enough so the zapped to
character is not removed, and returns the value of point after all this
is done. The kill-region
function then removes the region.
Finally, the else-part of the if
expression takes care of the
situation in which the zapped-towards character is not found. If the
argument to the zap-to-char
function is positive (or if none is
given) and the zapped-to character is not found, all the text is
removed from the current position of point to the end of the accessible
region of the buffer (the end of the buffer if there is no narrowing).
If the arg
is negative and the zapped-to character is not found,
the operation goes to the beginning of the accessible region. The code
for this is a simple if
clause:
(if (> arg 0) (point-max) (point-min))
This says that if arg
is a positive number, return the value of
point-max
, otherwise, return the value of point-min
.
For review, here is the code involving kill-region
, with
comments:
(kill-region
(point) ; beginning-of-region
(if (search-forward
(char-to-string char) ; target
nil ; limit-of-search: none
t ; Return nil
if fail.
arg) ; repeat-count.
(progn ; then-part
(goto-char
(if (> arg 0)
(1- (point))
(1+ (point))))
(point))
(if (> arg 0) ; else-part
(point-max)
(point-min))))
As you can see, the version 19 implementation does slightly less than the version 18 implementation, but is much simpler.
Go to the first, previous, next, last section, table of contents.