]> code.delx.au - gnu-emacs/blobdiff - lispref/markers.texi
Condense Tramp entries.
[gnu-emacs] / lispref / markers.texi
index ef991890a18b40f53b12f360acdc571bbf4881c8..dec9396a7877d394dd3dd043da8e4178d9e356ec 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
@@ -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 created 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 Changing Markers
-@section Changing Marker Positions
+@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 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
@@ -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.
@@ -369,11 +406,12 @@ 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 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.
@@ -386,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.
@@ -496,34 +538,54 @@ 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, 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
 @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
@@ -533,7 +595,7 @@ marks of the current buffer, most recent first.
 @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