Locations within a buffer are recorded as
editor:point
objects. Each point remembers a character position within the buffer and all of the editor functions that manipulate the text of a buffer locate the text using one or more point objects (sometimes the current point).
A point's kind controls what happens to the point when text in the buffer is inserted or deleted.
:temporary
points are for cases where you need read-only access to the buffer. They are like GNU Emacs "points". They have a lower overhead than the other kinds of point and do not need to be explicitly deleted, but do not use them in cases where you make a point, insert or delete text and then use the point again, since they do not move when the text is changed. Also, do not use them in cases where more than one thread can modify their buffer without locking the buffer first (see Buffer locking)
:before-insert
and
:after-insert
points are for cases where you need to make a point, insert or delete text and still use the point afterwards. They are like GNU Emacs "markers". The difference between these two kinds is what happens when text is inserted. For a point at position
n
from the start of the buffer, inserting
len
characters will leave the point at either position
n
or
n
+
len
according to the following table.
When text is deleted,
:before-insert
and
:after-insert
points are treated the same: points <= the start of the deletion remain unchanged, points >= the end of the deletion are moved with the text and points within the deleted region are automatically deleted and cannot be used again.
All points with kind other than
:temporary
are stored within the data structures of the editor buffer so they can be updated when the text changes. A point can be removed from the buffer by editor:delete-point, and point objects are also destroyed if their buffer is killed.
editor:point-kind
point
Returns the kind of the point, which is
:temporary
,
:before-insert
or
:after-insert
.
editor:current-point
Returns the current point.See also editor:buffer-point.
editor:current-mark &optional
pop-p no-error-p
Returns the current mark. If
pop-p
is
t
, the mark is popped off the point ring. If no mark is set and
no-error-p
is
t
,
nil
is returned; otherwise an error is signalled. The default for both of these optional arguments is
nil
.
editor:set-current-mark
point
Sets the current mark to be point .
editor:point<
point1 point2
Returns non-
nil
if
point1
is before
point2
in the buffer.
editor:point>
point1 point2
Returns non-
nil
if
point1
is after
point2
in the buffer.
editor:copy-point
point
&optional
kind new-point
Makes and returns a copy of
point
. The argument
kind
can take the value
:before
,
:after
, or
:temporary
. If
new-point
is supplied, the copied point is bound to that as well as being returned.
editor:delete-point
point
This should be done to any non-temporary point which is no longer needed.
editor:move-point
point new-position
Moves point to new-position , which should itself be a point.
editor:start-line-p
point
Returns
t
if
point
is immediately before the first character in a line, and
nil
otherwise.
editor:end-line-p
point
Returns
t
if
point
is immediately after the last character in a line, and
nil
otherwise.
editor:same-line-p
point1 point2
Returns
t
if
point1
and
point2
are on the same line, and
nil
otherwise.
editor:save-excursion &rest
body
Saves the location of the point and the mark and restores them after completion of body . This restoration is accomplished even when there is an abnormal exit from body .
editor:with-point
point-bindings
&rest
body
point-bindings
is a list of bindings, each of the form
(
var
point
[
kind
])
. Each variable
var
is bound to a new point which is a copy of the point
point
though possibly with a different kind, if
kind
is supplied. If
kind
is not supplied, then the new point has
kind
:temporary
.
The forms of body are evaluated within the scope of the point bindings, and then the points in each variable var are deleted, as if by editor:delete-point. Each point var is deleted even if there was an error when evaluating body .
The main reason for using
with-point
to create non-temporary points is to allow
body
to modify the buffer while keeping these points up to date for later use within
body
.