@c -*-texinfo-*-
@c This is part of the GNU Emacs Lisp Reference Manual.
-@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998 Free Software Foundation, Inc.
+@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999
+@c Free Software Foundation, Inc.
@c See the file elisp.texi for copying conditions.
@setfilename ../info/markers
@node Markers, Text, Positions, Top
@cindex marker relocation
Deleting text around a marker's position leaves the marker between the
characters immediately before and after the deleted text. Inserting
-text at the position of a marker normally leaves the marker in front of
-the new text---unless it is inserted with @code{insert-before-markers}
-(@pxref{Insertion}).
+text at the position of a marker normally leaves the marker either in
+front of or after the new text, depending on the marker's @dfn{insertion
+type} (@pxref{Marker Insertion Types})---unless the insertion is done
+with @code{insert-before-markers} (@pxref{Insertion}).
@cindex marker garbage collection
Insertion and deletion in a buffer must check all the markers and
@end defun
@defun number-or-marker-p object
-This function returns @code{t} if @var{object} is a number (either kind)
-or a marker, @code{nil} otherwise.
+This function returns @code{t} if @var{object} is a number (either
+integer or floating point) or a marker, @code{nil} otherwise.
@end defun
@node Creating Markers
-@section Functions That Create Markers
+@section Functions that Create Markers
When you create a new marker, you can make it point nowhere, or point
to the present position of point, or to the beginning or end of the
marker.
@defun make-marker
-This functions returns a newly created marker that does not point
+This function returns a newly created marker that does not point
anywhere.
@example
@code{copy-marker} returns a new marker that points to the end of the
buffer.
+@example
+@group
+(copy-marker 0)
+ @result{} #<marker at 1 in markers.texi>
+@end group
+
+@group
+(copy-marker 20000)
+ @result{} #<marker at 7572 in markers.texi>
+@end group
+@end example
+
An error is signaled if @var{marker} is neither a marker nor an
integer.
+@end defun
+
+ Two distinct markers are considered @code{equal} (even though not
+@code{eq}) to each other if they have the same position and buffer, or
+if they both point nowhere.
@example
@group
(equal p q)
@result{} t
@end group
-
-@group
-(copy-marker 0)
- @result{} #<marker at 1 in markers.texi>
-@end group
-
-@group
-(copy-marker 20000)
- @result{} #<marker at 7572 in markers.texi>
-@end group
@end example
-@end defun
@node Information from Markers
@section Information from Markers
@end example
@end defun
- Two distinct markers are considered @code{equal} (even though not
-@code{eq}) to each other if they have the same position and buffer, or
-if they both point nowhere.
+@defun buffer-has-markers-at position
+@tindex buffer-has-markers-at
+This function returns @code{t} if one or more markers
+point at position @var{position} in the current buffer.
+@end defun
@node Marker Insertion Types
@section Marker Insertion Types
When you insert text directly at the place where a marker points,
there are two possible ways to relocate that marker: it can point before
the inserted text, or point after it. You can specify which one a given
-marker should do by setting its @dfn{insertion type}.
+marker should do by setting its @dfn{insertion type}. Note that use of
+@code{insert-before-markers} ignores markers' insertion types, always
+relocating a marker to point after the inserted text.
-@tindex set-marker-insertion-type
@defun set-marker-insertion-type marker type
This function sets the insertion type of marker @var{marker} to
-@var{type}. If @var{type} is @code{t}, @var{marker} will advances when
-text is inserted at it. If @var{type} is @code{nil}, @var{marker} does
-not advance when text is inserted there.
+@var{type}. If @var{type} is @code{t}, @var{marker} will advance when
+text is inserted at its position. If @var{type} is @code{nil},
+@var{marker} does not advance when text is inserted there.
@end defun
-@tindex marker-insertion-type
@defun marker-insertion-type marker
This function reports the current insertion type of @var{marker}.
@end defun
One special marker in each buffer is designated @dfn{the mark}. It
records a position for the user for the sake of commands such as
-@kbd{C-w} and @kbd{C-x @key{TAB}}. Lisp programs should set the mark
-only to values that have a potential use to the user, and never for
-their own internal purposes. For example, the @code{replace-regexp}
+@code{kill-region} and @code{indent-rigidly}. Lisp programs should set
+the mark only to values that have a potential use to the user, and never
+for their own internal purposes. For example, the @code{replace-regexp}
command sets the mark to the value of point before doing any
replacements, because this enables the user to move back there
conveniently after the replace is finished.
Once the mark ``exists'' in a buffer, it normally never ceases to
exist. However, it may become @dfn{inactive}, if Transient Mark mode is
-enabled. The variable @code{mark-active}, which is always local in all
-buffers, indicates whether the mark is active: non-@code{nil} means yes.
-A command can request deactivation of the mark upon return to the editor
-command loop by setting @code{deactivate-mark} to a non-@code{nil} value
-(but this causes deactivation only if Transient Mark mode is enabled).
+enabled. The variable @code{mark-active}, which is always buffer-local
+in all buffers, indicates whether the mark is active: non-@code{nil}
+means yes. A command can request deactivation of the mark upon return
+to the editor command loop by setting @code{deactivate-mark} to a
+non-@code{nil} value (but this causes deactivation only if Transient
+Mark mode is enabled).
The main motivation for using Transient Mark mode is that this mode
also enables highlighting of the region when the mark is active.
maximum number of entries in the mark ring; once the list becomes this
long, adding a new element deletes the last element.
+ There is also a separate global mark ring, but that is used only in a
+few particular user-level commands, and is not relevant to Lisp
+programming. So we do not describe it here.
+
@defun mark &optional force
@cindex current buffer mark
This function returns the current buffer's mark position as an integer.
make the mark inactive.
@end defopt
+@defopt mark-even-if-inactive
+If this is non-@code{nil}, Lisp programs and the Emacs user can use the
+mark even when it is inactive. This option affects the behavior of
+Transient Mark mode. When the option is non-@code{nil}, deactivation of
+the mark turns off region highlighting, but commands that use the mark
+behave as if the mark were still active.
+@end defopt
+
@defvar deactivate-mark
If an editor command sets this variable non-@code{nil}, then the editor
-command loop deactivates the mark after the command returns, but only if
-Transient Mark mode is enabled.
+command loop deactivates the mark after the command returns (if
+Transient Mark mode is enabled). All the primitives that change the
+buffer set @code{deactivate-mark}, to deactivate the mark when the
+command is finished.
+
+To write Lisp code that modifies the buffer without causing
+deactivation of the mark at the end of the command, bind
+@code{deactivate-mark} to @code{nil} around the code that does the
+modification. For example:
+
+@example
+(let (deactivate-mark)
+ (insert " "))
+@end example
@end defvar
@defun deactivate-mark
-This function deactivates the mark, but only if Transient Mark mode
-is enabled.
+This function deactivates the mark, if Transient Mark mode is enabled.
+Otherwise it does nothing.
@end defun
@defvar mark-active
The mark is active when this variable is non-@code{nil}. This variable
-is always local in each buffer.
+is always buffer-local in each buffer.
@end defvar
@defvar activate-mark-hook
@example
@group
mark-ring
-@result{} (#<marker at 11050 in markers.texi>
+@result{} (#<marker at 11050 in markers.texi>
#<marker at 10832 in markers.texi>
@dots{})
@end group