Mercurial > hg > xemacs-beta
diff man/lispref/markers.texi @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children | 54f7aa390f4f |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/lispref/markers.texi Mon Aug 13 08:45:50 2007 +0200 @@ -0,0 +1,784 @@ +@c -*-texinfo-*- +@c This is part of the XEmacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. +@c See the file lispref.texi for copying conditions. +@setfilename ../../info/markers.info +@node Markers, Text, Positions, Top +@chapter Markers +@cindex markers + + A @dfn{marker} is a Lisp object used to specify a position in a buffer +relative to the surrounding text. A marker changes its offset from the +beginning of the buffer automatically whenever text is inserted or +deleted, so that it stays with the two characters on either side of it. + +@menu +* Overview of Markers:: The components of a marker, and how it relocates. +* 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. +* The Mark:: How ``the mark'' is implemented with a marker. +* The Region:: How to access ``the region''. +@end menu + +@node Overview of Markers +@section Overview of Markers + + A marker specifies a buffer and a position in that buffer. The marker +can be used to represent a position in the functions that require one, +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 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 +idea is that a marker positioned between two characters remains between +those two characters despite insertion and deletion elsewhere in the +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}). + +@cindex marker garbage collection + Insertion and deletion in a buffer must check all the markers and +relocate them if necessary. This slows processing in a buffer with a +large number of markers. For this reason, it is a good idea to make a +marker point nowhere if you are sure you don't need it any more. +Unreferenced markers are garbage collected eventually, but until then +will continue to use time if they do point somewhere. + +@cindex markers as numbers + Because it is common to perform arithmetic operations on a marker +position, most of the arithmetic operations (including @code{+} and +@code{-}) accept markers as arguments. In such cases, the marker +stands for its current position. + +@cindex markers vs. extents + Note that you can use extents to achieve the same functionality, and +more, as markers. (Markers were defined before extents, which is why +they both continue to exist.) A zero-length extent with the +@code{detachable} property removed is almost identical to a marker. +(@xref{Extent Endpoints}, for more information on zero-length extents.) + +In particular: + +@itemize @bullet +@item +In order to get marker-like behavior in a zero-length extent, the +@code{detachable} property must be removed (otherwise, the extent +will disappear when text near it is deleted) and exactly one +endpoint must be closed (if both endpoints are closed, the extent +will expand to contain text inserted where it is located). +@item +If a zero-length extent has the @code{end-open} property but not +the @code{start-open} property (this is the default), text inserted +at the extent's location causes the extent to move forward, just +like a marker. +@item +If a zero-length extent has the @code{start-open} property but not +the @code{end-open} property, text inserted at the extent's location +causes the extent to remain before the text, like what happens to +markers when @code{insert-before-markers} is used. +@item +Markers end up after or before inserted text depending on whether +@code{insert} or @code{insert-before-markers} was called. These +functions do not affect zero-length extents differently; instead, +the presence or absence of the @code{start-open} and @code{end-open} +extent properties determines this, as just described. +@item +Markers are automatically removed from a buffer when they are no +longer in use. Extents remain around until explicitly removed +from a buffer. +@item +Many functions are provided for listing the extents in a buffer or +in a region of a buffer. No such functions exist for markers. +@end itemize + +Here are examples of creating markers, setting markers, and moving point +to markers: + +@example +@group +;; @r{Make a new marker that initially does not point anywhere:} +(setq m1 (make-marker)) + @result{} #<marker in no buffer> +@end group + +@group +;; @r{Set @code{m1} to point between the 99th and 100th characters} +;; @r{in the current buffer:} +(set-marker m1 100) + @result{} #<marker at 100 in markers.texi> +@end group + +@group +;; @r{Now insert one character at the beginning of the buffer:} +(goto-char (point-min)) + @result{} 1 +(insert "Q") + @result{} nil +@end group + +@group +;; @r{@code{m1} is updated appropriately.} +m1 + @result{} #<marker at 101 in markers.texi> +@end group + +@group +;; @r{Two markers that point to the same position} +;; @r{are not @code{eq}, but they are @code{equal}.} +(setq m2 (copy-marker m1)) + @result{} #<marker at 101 in markers.texi> +(eq m1 m2) + @result{} nil +(equal m1 m2) + @result{} t +@end group + +@group +;; @r{When you are finished using a marker, make it point nowhere.} +(set-marker m1 nil) + @result{} #<marker in no buffer> +@end group +@end example + +@node Predicates on Markers +@section Predicates on Markers + + You can test an object to see whether it is a marker, or whether it is +either an integer or a marker or either an integer, a character, or a +marker. The latter tests are useful in connection with the arithmetic +functions that work with any of markers, integers, or characters. + +@defun markerp object +This function returns @code{t} if @var{object} is a marker, @code{nil} +otherwise. Note that integers are not markers, even though many +functions will accept either a marker or an integer. +@end defun + +@defun integer-or-marker-p object +This function returns @code{t} if @var{object} is an integer or a marker, +@code{nil} otherwise. +@end defun + +@defun integer-char-or-marker-p object +This function returns @code{t} if @var{object} is an integer, a +character, or a marker, @code{nil} otherwise. +@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. +@end defun + +@defun number-char-or-marker-p object +This function returns @code{t} if @var{object} is a number (either +kind), a character, or a marker, @code{nil} otherwise. +@end defun + +@node Creating 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 +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 +anywhere. + +@example +@group +(make-marker) + @result{} #<marker in no buffer> +@end group +@end example +@end defun + +@defun point-marker &optional dont-copy-p buffer +This function returns a marker that points to the present position of +point in @var{buffer}, which defaults to the current buffer. +@xref{Point}. For an example, see @code{copy-marker}, below. + +Internally, a marker corresponding to point is always maintained. +Normally the marker returned by @code{point-marker} is a copy; you +may modify it with reckless abandon. However, if optional argument +@var{dont-copy-p} is non-@code{nil}, then the real point-marker is +returned; modifying the position of this marker will move point. +It is illegal to change the buffer of it, or make it point nowhere. +@end defun + +@defun point-min-marker &optional buffer +This function returns a new marker that points to the beginning of the +accessible portion of @var{buffer}, which defaults to the current +buffer. This will be the beginning of the buffer unless narrowing is in +effect. @xref{Narrowing}. +@end defun + +@defun point-max-marker &optional buffer +@cindex end of buffer marker +This function returns a new marker that points to the end of the +accessible portion of @var{buffer}, which defaults to the current +buffer. This will be the end of the buffer unless narrowing is in +effect. @xref{Narrowing}. + +Here are examples of this function and @code{point-min-marker}, shown in +a buffer containing a version of the source file for the text of this +chapter. + +@example +@group +(point-min-marker) + @result{} #<marker at 1 in markers.texi> +(point-max-marker) + @result{} #<marker at 15573 in markers.texi> +@end group + +@group +(narrow-to-region 100 200) + @result{} nil +@end group +@group +(point-min-marker) + @result{} #<marker at 100 in markers.texi> +@end group +@group +(point-max-marker) + @result{} #<marker at 200 in markers.texi> +@end group +@end example +@end defun + +@defun copy-marker marker-or-integer +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. + +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. + +An error is signaled if @var{marker} is neither a marker nor an +integer. + +@example +@group +(setq p (point-marker)) + @result{} #<marker at 2139 in markers.texi> +@end group + +@group +(setq q (copy-marker p)) + @result{} #<marker at 2139 in markers.texi> +@end group + +@group +(eq p q) + @result{} nil +@end group + +@group +(equal p q) + @result{} t +@end group + +@group +(point) + @result{} 2139 +@end group + +@group +(set-marker p 3000) + @result{} #<marker at 3000 in markers.texi> +@end group + +@group +(point) + @result{} 2139 +@end group + +@group +(setq p (point-marker t)) + @result{} #<marker at 2139 in markers.texi> +@end group + +@group +(set-marker p 3000) + @result{} #<marker at 3000 in markers.texi> +@end group + +@group +(point) + @result{} 3000 +@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 + + This section describes the functions for accessing the components of a +marker object. + +@defun marker-position marker +This function returns the position that @var{marker} points to, or +@code{nil} if it points nowhere. +@end defun + +@defun marker-buffer marker +This function returns the buffer that @var{marker} points into, or +@code{nil} if it points nowhere. + +@example +@group +(setq m (make-marker)) + @result{} #<marker in no buffer> +@end group +@group +(marker-position m) + @result{} nil +@end group +@group +(marker-buffer m) + @result{} nil +@end group + +@group +(set-marker m 3770 (current-buffer)) + @result{} #<marker at 3770 in markers.texi> +@end group +@group +(marker-buffer m) + @result{} #<buffer markers.texi> +@end group +@group +(marker-position m) + @result{} 3770 +@end group +@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. + +@node Changing Markers +@section Changing 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 +outside of your program, and, if so, what effects will result from +moving it---otherwise, confusing things may happen in other parts of +Emacs. + +@defun set-marker marker position &optional buffer +This function moves @var{marker} to @var{position} +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 @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}. + +@example +@group +(setq m (point-marker)) + @result{} #<marker at 4714 in markers.texi> +@end group +@group +(set-marker m 55) + @result{} #<marker at 55 in markers.texi> +@end group +@group +(setq b (get-buffer "foo")) + @result{} #<buffer foo> +@end group +@group +(set-marker m 0 b) + @result{} #<marker at 1 in foo> +@end group +@end example +@end defun + +@defun move-marker marker position &optional buffer +This is another name for @code{set-marker}. +@end defun + +@node The Mark +@section The Mark +@cindex mark, the +@cindex mark ring +@cindex global mark ring + + 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} +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}, and usually does so +after each command (other than simple motion commands and some +commands that explicitly activate the mark). When the mark is active, +the region between point and the mark is called the @dfn{active region} +and is highlighted specially. + + Many commands are designed so that when called interactively they +operate on the text between point and the mark. Such commands work +only when an active region exists, i.e. when the mark is active. +(The reason for this is to prevent you from accidentally deleting +or changing large chunks of your text.) If you are writing such +a command, don't examine the mark directly; instead, use +@code{interactive} with the @samp{r} specification. This provides the +values of point and the mark as arguments to the command in an +interactive call, but permits other Lisp programs to specify arguments +explicitly, and automatically signals an error if the command is called +interactively when no active region exists. @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.'') However, only one active region can +exist at a time. Activating the mark in one buffer automatically +deactivates an active mark in any other buffer. Note that the user can +explicitly activate a mark at any time by using the command +@code{activate-region} (normally bound to @kbd{M-C-z}) or by using the +command @code{exchange-point-and-mark} (normally bound to @kbd{C-x C-x}), +which has the side effect of activating the mark. + + Some people do not like active regions, so they disable this behavior +by setting the variable @code{zmacs-regions} to @code{nil}. This makes +the mark always active (except when a buffer is just created and the +mark points nowhere), and turns off the highlighting of the region +between point and the mark. Commands that explicitly retrieve the value +of the mark should make sure that they behave correctly and consistently +irrespective of the setting of @code{zmacs-regions}; some primitives are +provided to ensure this behavior. + + In addition to the mark, each buffer has a @dfn{mark ring} which is a +list of markers containing previous values of the mark. When editing +commands change the mark, they should normally save the old value of the +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. + +@defun mark &optional force buffer +@cindex current buffer mark +This function returns @var{buffer}'s mark position as an integer. +@var{buffer} defaults to the current buffer if omitted. + +If the mark is inactive, @code{mark} normally returns @code{nil}. +However, if @var{force} is non-@code{nil}, then @code{mark} returns the +mark position anyway---or @code{nil}, if the mark is not yet set for +the buffer. + +(Remember that if @var{zmacs-regions} is @code{nil}, the mark is +always active as long as it exists, and the @var{force} argument +will have no effect.) + +If you are using this in an editing command, you are most likely making +a mistake; see the documentation of @code{set-mark} below. +@end defun + +@defun mark-marker inactive-p buffer +This function returns @var{buffer}'s mark. @var{buffer} defaults to the +current buffer if omitted. This is the very marker that records the +mark location inside XEmacs, 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. + +If the mark is inactive, @code{mark-marker} normally returns @code{nil}. +However, if @var{force} is non-@code{nil}, then @code{mark-marker} +returns the mark anyway. +@example +@group +(setq m (mark-marker)) + @result{} #<marker at 3420 in markers.texi> +@end group +@group +(set-marker m 100) + @result{} #<marker at 100 in markers.texi> +@end group +@group +(mark-marker) + @result{} #<marker at 100 in markers.texi> +@end group +@end example + +Like any marker, this marker can be set to point at any buffer you like. +We don't recommend that you make it point at any buffer other than the +one of which it is the mark. If you do, it will yield perfectly +consistent, but rather odd, results. +@end defun + +@ignore +@deffn Command set-mark-command jump +If @var{jump} is @code{nil}, this command sets the mark to the value +of point and pushes the previous value of the mark on the mark ring. The +message @samp{Mark set} is also displayed in the echo area. + +If @var{jump} is not @code{nil}, this command sets point to the value +of the mark, and sets the mark to the previous saved mark value, which +is popped off the mark ring. + +This function is @emph{only} intended for interactive use. +@end deffn +@end ignore + +@defun set-mark position &optional buffer +This function sets @code{buffer}'s mark to @var{position}, and activates +the mark. @var{buffer} defaults to the current buffer if omitted. 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 +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 +@code{push-mark} and @code{pop-mark}, not @code{set-mark}. + +Novice XEmacs Lisp programmers often try to use the mark for the wrong +purposes. The mark saves a location for the user's convenience. An +editing command should not alter the mark unless altering the mark is +part of the user-level functionality of the command. (And, in that +case, this effect should be documented.) To remember a location for +internal use in the Lisp program, store it in a Lisp variable. For +example: + +@example +@group +(let ((beg (point))) + (forward-line 1) + (delete-region beg (point))). +@end group +@end example +@end defun + +@deffn Command exchange-point-and-mark &optional dont-activate-region +This function exchanges the positions of point and the mark. +It is intended for interactive use. The mark is also activated +unless @var{dont-activate-region} is non-@code{nil}. +@end deffn + +@defun push-mark &optional position nomsg activate buffer +This function sets @var{buffer}'s mark to @var{position}, and pushes a +copy of the previous mark onto @code{mark-ring}. @var{buffer} defaults +to the current buffer if omitted. If @var{position} is @code{nil}, then +the value of point is used. @code{push-mark} returns @code{nil}. + +If the last global mark pushed was not in @var{buffer}, also push +@var{position} on the global mark ring (see below). + +The function @code{push-mark} normally @emph{does not} activate the +mark. To do that, specify @code{t} for the argument @var{activate}. + +A @samp{Mark set} message is displayed unless @var{nomsg} is +non-@code{nil}. +@end defun + +@defun pop-mark +This function pops off the top element of @code{mark-ring} and makes +that mark become the buffer's actual mark. This does not move point in +the buffer, and it does nothing if @code{mark-ring} is empty. It +deactivates the mark. + +The return value is not meaningful. +@end defun + +@defvar mark-ring +The value of this buffer-local variable is the list of saved former +marks of the current buffer, most recent first. + +@example +@group +mark-ring +@result{} (#<marker at 11050 in markers.texi> + #<marker at 10832 in markers.texi> + @dots{}) +@end group +@end example +@end defvar + +@defopt mark-ring-max +The value of this variable is the maximum size of @code{mark-ring}. If +more marks than this are pushed onto the @code{mark-ring}, +@code{push-mark} discards an old mark when it adds a new one. +@end defopt + +In additional to a per-buffer mark ring, there is a @dfn{global mark +ring}. Marks are pushed onto the global mark ring the first time you +set a mark after switching buffers. + +@defvar global-mark-ring +The value of this variable is the list of saved former global marks, +most recent first. +@end defvar + +@defopt mark-ring-max +The value of this variable is the maximum size of +@code{global-mark-ring}. If more marks than this are pushed onto the +@code{global-mark-ring}, @code{push-mark} discards an old mark when it +adds a new one. +@end defopt + +@deffn Command pop-global-mark +This function pops a mark off the global mark ring and jumps to that +location. +@end deffn + +@node The Region +@section The Region +@cindex region, the + + The text between point and the mark is known as @dfn{the region}. +Various functions operate on text delimited by point and the mark, but +only those functions specifically related to the region itself are +described here. + + When @code{zmacs-regions} is non-@code{nil} (this is the default), the +concept of an @dfn{active region} exists. The region is active when the +corresponding mark is active. Note that only one active region at a +time can exist -- i.e. only one buffer's region is active at a time. +@xref{The Mark} for more information about active regions. + +@defopt zmacs-regions +If non-@code{nil} (the default), active regions are used. @xref{The Mark}, +for a detailed explanation of what this means. +@end defopt + + A number of functions are provided for explicitly determining the +bounds of the region and whether it is active. Few programs need to use +these functions, however. A command designed to operate on a region +should normally use @code{interactive} with the @samp{r} specification +to find the beginning and end of the region. This lets other Lisp +programs specify the bounds explicitly as arguments and automatically +respects the user's setting for @var{zmacs-regions}. (@xref{Interactive +Codes}.) + +@defun region-beginning &optional buffer +This function returns the position of the beginning of @var{buffer}'s +region (as an integer). This is the position of either point or the +mark, whichever is smaller. @var{buffer} defaults to the current buffer +if omitted. + +If the mark does not point anywhere, an error is signaled. Note that +this function ignores whether the region is active. +@end defun + +@defun region-end &optional buffer +This function returns the position of the end of @var{buffer}'s region +(as an integer). This is the position of either point or the mark, +whichever is larger. @var{buffer} defaults to the current buffer if +omitted. + +If the mark does not point anywhere, an error is signaled. Note that +this function ignores whether the region is active. +@end defun + +@defun region-exists-p +This function is non-@code{nil} if the region exists. If active regions +are in use (i.e. @code{zmacs-regions} is true), this means that the +region is active. Otherwise, this means that the user has pushed a mark +in this buffer at some point in the past. If this function returns @code{nil}, +a function that uses the @samp{r} interactive specification will cause +an error when called interactively. +@end defun + +@defun region-active-p +If @code{zmacs-regions} is true, this is equivalent to +@code{region-exists-p}. Otherwise, this function always returns false. +This function is used by commands such as @code{fill-paragraph-or-region} +and @code{capitalize-region-or-word}, which operate either on the active +region or on something else (e.g. the word or paragraph at point). +@end defun + +@defvar zmacs-region-stays +If a command sets this variable to true, the currently active region +will remain activated when the command finishes. (Normally the region is +deactivated when each command terminates.) If @var{zmacs-regions} is +false, however, this has no effect. Under normal circumstances, you do +not need to set this; use the interactive specification @samp{_} +instead, if you want the region to remain active. +@end defvar + +@defun zmacs-activate-region +This function activates the region in the current buffer (this is +equivalent to activating the current buffer's mark). This will normally +also highlight the text in the active region and set +@var{zmacs-region-stays} to @code{t}. (If @var{zmacs-regions} is false, +however, this function has no effect.) +@end defun + +@defun zmacs-deactivate-region +This function deactivates the region in the current buffer (this is +equivalent to deactivating the current buffer's mark). This will +normally also unhighlight the text in the active region and set +@var{zmacs-region-stays} to @code{nil}. (If @var{zmacs-regions} is +false, however, this function has no effect.) +@end defun + +@defun zmacs-update-region +This function updates the active region, if it's currently active. (If +there is no active region, this function does nothing.) This has the +effect of updating the highlighting on the text in the region; but you +should never need to call this except under rather strange +circumstances. The command loop automatically calls it when +appropriate. Calling this function will call the hook +@code{zmacs-update-region-hook}, if the region is active. +@end defun + +@defvar zmacs-activate-region-hook +This normal hook is called when a region becomes active. (Usually this +happens as a result of a command that activates the region, such as +@code{set-mark-command}, @code{activate-region}, or +@code{exchange-point-and-mark}.) Note that calling +@file{zmacs-activate-region} will call this hook, even if the region is +already active. If @var{zmacs-regions} is false, however, this hook +will never get called under any circumstances. +@end defvar + +@defvar zmacs-deactivate-region-hook +This normal hook is called when an active region becomes inactive. +(Calling @file{zmacs-deactivate-region} when the region is inactive will +@emph{not} cause this hook to be called.) If @var{zmacs-regions} is +false, this hook will never get called. +@end defvar + +@defvar zmacs-update-region-hook +This normal hook is called when an active region is "updated" by +@code{zmacs-update-region}. This normally gets called at the end +of each command that sets @var{zmacs-region-stays} to @code{t}, +indicating that the region should remain activated. The motion +commands do this. +@end defvar + +