*** empty log message ***
[bpt/emacs.git] / lispref / markers.texi
index 1e7ceeb..e18e987 100644 (file)
@@ -1,6 +1,7 @@
 @c -*-texinfo-*-
 @c This is part of the GNU Emacs Lisp Reference Manual.
-@c Copyright (C) 1990, 1991, 1992, 1993, 1994 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
@@ -17,7 +18,9 @@ deleted, so that it stays with the two characters on either side of it.
 * Predicates on Markers::    Testing whether an object is a marker.
 * Creating Markers::         Making empty markers or markers at certain places.
 * Information from Markers:: Finding the marker's buffer or character position.
-* Changing Markers::         Moving the marker to a new buffer or position.
+* Marker Insertion Types::   Two ways a marker can relocate when you
+                               insert where it points.
+* Moving Markers::           Moving the marker to a new buffer or position.
 * The Mark::                 How ``the mark'' is implemented with a marker.
 * The Region::               How to access ``the region''.
 @end menu
@@ -31,7 +34,7 @@ just as an integer could be used.  @xref{Positions}, for a complete
 description of positions.
 
   A marker has two attributes: the marker position, and the marker
-buffer.  The marker position is an integer which is equivalent (at a
+buffer.  The marker position is an integer that is equivalent (at a
 given time) to the marker as a position in that buffer.  But the
 marker's position value can change often during the life of the marker.
 Insertion and deletion of text in the buffer relocate the marker.  The
@@ -42,9 +45,10 @@ buffer.  Relocation changes the integer equivalent of the marker.
 @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
@@ -128,12 +132,12 @@ This function returns @code{t} if @var{object} is an integer or a marker,
 @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
@@ -141,7 +145,7 @@ accessible portion of the buffer, or to the same place as another given
 marker.
 
 @defun make-marker
-This functions returns a newly allocated marker that does not point
+This function returns a newly created marker that does not point
 anywhere.
 
 @example
@@ -197,21 +201,41 @@ chapter.
 @end example
 @end defun
 
-@defun copy-marker marker-or-integer
+@defun copy-marker marker-or-integer insertion-type
 If passed a marker as its argument, @code{copy-marker} returns a
 new marker that points to the same place and the same buffer as does
 @var{marker-or-integer}.  If passed an integer as its argument,
 @code{copy-marker} returns a new marker that points to position
 @var{marker-or-integer} in the current buffer.
 
+The new marker's insertion type is specified by the argument
+@var{insertion-type}.  @xref{Marker Insertion Types}.
+
 If passed an integer argument less than 1, @code{copy-marker} returns a
 new marker that points to the beginning of the current buffer.  If
 passed an integer argument greater than the length of the buffer,
 @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
@@ -233,18 +257,7 @@ integer.
 (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
@@ -290,12 +303,36 @@ This function returns the buffer that @var{marker} points into, or
 @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
+
+@cindex insertion type of a marker
+  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}.  Note that use of
+@code{insert-before-markers} ignores markers' insertion types, always
+relocating a marker to point after the inserted text.
+
+@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 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
+
+@defun marker-insertion-type marker
+This function reports the current insertion type of @var{marker}.
+@end defun
 
-@node Changing Markers
-@section Changing Marker Positions
+@node Moving Markers
+@section Moving Marker Positions
 
   This section describes how to change the position of an existing
 marker.  When you do this, be sure you know whether the marker is used
@@ -309,10 +346,10 @@ in @var{buffer}.  If @var{buffer} is not provided, it defaults to
 the current buffer.
 
 If @var{position} is less than 1, @code{set-marker} moves @var{marker}
-to the beginning of the buffer.  If the value of @var{position} is
-greater than the size of the buffer, @code{set-marker} moves marker to
-the end of the buffer.  If @var{position} is @code{nil} or a marker that
-points nowhere, then @var{marker} is set to point nowhere.
+to the beginning of the buffer.  If @var{position} is greater than the
+size of the buffer, @code{set-marker} moves marker to the end of the
+buffer.  If @var{position} is @code{nil} or a marker that points
+nowhere, then @var{marker} is set to point nowhere.
 
 The value returned is @var{marker}.
 
@@ -347,9 +384,9 @@ This is another name for @code{set-marker}.
 
   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.
@@ -365,15 +402,15 @@ explicitly.  @xref{Interactive Codes}.
   Each buffer has its own value of the mark that is independent of the
 value of the mark in other buffers.  When a buffer is created, the mark
 exists but does not point anywhere.  We consider this state as ``the
-absence of a mark in that buffer''.
+absence of a mark in that buffer.''
 
   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 deactivation only follows if Transient
+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
@@ -387,6 +424,10 @@ mark on the mark ring.  The variable @code{mark-ring-max} specifies the
 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.
@@ -399,7 +440,7 @@ this buffer.
 
 @defun mark-marker
 This function returns the current buffer's mark.  This is the very marker
-which records the mark location inside Emacs, not a copy.  Therefore,
+that records the mark location inside Emacs, not a copy.  Therefore,
 changing this marker's position will directly affect the position of the mark.
 Don't do it unless that is the effect you want.
 
@@ -442,7 +483,7 @@ This function is @emph{only} intended for interactive use.
 This function sets the mark to @var{position}, and activates the mark.
 The old value of the mark is @emph{not} pushed onto the mark ring.
 
-@strong{Please note:} use this function only if you want the user to
+@strong{Please note:} Use this function only if 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
 @code{mark-ring}.  For this reason, most applications should use
@@ -497,28 +538,44 @@ The return value is not meaningful.
 
 @defopt transient-mark-mode
 @cindex Transient Mark mode
-This variable enables Transient Mark mode, in which every
-buffer-modifying primitive sets @code{deactivate-mark}.  The consequence
-of this is that commands that modify the buffer normally make the mark
-inactive.
+This variable if non-@code{nil} enables Transient Mark mode, in which
+every buffer-modifying primitive sets @code{deactivate-mark}.  The
+consequence of this is that commands that modify the buffer normally
+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.
+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.
 @end defvar
 
+@defun deactivate-mark
+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
 @defvarx deactivate-mark-hook
 These normal hooks are run, respectively, when the mark becomes active
-and when it becomes inactive.  The hook @code{activate-mark-hook} is also
-run at the end of a command if the mark is active and the region may
-have changed.
+and when it becomes inactive.  The hook @code{activate-mark-hook} is
+also run at the end of a command if the mark is active and it is
+possible that the region may have changed.
 @end defvar
 
 @defvar mark-ring