|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T l
Length: 51359 (0xc89f)
Types: TextFile
Names: »lispref-14«
└─⟦a05ed705a⟧ Bits:30007078 DKUUG GNU 2/12/89
└─⟦c06c473ab⟧ »./UNRELEASED/lispref.tar.Z«
└─⟦1b57a2ffe⟧
└─⟦this⟧ »lispref-14«
Info file: lispref, -*-Text-*-
produced by texinfo-format-buffer
from file: lispref.texinfo
This file documents GNU Emacs Lisp.
This is Edition 0.1 Beta of the GNU Emacs Lisp Reference Manual, for
Emacs Version 18, with some references to Emacs Version 19.
Please read this document for review purposes.
Published by the Free Software Foundation, 675 Massachusetts Avenue,
Cambridge, MA 02139 USA
Copyright (C) 1989 Free Software Foundation, Inc.
Permission is granted to make and distribute verbatim copies of this
manual provided the copyright notice and this permission notice are
preserved on all copies.
Permission is granted to copy and distribute modified versions of this
manual under the conditions for verbatim copying, provided that the
entire resulting derived work is distributed under the terms of a
permission notice identical to this one.
Permission is granted to copy and distribute translations of this manual
into another language, under the above conditions for modified versions,
except that this permission notice may be stated in a translation
approved by the Foundation.
▶1f◀
File: lispref Node: Motion, Prev: Point, Up: Positions, Next: Excursions
Motion
======
Motion functions change the value of point, either relative to the
current value of point, relative to the beginning or end of the buffer,
or relative to the edges of the selected window.
* Menu:
* Character Motion::
* Lines::
* Goal Column::
* List Motion::
* Skipping Characters::
▶1f◀
File: lispref Node: Character Motion, Prev: Motion, Up: Motion, Next: Lines
Motion by Characters
--------------------
* Command: goto-char POSITION
This function sets point in the current buffer to that position
in the current buffer. If POSITION is less than 1, then point is
set to the beginning of the buffer. If it is greater than the
length of the buffer, then point is set to the end of the buffer.
If a clipping restriction is in effect, then the position is
still measured from the beginning of the buffer, but any position
specified outside of the clipped region will result in point being
placed at either the beginning or the end of the clipped region.
When called interactively, POSITION is the numeric prefix
argument, if provided; otherwise it is read from the minibuffer.
`goto-char' returns POSITION.
* Command: forward-char &optional COUNT
This function moves point forward, towards the end of the buffer,
COUNT characters (or backward, towards the beginning of the buffer,
if COUNT is negative). If the function attempts to move point past
the beginning or end of the buffer (or the limits of the accessible
region when a restriction is in effect), an error is signaled, with
error code `beginning-of-buffer' or `end-of-buffer'.
When called interactively, COUNT is the numeric prefix argument.
* Command: backward-char &optional COUNT
This function moves point backward, towards the beginning of the
buffer, COUNT characters (or forward, towards the end of the
buffer, if COUNT is negative). If the function attempts to move
point past the beginning or end of the buffer (or the limits of the
accessible region when a restriction is in effect), an error is
signaled, with error code `beginning-of-buffer' or `end-of-buffer'.
When called interactively, COUNT is the numeric prefix argument.
* Command: forward-word COUNT
This function moves point forward COUNT words (or backward if
COUNT is negative). Normally it returns `t'. If point encounters
the beginning or end of the buffer or the limits of the accessible
region when a restriction is in effect, point is left there and
`nil' is returned.
When called interactively, COUNT is set to the numeric prefix
argument.
* Command: backward-word COUNT
This function is the exact analog to `forward-word', save that it
moves backward until encountering the front of a word.
When called interactively, COUNT is set to the numeric prefix
argument.
In programs, it is faster to call `forward-word' with negative
argument, as that is all that this function does anyway.
* Command: beginning-of-buffer &optional N
This function moves point to the beginning of the buffer (or the
limits of the accessible region when a restriction is in effect),
leaving the mark at the previous position. If N is non-`nil', then
it puts point N tenths of the way from the beginning of the buffer.
When called interactively, N is the numeric prefix argument, if
provided; otherwise N defaults to `nil'.
Don't use this in Lisp programs! `(goto-char (point-min))' is
faster and does not set the mark.
* Command: end-of-buffer &optional N
This function moves point to the end of the buffer (or the limits
of the accessible region when a restriction is in effect), leaving
the mark at the previous position. If N is non-`nil', then it puts
the point N tenths of the way from the end.
When called interactively, N is the numeric prefix argument, if
provided; otherwise N defaults to `nil'.
Don't use this in Lisp programs! `(goto-char (point-max))' is
faster and does not set the mark.
▶1f◀
File: lispref Node: Lines, Prev: Character Motion, Up: Motion, Next: Goal Column
Lines
-----
Also see `bolp' and `eolp' in *Note Point::.
* Command: goto-line LINE
This function sets point to the front of the LINE'th line,
counting from line 1 at beginning of buffer. If LINE is less than
1, then point is set to the top of the buffer. If it is greater
than the number of lines in the buffer, then point is set to the
*end of the last line* of the buffer.
If a clipping restriction is in effect, then the line is still
measured from the beginning of the buffer, but any line specified
outside of the clipped region will result in point being placed at
either the beginning or end of the clipped region.
The return value is the difference between LINE and the line
number of the line to which point actually was able move, ignoring
any clipping restriction.
When called interactively, LINE is the numeric prefix argument if
one has been provided. Otherwise LINE is prompted for.
* Command: beginning-of-line &optional COUNT
This function moves point to the beginning of the current line.
With an argument COUNT not `nil' or 1, it moves forward, towards
the end of the buffer, (COUNT - 1) lines first. If it reaches the
end of the buffer (or end of the accessible region if a restriction
is in effect), it positions point at the beginning of the last
line. No error is signaled.
* Command: end-of-line &optional COUNT
This function moves point to the end of the current line. With
an argument COUNT not `nil' or 1, it moves forward, towards the end
of the buffer, (COUNT - 1) lines first. If it reaches the end of
the buffer (or end of the accessible region if a restriction is in
effect), it positions point at the end of the last line. No error
is signaled.
* Command: forward-line &optional COUNT
This function moves point to the first column of a line, COUNT
lines forward, towards the end of the buffer, from the present
position. If COUNT is negative, it moves that many lines up.
If there are not that COUNT available to mover over in the buffer
(or the the accessible region if a restriction is in effect), then
the function moves point to the beginning (or end) of the buffer
(or end of the accessible region if a restriction is in effect).
`forward-line' returns the difference between COUNT and the
number of lines actually moved. If you attempt to move down five
lines from thebeginning of a buffer that has only three lines,
point will positioned at the end of the last line, and a value of 2
will be returned.
When called interactively, COUNT will be the numeric prefix
argument.
* Function: vertical-motion COUNT
This function moves point to the start of the line COUNT screen
lines down. If COUNT is negative, it moves up.
If Emacs is continuing a long line of text onto a second or third
line on the diplay, rather than truncating it, this function will
move point according to the number of lines of the display, not the
number of lines that are terminated by newlines characters.
Because continuation depends on the width of the display and
whether truncation is set, this function may work different in
different windows.
If truncation is set, `vertical-motion' is essentially the same
as `forward-line'.
The `vertical-motion' function returns the number of lines moved.
It may be closer to zero than COUNT if the beginning or end of the
buffer was reached.
* Command: move-to-window-line COUNT
This function repositions point relative to the text currently
displayed in the selected window. Point is moved to the beginning
of the line COUNT lines from the top of the window. If COUNT is
negative, point moves either to the beginning of the line -COUNT
lines from the bottom or else to the last line of the buffer if
that point is beyond the end of buffer.
If COUNT is `nil', then point moves to the beginning of the line
in the middle of the window. If the absolute value of COUNT is
greater than the size of the window, then the window scrolls and
that line goes to the middle of the window.
When called interactively, COUNT gets the value of the processed
prefix argument.
The result of the function call is the window line number, with
the top line in the window numbered 0.
* Function: count-lines START END
This function returns the number of lines between the positions
START and END (which are character offsets from the beginning of
the buffer) in the current buffer. If START and END are the same,
then it returns 0. Otherwise it returns at least 1, even if START
and END are on the same line.
(defun current-line ()
"Return the vertical position of point in the selected window.
Top line is 0. Counts each text line only once, even if it wraps."
(+ (count-lines (window-start) (point))
(if (= (current-column) 0) 1 0)
-1))
▶1f◀
File: lispref Node: Goal Column, Prev: Lines, Up: Motion, Next: List Motion
Goal Column
-----------
A goal column is useful if you want to edit a region of text, such as
a table, in which you want to move point to a certain column on each
line. The goal column affects the commands `next-line' and
`previous-line'.
* Variable: goal-column
This global variable determines the goal column for vertical
motion commands. If it is an integer, than all vertical motion
commands have this as their goal. If it is `nil', then the
commands set their own goal columns. Any other value is invalid.
* Variable: temporary-goal-column
This global variable determines the temporary goal column for
vertical motions commands. It is overridden by `goal-column' if
that is non-`nil', and it is set to 9999 if `track-eol' is
non-`nil'. It is set each time a vertical motion command is
invoked, unless the previous command was also a vertical motion
command.
* Variable: track-eol
This global variable controls how the vertical motion commands
(`next-line' and `previous-line') operate when starting at the end
of a line. If `track-eol' is non-`nil', then vertical motion
starting at the end of a line will keep to the ends of lines. This
means moving to the end of each line moved onto.
* Command: set-goal-column UNSET
This command sets the permanent goal column for vertical
movement. If UNSET is `nil', then the goal column is set to the
current column of point. All future vertical motion commands will
have that column as their goal, untill the setting is canceled.
If UNSET is non-`nil', then the permanent goal column is cleared,
and vertical motion commands resume their normal operation.
This function is for interactive use; and when called
interactively, UNSET is the unprocessed prefix argument.
▶1f◀
File: lispref Node: List Motion, Prev: Goal Column, Up: Motion, Next: Skipping Characters
Moving over Lists and Other Balanced Expressions
-------------------------------------------------
Here are several functions concerned with Lisp expressions. *Note
Editing Programs: (emacs)Lists and SexpsAlso *Note Streams::, for
descriptions of related functions; and *Note Syntax Tables::, which
control how these function move across text.
* Command: forward-list ARG
Move forward across ARG balanced groups of parentheses.
* Command: backward-list ARG
Move backward across ARG balanced groups of parentheses.
* Command: up-list ARG
Move forward out of ARG levels of parentheses. A negative argument
means move backward but still to a less deep spot.
* Command: down-list ARG
Move forward down ARG levels of parentheses. A negative argument
means move backward but still go down a level.
* Command: forward-sexp ARG
Move forward across ARG balanced expressions.
* Command: backward-sexp ARG
Move backward across ARG balanced expressions.
▶1f◀
File: lispref Node: Skipping Characters, Prev: List Motion, Up: Motion
Skipping Characters
-------------------
The following two functions move point over a specified set of
characters, such as whitespace characters.
* Function: skip-chars-forward CHARACTER-SET &optional LIMIT
This function moves the point in the current buffer forward,
skipping over a given set of characters. Emacs first examines the
character following the point. If it is matched by CHARACTER-SET,
then point is advanced and the next character is examined. This
continues until a character is found that is not matched.
CHARACTER-SET is like the inside of a `[...]' in a regular
expression except that `]' is never special and `\' quotes `^', `-'
or `\'. Thus, `"a-zA-Z"' skips over all letters, stopping before
the first nonletter, and `"^a-zA-Z'" skips nonletters stopping
before the first letter.
If LIMIT is supplied (it must be a number or a marker), it will
be the maximum position in the buffer that point can be skipped to.
Point will stop at or before LIMIT.
In the example, point is located directly before the `T'. After
evaluating the form, it is located at the end of that line (between
the `t' of `hat' and the newline). This regexp skipped all letters
and spaces, but not newlines.
---------- Buffer: foo ----------
I read "-!-The cat in the hat
comes back" twice.
---------- Buffer: foo ----------
(skip-chars-forward "a-zA-Z ")
=> nil
---------- Buffer: foo ----------
I read "The cat in the hat-!-
comes back" twice.
---------- Buffer: foo ----------
* Function: skip-chars-backward CHARACTER-SET &optional LIMIT
This function moves the point backwards, skipping all characters
in CHARACTER-SET. It is the exact analog of `skip-chars-forward'.
▶1f◀
File: lispref Node: Excursions, Prev: Motion, Up: Positions, Next: Clipping Restrictions
Excursions
==========
Sometimes you need to move point temporarily to another position
within the current buffer or to another buffer entirely. An "excursion"
is such a temporary movement. The `save-excursion' function is used to
keep track of the current buffer and its values of point and mark, so
they can be restored after the completion of the excursion.
The forms for saving and restoring the configuration of windows are
described elsewhere (*Note Window Configurations::).
* Special form: save-excursion FORMS...
The `save-excursion' special form saves the values of point and
mark of the current buffer, records the identity of the buffer,
evaluates FORMS, and then restores the buffer with the saved values
of point and mark. The buffer and its values of point and mark are
restored even in case of an abnormal exit (via throw or error).
The `save-excursion' special form is used more than 500 times in
the Lisp sources. It is the standard way to restore the current
buffer and the values of point and mark after you have changed the
position of point in the current buffer or changed the buffer.
The values of point and mark for other buffers are not saved by
`save-excursion', so any changes made to point and mark in the
other buffers will remain after `save-excursion' exits.
`save-excursion' does not restore window-buffer correspondences
destroyed by functions such as `switch-to-buffer'. One way to
restore the selected window is to use `save-window-excursion'
inside `save-excursion' (*Note Window Configurations::).
The value returned by `save-excursion' is the result of the last
evaluated form, or `nil' if no FORMS are given.
(save-excursion
FORMS)
==
(let ((old-buf (current-buffer))
(old-pnt (point))
(old-mark (marker-position (mark))))
(unwind-protect
(progn FORMS)
(set-buffer old-buf)
(goto-char old-pnt)
(set-marker (mark) old-mark)
))
▶1f◀
File: lispref Node: Clipping Restrictions, Prev: Excursions, Up: Positions
Clipping Restrictions
=====================
"Narrowing" is the act of limiting the text addressable by Emacs
editing commands to a limited range of characters in a buffer. This is
also known as setting a "clipping restriction". A clipping restriction
is denoted by two buffer positions which are the beginning and end of
the restriction. For most editing commands these positions replace the
values of the beginning and end of the buffer. However, some commands
use the true beginning and end of the buffer but signal an error if an
attempt is made to modify text outside the clipping restriction. `Undo'
is an example of this (*Note Undo::).
While a clipping restriction is in effect, no text outside the region
is displayed. No buffer motion functions set the value of point outside
the current clipping restriction. Functions that return buffer
positions are not affected by clipping restrictions. The position
returned is always relative to the true beginning of the buffer.
Buffer saving commands are unaffected by narrowing; the entire buffer
is saved regardless of the current clipping restriction.
* Command: narrow-to-region START END
This function sets the current clipping restriction to start at
START and end at END. Both should be character positions.
When called interactively, START and END are set to the current
region (`region-beginning' and `region-end').
* Command: narrow-to-page MOVE-COUNT
This function sets the clipping restriction to include just the
current page. An optional first argument MOVE-COUNT non-`nil'
means to move forward or backward that many pages, then narrow.
When called interactively, MOVE-COUNT is set to the processed
prefix argument.
* Command: widen
This function removes the clipping restrictions from the current
buffer.
* Special form: save-restriction FORMS...
This special form saves the current clipping restriction,
evaluates FORMS and restores the clipping restriction. The
clipping restriction is restored even in the event of abnormal exit
(throw or error). Point and mark are *not* restored; use
`save-excursion' for that. This is the standard way to arrange
that the clipping restriction be automatically restored if you need
to temporarily change it.
The `save-restriction' special form stores the values of the
beginning and end of the restriction as distances from the
beginning and of the buffer. It records the amount of invisible
text. This is the right thing to do if you want to do further
narrowing.
However, `save-restriction' can be confused if, within the body,
you widen and then make changes outside the area of the saved
restrictions. Instead, if you want to widen a restriction and
change text, you may want to use the `point-min-marker' and
`point-min-marker' functions to return markers to the beginning and
end of the clipped region. Even after text has been added or
removed, the markers will continue to point to the beginning and
end of the region. In addition, you could use the `unwind-protect'
function as a safeguard in the event of an abnormal exit.
Note that if you use both `save-restriction' and
`save-excursion', `save-excursion' should come first. Otherwise,
the old form would be restored with the temporary restriction in
effect, and that action might move point as a side effect.
The value returned by `save-restriction' is that returned by the
last evaluated form, or `nil' if no forms were given.
---------- Buffer: foo ----------
This is the contents of foo
This is the contents of foo
This is the contents of foo
---------- Buffer: foo ----------
(save-excursion
(save-restriction
(narrow-to-region 1 80)
(goto-char (point-min))
(replace-string "foo" "bar")))
---------- Buffer: foo ----------
This is the contents of bar
This is the contents of bar
This is the contents of foo
---------- Buffer: foo ----------
▶1f◀
File: lispref Node: Markers, Prev: Positions, Up: Top, Next: Text
Markers
*******
A "marker" is a Lisp object used to specify a place in a buffer
relative to the surrounding text. A marker changes its offset from the
beginning of the buffer automatically when text is inserted or deleted
so it stays with the surrounding characters.
This is different from a position, which specifies a static offset
from the beginning of the buffer. *Note Positions::, for a complete
description of positions.
Markers have two attributes: a marker position, and a marker buffer.
At any given moment, the position is an offset from the beginning of the
buffer. But the marker position is automatically updated by Emacs as
the buffer is changed. The idea is that a marker positioned between two
characters in a buffer will remain between those two characters, despite
any changes made to the contents of the buffer. Thus, a marker's offset
from the beginning of a buffer may change often during its life.
If the text around a marker is deleted, the marker is repositioned
between the characters before and after the deleted text. If text is
inserted at the position of a marker, the marker remains in front of the
new text unless it is inserted with `insert-before-markers' (*Note
Insertion::). When text is inserted or deleted somewhere before the
marker position (not next to the marker), the marker moves back and
forth with the two surrounding characters.
When a buffer is modified, the positions of all the markers that
follow the modified region in that buffer must be updated to reflect
their current offsets from the beginning of the buffer. This slows
processing in a buffer with a large number of markers. For this reason,
unused markers should be made to point nowhere before they are
discarded. Unreferenced markers will eventually be garbage collected,
but until then, they will continue to be updated.
Because it is quite common to perform arithmetic operations on a
marker position, most of the arithmetic operations (such as, `+' and
`-') accept markers as arguments. In such cases, the current position
of the marker is used.
Here are examples of making, setting and going to markers:
;; Make a new marker that, initially does not point anywhere:
(setq m1 (make-marker))
=> #<marker in no buffer>
;; Set `m1' to point between the 100th and 101st characters.
;; in the current buffer:
(set-marker m1 100)
=> #<marker at 100 in markers.texinfo>
;; Now insert one character at the beginning of the buffer:
(goto-char (point-min))
=> 1
(insert "Q")
=> nil
;; `m1' is updated appropriately.
m1
=> #<marker at 101 in markers.texinfo>
;; Two markers that point to the same position
;; are not `eq', but they are `equal'.
(setq m2 (copy-marker m1))
=> #<marker at 101 in markers.texinfo>
(eq m1 m2)
=> nil
(equal m1 m2)
=> t
;; When you are finished using a marker, make it point nowhere.
(set-marker m1 nil)
=> #<marker in no buffer>
* Menu:
* Predicates on Markers::
* Functions which Create Markers::
* Information from Markers::
* Changing Markers::
* The Mark::
* The Region::
▶1f◀
File: lispref Node: Predicates on Markers, Prev: Markers, Up: Markers, Next: Functions which Create Markers
Predicates on Markers
=====================
You can test an object to see whether it is of the type marker; or
whether it is either an integer or a marker. The latter test is useful
for when you are using the arithmetric functions that work with both
markers and integers.
* Function: markerp OBJECT
This function returns `t' if OBJECT is a marker, `nil' otherwise.
In particular, integers are not markers, even though many functions
will accept either a marker or an integer.
* Function: integer-or-marker-p OBJECT
This function returns `t' if OBJECT is an integer or a marker,
`nil' otherwise.
▶1f◀
File: lispref Node: Functions which Create Markers, Prev: Predicates on Markers, Up: Markers, Next: Information from Markers
Functions which Create Markers
==============================
You can make markers that point nowhere initially, or point to the
present position of point, or point to the the beginning or end of the
accessible region of the buffer. In addition, you can make a second
marker that points to the same place as a given marker.
* Function: make-marker
This functions returns a newly allocated marker which does not
point anywhere.
(make-marker)
=> #<marker in no buffer>
* Function: point-marker
This function returns a new marker which points to the present
position of the point in the current buffer. (See the example for
`copy-marker'.)
* Function: point-min-marker
This function returns a new marker that points to the beginning
of the accessible region of the buffer. This will be the beginning
of the buffer unless a clipping restriction is in effect (i.e.,
unless you have called the `narrow-to-region' function or
`narrow-to-page' function.)
(point-min-marker)
=> #<marker at 1 in markers.texinfo>
(point-max-marker)
=> #<marker at 4703 in markers.texinfo>
(narrow-to-region 100 200)
=> nil
(point-min-marker)
=> #<marker at 100 in markers.texinfo>
(point-max-marker)
=> #<marker at 200 in markers.texinfo>
* Function: point-max-marker
This function returns a new marker that points to the end of the
accessible region of the buffer. This will be the end of the
buffer unless a clipping restriction is in effect (i.e., unless you
have called the `narrow-to-region' function or `narrow-to-page'
function.)
* Function: copy-marker MARKER-OR-INTEGER
If passed a marker as its argument, then `copy-marker' returns a
new marker that points to the same place and the same buffer as
does MARKER-OR-INTEGER. If passed an integer as its argument, then
`copy-marker' returns a new marker that points to position
MARKER-OR-INTEGER in the current buffer.
If passed an argument that is an integer whose value is less than
1, then `copy-marker' returns a new marker that points to the
beginning of the current buffer. If passed an argument that is an
integer whose value is greater than the length of the buffer, then
`copy-marker' returns a new marker that points to the end of the
buffer.
It is an error if MARKER is neither a marker nor an integer.
(setq p (point-marker))
=> #<marker at 2139 in markers.texinfo>
(setq q (copy-marker p))
=> #<marker at 2139 in markers.texinfo>
(eq p q)
=> nil
(equal p q)
=> t
(copy-marker 0)
=> #<marker at 1 in markers.texinfo>
(copy-marker 10000)
=> #<marker at 2324 in markers.texinfo>
▶1f◀
File: lispref Node: Information from Markers, Prev: Functions which Create Markers, Up: Markers, Next: Changing Markers
Information from Markers
========================
You can use information from markers to return to a position and a
buffer that you left earlier, even if you have modified the buffer.
* Function: marker-position MARKER
This function returns the position that MARKER points to, or
`nil' if it points nowhere.
* Function: marker-buffer MARKER
This function returns the buffer that MARKER is in, or `nil' if
it points nowhere.
(setq m (mark-marker))
=> #<marker at 3770 in markers.texinfo>
(marker-buffer m)
=> #<buffer markers.texinfo>
(marker-position m)
=> 3770
(setq m (make-marker))
=> #<marker in no buffer>
(marker-position m)
=> nil
(marker-buffer m)
=> nil
Two markers will be found `equal' (but not `eq') to each other if they
have the same position and buffer, or if they both point nowhere.
▶1f◀
File: lispref Node: Changing Markers, Prev: Information from Markers, Up: Markers, Next: The Mark
Changing Markers
================
When you move the location of an existing marker object, be sure the
marker is not used outside of your program---otherwise, you may cause
unexpected consequences!
* Function: set-marker MARKER POSITION &optional BUFFER
This function moves MARKER to POSITION in BUFFER. If BUFFER is
not provided, it defaults to the current buffer.
If POSITION is less than 1, then `set-marker' will move marker to
the beginning of the buffer. If the value of POSITION is greater
than the size of the buffer, then `set-marker' will move marker to
the end of the buffer.
The value returned is MARKER.
(setq m (point-marker))
=> #<marker at 4714 in markers.texinfo>
(set-marker m 55)
=> #<marker at 55 in markers.texinfo>
(setq b (get-buffer "foo"))
=> #<buffer foo>
(set-marker m 0 b)
=> #<marker at 1 in foo>
* Function: move-marker MARKER POSITION &optional BUFFER
This is another name for `set-marker'.
▶1f◀
File: lispref Node: The Mark, Prev: Changing Markers, Up: Markers, Next: The Region
The Mark
========
A special marker in each buffer is designated the "mark". This marker
is for the user and should not normally be modified by Lisp programs.
Lisp programs should set the mark only to values that have a potential
use to the user. For example, the `replace-regexp' command sets mark to
the value of point before doing any replacements. After the command
completes, the user can go back to where the command began by using `C-x
C-x' (`exchange-point-and-mark').
As a rule, commands should not look at mark directly. Instead, the
command's definition should use `interactive' with the `r'
specification. This will provide the values of point and mark, and
thereby the region between them.
Each buffer has its own value of mark that is independent of the value
of mark in other buffers. When a buffer is created the mark exists, but
it does not point anywhere. We consider this state as ``the absense of
a mark in that buffer''.
In addition to the mark, each buffer has a "mark ring" which is a list
of markers that are the previous values of the mark. When editing
commands change the mark, normally the old value of the mark should be
saved on the mark ring. The mark ring may contain no more than the
maximum number of entries specifed by the variable MARK-RING-MAX; excess
entries are discarded on a first-in-first-out basis.
* Function: mark
This function returns the position of the current buffer's mark
as an integer. `nil' is returned if the mark is not yet set for
this buffer.
* Function: mark-marker
This function returns the current buffer's mark. A buffer's mark
is a marker and obeys all the rules for markers. This function
does not return a copy of the mark, but rather the mark itself.
Changing this marker's position will directly affect region
commands such as `kill-region'.
(setq m (mark-marker))
=> #<marker at 3420 in markers.texinfo>
(set-marker m 100)
=> #<marker at 100 in markers.texinfo>
(mark-marker)
=> #<marker at 100 in markers.texinfo>
Changing a marker's buffer will yield perfectly consistent, if
rather odd, results.
* Command: set-mark-command JUMP
If JUMP is `nil' this command sets the mark to the value of point
and pushes the previous value of mark on the mark ring. The
message `Mark set' is also displayed in the echo area. By
repeating calls to `set-mark-command' with an argument, you can
therefore jump to previous marks. This is very useful.
This function is intended for interactive use, *only*.
* Function: set-mark POSITION
This function sets the mark to POSITION. The old value of the
mark is *not* pushed onto the mark ring.
Don't use this function! That is to say, don't use this function
unless you want the user to see that the mark has moved, and you
want the previous mark position to be lost.
Normally, when a new mark is set, the old one should go on the
`mark-ring'. This is why most applications should use `push-mark'
and `pop-mark', not `set-mark'.
Novice Emacs Lisp programmers often try to use the mark for the
wrong purposes. The mark saves a location for the user's
convenience. Most editing commands should not alter the mark. To
remember a location for internal use in the Lisp program, store it
in a Lisp variable. Example:
(let ((beg (point)))
(forward-line 1)
(delete-region beg (point))).
* Variable: mark-ring
The value of this buffer-local variable is the list of saved
former marks of the current buffer, most recent first.
mark-ring
=> (#<marker at 11050 in markers.texinfo>
#<marker at 10832 in markers.texinfo>
... )
* User Option: mark-ring-max
The value of this global variable is the maximum size of
`mark-ring'. If more marks than this are pushed onto the
`mark-ring', then it starts discarding marks on a first-in,
first-out basis.
* Function: push-mark &optional POSITION NOMSG
This function sets the current buffer's mark to POSITION, and
pushes a copy of the previous mark onto `mark-ring'. If POSITION
is `nil', then the point is used.
A `Mark set' message will be displayed unless NOMSG is non-`nil'.
* Function: pop-mark
This function pops off the top element of `mark-ring' and makes
that mark become the buffer's actual mark. This does not change
the buffer's point and does nothing if `mark-ring' is empty.
▶1f◀
File: lispref Node: The Region, Prev: The Mark, Up: Markers
The Region
==========
The text between point and mark is known as the "region". Various
functions operate on text delimited by point and mark; only those
functions specifically related to the region itself are described here.
See `buffer-substring' in *Note Buffer Contents::.
Note that few programs ever need to use the `region-beginning' and
`region-end' functions; and do not be tempted to use these functions in
commands to operate on a region. Use `interactive' with the `r'
specification instead. (*Note Interactive Codes::.)
* Function: region-beginning
This function returns the position of the beginning of the
region. This will be the position of either point or mark,
whichever is smaller.
If the mark does not point anywhere, an error is signaled.
* Function: region-end
This function returns the position of the end of the region.
This will be the position of either point or mark, whichever is
larger.
If the mark does not point anywhere, an error is signaled.
▶1f◀
File: lispref Node: Text, Prev: Markers, Up: Top, Next: Searching and Matching
Text
****
This chapter is about those functions that deal with the text of a
buffer. Most of these functions insert or delete text in whichever
buffer is current. Most of them are interactive functions and perform
their changes either directly in front of or directly following point.
Some text-related functions put text into the "kill ring", others do
not; but all the changes they make can be undone so long as the buffer
has undo enabled (*Note Undo::.)
Many text-related functions operate on a region of text defined by two
locations in the buffer, named START and END. These arguments should be
either markers or or numeric character positions that count from the
beginning of the buffer.
Since text-related functions always operate on the text between the
two locations, START and END, the order in which the locations are given
is not important. For example, `(delete-region 1 10)' and
`(delete-region 10 1)' perform identically. It is an
`args-out-of-range' error if either location does not indicate an
existing position in the buffer.
Throughout this chapter, `text' refers to the characters in the
buffer.
* Menu:
* Insertion::
* Deletion::
* The Kill Ring::
* Undo::
* Auto Filling::
* Filling::
* Sorting::
* Indentation::
* Indent Tabs::
* Columns::
* Case Changes::
* Underlining::
* Registers::
▶1f◀
File: lispref Node: Insertion, Prev: Text, Up: Text, Next: Deletion
Insertion
=========
Insertion takes place at point; normally markers which pointed at point
before the insertion end up pointing before the inserted text. Point
may end up either before or after inserted text, depending on the
function used.
* Function: insert &rest ARGS
This function inserts any number of strings or characters into
the current buffer, at point, moving point forward. It is an error
unless all ARGS are either strings or characters.
Any markers pointing after point are relocated. Any markers
pointing at point or before are unchanged.
* Function: insert-before-markers &rest ARGS
This function inserts any number of strings or characters into
the current buffer, at point, moving point forward. It is an error
unless all ARGS are either strings or characters.
Unlike `insert', any markers whose position equals point are
relocated to come after the newly inserted text.
* Function: insert-char CHARACTER COUNT
This function inserts COUNT instances of CHARACTER into the
current buffer before the point. COUNT must be a number, and
CHARACTER must be a character.
* Command: copy-to-buffer TO-BUFFER START END
This function copies text from the current buffer to TO-BUFFER.
TO-BUFFER is first erased (with no questions asked), and then the
text in the region defined by START and END is inserted into that
buffer.
When called interactively, TO-BUFFER is prompted for in the
minibuffer, and START and END are bound to the value of the point
and mark (i.e., to the values of the beginning and end of the
region).
* Function: insert-buffer-substring FROM-BUFFER-OR-NAME START END
This function inserts a substring of FROM-BUFFER-OR-NAME (which
must exist) into the current buffer before the point. The string
is those characters in the region defined by START and END.
In the example, the form is executed with buffer `bar' as the
current buffer. We assume that buffer `bar' is initially empty.
---------- Buffer: foo ----------
We hold these truths to be self-evident, that all
---------- Buffer: foo ----------
(insert-buffer-substring "foo" 1 20)
=> nil
---------- Buffer: bar ----------
We hold these truth
---------- Buffer: bar ----------
* Function: insert-buffer FROM-BUFFER-OR-NAME
This function inserts the entire contents of FROM-BUFFER-OR-NAME
(which must exist) into the current buffer after the point. It
leaves the mark after the inserted text.
* Command: quoted-insert COUNT
This function reads the next input character verbatim and
inserts it. It is primarily useful for inserting control
characters. You may also type up to 3 octal digits, to insert a
character with that code.
COUNT is the number of these characters to insert. It is an
error if COUNT is not a number, or if the current buffer is
read-only.
Programs rarely want to use this function, but might want to put
it on a keymap.
This function is primarily for interactive use.
* Command: self-insert-command COUNT
This function inserts the last character typed COUNT times. This
is the function that most printing characters are bound to.
Programs rarely want to use this, but might want to put it on a
keymap.
This function calls `auto-fill-hook'. (In version 19,
`auto-fill-function' has been renamed `auto-fill-function' since it
is not called by the `run-hooks' function.)
In everyday use, `self-insert-command' is the most frequently
called function in Emacs!
▶1f◀
File: lispref Node: Commands for Insertion
Commands for Insertion
----------------------
* Command: newline &optional NUMBER-OF-NEWLINES
This function inserts newlines into the current buffer before the
point. If NUMBER-OF-NEWLINES is supplied (and is a number), that
many newline characters are inserted.
In Auto Fill mode, `newline' can break the preceding line if
COUNT is not supplied.
When called interactively, COUNT is the processed prefix
argument.
* Command: split-line
This function splits the current line, moving the portion of the
line after point down vertically, so that it is on the next line
directly below where it was before. Whitespace is inserted at the
beginning of the lower line as needed by the `indent-to' function
with a combination of tabs and spaces. `split-line' returns the
position of point.
In the example, point is located between the `t' and the `h' when
`(split-line)' is called. The second line in the result contains
one tab and one space before the `h'. Point is still located at
the end of the first line, directly after the `t'.
---------- Buffer: foo ----------
This is t-!-he line before
---------- Buffer: foo ----------
(split-line)
=> 4433
---------- Buffer: foo ----------
This is t-!-
he line before
---------- Buffer: foo ----------
Programs hardly ever use this function.
* Command: open-line COUNT
This function inserts COUNT newlines into the current buffer
after point, leaving point where it was.
When called interactively, COUNT is the processed prefix
argument. Programs hardly ever use this function.
* Command: overwrite-mode ARGUMENT
This function turns overwrite mode on and off. If ARGUMENT is a
positive number (greater than zero), then it is turned on,
otherwise it is turned off. In overwrite mode, typed-in printable
characters replace existing text character for character, and do
not push the existing text to the right.
This function only effects the self-insertion command.
When called interactively, ARGUMENT is set to the processed
prefix argument.
▶1f◀
File: lispref Node: Deletion, Prev: Insertion, Up: Text, Next: The Kill Ring
Deletion
========
All of the deletion functions operate on the current buffer, and they
all return a value of `nil'. None of them put their deleted text into
the kill ring unless otherwise noted.
In general, functions that have ``delete'' in their names do not put
text into the kill ring, while corresponding functions with ``kill'' in
their names do (compare: `delete-region' and `kill-region'). From
programs, you will usually want to use a ``delete'' function as opposed
to a ``kill'' function, since the kill ring is for the user.
* Function: erase-buffer
This function deletes the entire text of the current buffer. If
the buffer is read-only, it signals a `buffer-read-only' error.
Otherwise it does not complain, even if erasing a buffer visiting a
modified file. It does not kill the buffer.
* Command: delete-region START END
This function deletes the text in the current buffer in the
region defined by START and END.
* Command: delete-horizontal-space
This function deletes all spaces and tabs around point.
In the examples, point is between the second and third characters
on each of the lines when the function is called.
---------- Buffer: foo ----------
I -!-thought
I -!- thought
We-!- thought
Yo-!-u thought
---------- Buffer: foo ----------
(delete-horizontal-space)
=> nil
---------- Buffer: foo ----------
Ithought
Ithought
Wethought
You thought
---------- Buffer: foo ----------
* Command: delete-indentation &optional JOIN-FOLLOWING-P
This function joins the line point is on to the previous line and
deletes all the whitespace at the join, save for one space. If
JOIN-FOLLOWING-P is non-`nil', `delete-indentation' joins this line
to following line instead.
In the example below, point is located on the line starting
`events', and it makes no difference if there are trailing spaces.
---------- Buffer: foo ----------
When in the course of human
-!- events, it becomes necessary
---------- Buffer: foo ----------
(delete-indentation)
=> nil
---------- Buffer: foo ----------
When in the course of human-!- events, it becomes necessary
---------- Buffer: foo ----------
* Function: fixup-whitespace
This function replaces white space between the objects on either
side of point with either one space or no space as appropriate.
The function leaves one space if point is in the middle of a line
that has printing characters somewhere before and after it (except
in a few cases described below). When point is at the beginning or
end of a line, this function leaves no spaces.
`fixup-whitespace' does not leave any space when point is located
directly after a character whose syntax class is ``open
parenthesis'' `(', directly before a character whose syntax class
is ``close parenthesis'' `)', or directly before a character whose
syntax class is ``Expression Prefix Operator'' `''.
In the example, point starts out at the beginning of the second
line, when `fixup-whitespace' is called the first time. It is
located directly after the `(' for the second invocation.
---------- Buffer: foo ----------
This has too many spaces
-!- at the front of this line
This has too many spaces at the start of (-!- this list)
---------- Buffer: foo ----------
(fixup-whitespace)
=> nil
(fixup-whitespace)
=> nil
---------- Buffer: foo ----------
This has too many spaces
at the front of this line
This has too many spaces at the start of (this list)
---------- Buffer: foo ----------
* Command: just-one-space
Delete all spaces and tabs around point, leaving one space.
* Command: delete-blank-lines
This function deletes blank lines surrounding point. If point is
on a blank line with one or more blank lines before or after it,
then all but one of them are deleted. If point is on an isolated
blank line, then it is deleted. If point is on a nonblank line, it
deletes all blank lines following it.
A blank line is defined as any line consisting of a newline and
nothing else except tabs and spaces.
`delete-blank-lines' returns `nil'.
* Command: delete-char COUNT &optional KILLP
This function deletes COUNT characters directly after point
(before, if COUNT is negative).
If KILLP is non-`nil', then it saves the deleted characters in
the kill ring.
When called interactively, COUNT is the processed prefix
argument, and KILLP is set to `t' if COUNT is greater than 1.
* Command: delete-backward-char COUNT &optional KILLP
This function deletes COUNT characters directly before point
(after, if COUNT is negative).
If KILLP is non-`nil', then it saves the deleted characters in
the kill ring.
When called interactively, COUNT is the processed prefix
argument, and KILLP is set to `t' if COUNT is greater than 1.
* Command: backward-delete-char-untabify COUNT &optional KILLP
This function deletes COUNT characters backward, changing tabs
into spaces. When changing tabs into spaces, a sufficient number
of spaces are inserted into the buffer to keep point in the same
column. These spaces are then deleted by `delete-backward-char'.
If COUNT is negative, then tabs are not changed to spaces, and
the characters are deleted by calling `delete-backward-char' with
COUNT.
If KILLP is non-`nil', then it saves the deleted characters in
the kill ring.
When called interactively, COUNT is the processed prefix
argument, and KILLP is set to `t' if COUNT is greater than 1.
▶1f◀