123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733 |
- @c -*-texinfo-*-
- @c This is part of the GNU Emacs Lisp Reference Manual.
- @c Copyright (C) 1990-1995, 1998-1999, 2001-2016 Free Software
- @c Foundation, Inc.
- @c See the file elisp.texi for copying conditions.
- @node Markers
- @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.
- * 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
- @node Overview of Markers
- @section Overview of Markers
- A marker specifies a buffer and a position in that buffer. A
- marker can be used to represent a position in functions that
- require one, just as an integer could be used. In that case, the
- marker's buffer is normally ignored. Of course, a marker used in this
- way usually points to a position in the buffer that the function
- operates on, but that is entirely the programmer's responsibility.
- @xref{Positions}, for a complete description of positions.
- A marker has three attributes: the marker position, the marker
- buffer, and the insertion type. 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 during
- the life of the marker, and often does. 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 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
- 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.
- Markers that can no longer be accessed are eventually removed
- (@pxref{Garbage Collection}).
- @cindex markers as numbers
- Because it is common to perform arithmetic operations on a marker
- position, most of these operations (including @code{+} and
- @code{-}) accept markers as arguments. In such cases, the marker
- stands for its current position.
- 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
- @cindex predicates for markers
- @cindex markers, predicates for
- You can test an object to see whether it is a marker, or whether it is
- either an integer or a marker. The latter test is useful in connection
- with the arithmetic functions that work with both markers and integers.
- @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 number-or-marker-p object
- 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
- @cindex creating markers
- @cindex marker creation
- 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.
- The next four functions all return markers with insertion type
- @code{nil}. @xref{Marker Insertion Types}.
- @defun make-marker
- This function 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
- This function returns a new marker that points to the present position
- of point in the current buffer. @xref{Point}. For an example, see
- @code{copy-marker}, below.
- @end defun
- @defun point-min-marker
- This function returns a new marker that points to the beginning of the
- accessible portion of the buffer. This will be the beginning of the
- buffer unless narrowing is in effect. @xref{Narrowing}.
- @end defun
- @defun point-max-marker
- This function returns a new marker that points to the end of the
- accessible portion of the 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 24080 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 &optional 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}.
- @c This behavior used to be documented until 2013/08.
- @ignore
- 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.
- @end ignore
- @example
- @group
- (copy-marker 0)
- @result{} #<marker at 1 in markers.texi>
- @end group
- @group
- (copy-marker 90000)
- @result{} #<marker at 24080 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
- (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
- @end example
- @node Information from Markers
- @section Information from Markers
- @cindex marker information
- 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.
- @c FIXME: The 'buffer' argument of 'set-marker' already defaults to
- @c the current buffer, why use '(current-buffer)' explicitly here?
- @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
- @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
- Most functions that create markers, without an argument allowing to
- specify the insertion type, create them with insertion type
- @code{nil}. Also, the mark has, by default, insertion type
- @code{nil}.
- @node Moving Markers
- @section Moving Marker Positions
- @cindex moving markers
- @cindex marker, how to move position
- 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.
- @c This behavior used to be documented until 2013/08.
- @ignore
- 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 (@pxref{Point}), @code{set-marker} moves marker to
- the end of the buffer.
- @end ignore
- 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
- @c @cindex the mark?
- Each buffer has a special marker, which is designated @dfn{the
- mark}. When a buffer is newly created, this marker exists but does
- not point anywhere; this means that the mark doesn't exist in that
- buffer yet. Subsequent commands can set the mark.
- The mark specifies a position to bound a range of text for many
- commands, such as @code{kill-region} and @code{indent-rigidly}. These
- commands typically act on the text between point and the mark, which
- is called the @dfn{region}. If you are writing a command that
- operates on the region, 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. @xref{Interactive Codes}.
- Some commands set the mark as a side-effect. Commands should do
- this only if it has 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 buffer-local variable @code{mark-active}, if
- non-@code{nil}, means that the mark is active. A command can call the
- function @code{deactivate-mark} to deactivate the mark directly, or it
- can request deactivation of the mark upon return to the editor command
- loop by setting the variable @code{deactivate-mark} to a
- non-@code{nil} value.
- If Transient Mark mode is enabled, certain editing commands that
- normally apply to text near point, apply instead to the region when
- the mark is active. This is the main motivation for using Transient
- Mark mode. (Another is that this enables highlighting of the region
- when the mark is active. @xref{Display}.)
- @cindex mark ring
- 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.
- 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,
- or @code{nil} if no mark has ever been set in this buffer.
- If Transient Mark mode is enabled, and @code{mark-even-if-inactive} is
- @code{nil}, @code{mark} signals an error if the mark is inactive.
- However, if @var{force} is non-@code{nil}, then @code{mark} disregards
- inactivity of the mark, and returns the mark position (or @code{nil})
- anyway.
- @end defun
- @defun mark-marker
- This function returns the marker that represents the current buffer's
- mark. It is not a copy, it is the marker used internally. Therefore,
- changing this marker's position will directly affect the buffer's
- mark. Don't do that unless that is the effect you want.
- @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. If you make it point at any buffer other than the one of which
- it is the mark, it will yield perfectly consistent, but rather odd,
- results. We recommend that you not do it!
- @end defun
- @defun set-mark position
- 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
- 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 Emacs 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
- @defun push-mark &optional position nomsg activate
- This function sets the current buffer's mark to @var{position}, and
- pushes a copy of the previous mark onto @code{mark-ring}. If
- @var{position} is @code{nil}, then the value of point is used.
- @c Doesn't seem relevant.
- @c @code{push-mark} returns @code{nil}.
- 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.
- @c
- @c Seems even less relevant.
- @c The return value is not meaningful.
- @end defun
- @defopt transient-mark-mode
- This variable, if non-@code{nil}, enables Transient Mark mode. In
- Transient Mark mode, every buffer-modifying primitive sets
- @code{deactivate-mark}. As a consequence, most commands that modify
- the buffer also deactivate the mark.
- When Transient Mark mode is enabled and the mark is active, many
- commands that normally apply to the text near point instead apply to
- the region. Such commands should use the function @code{use-region-p}
- to test whether they should operate on the region. @xref{The Region}.
- Lisp programs can set @code{transient-mark-mode} to non-@code{nil},
- non-@code{t} values to enable Transient Mark mode temporarily. If the
- value is @code{lambda}, Transient Mark mode is automatically turned
- off after any action, such as buffer modification, that would normally
- deactivate the mark. If the value is @w{@code{(only . @var{oldval})}},
- then @code{transient-mark-mode} is set to the value @var{oldval} after
- any subsequent command that moves point and is not shift-translated
- (@pxref{Key Sequence Input, shift-translation}), or after any other
- action that would normally deactivate the mark.
- @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 (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. Setting this variable makes it buffer-local.
- 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 &optional force
- If Transient Mark mode is enabled or @var{force} is non-@code{nil},
- this function deactivates the mark and runs the normal hook
- @code{deactivate-mark-hook}. Otherwise, it does nothing.
- @end defun
- @defvar mark-active
- The mark is active when this variable is non-@code{nil}. This
- variable is always buffer-local in each buffer. Do @emph{not} use the
- value of this variable to decide whether a command that normally
- operates on text near point should operate on the region instead. Use
- the function @code{use-region-p} for that (@pxref{The Region}).
- @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 the command loop if the mark is active and it
- is possible that the region may have changed.
- @ignore
- This piece of command_loop_1, run unless deactivating the mark:
- if (current_buffer != prev_buffer || MODIFF != prev_modiff)
- {
- Lisp_Object hook = intern ("activate-mark-hook");
- Frun_hooks (1, &hook);
- }
- @end ignore
- @end defvar
- @defun handle-shift-selection
- This function implements the shift-selection behavior of
- point-motion commands. @xref{Shift Selection,,, emacs, The GNU Emacs
- Manual}. It is called automatically by the Emacs command loop
- whenever a command with a @samp{^} character in its @code{interactive}
- spec is invoked, before the command itself is executed
- (@pxref{Interactive Codes, ^}).
- If @code{shift-select-mode} is non-@code{nil} and the current command
- was invoked via shift translation (@pxref{Key Sequence Input,
- shift-translation}), this function sets the mark and temporarily
- activates the region, unless the region was already temporarily
- activated in this way. Otherwise, if the region has been activated
- temporarily, it deactivates the mark and restores the variable
- @code{transient-mark-mode} to its earlier value.
- @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
- @c There is also global-mark-ring-max, but this chapter explicitly
- @c does not talk about the global mark.
- @cindex @code{delete-selection}, symbol property
- @findex delete-selection-helper
- @findex delete-selection-pre-hook
- When Delete Selection mode (@pxref{Using Region, Delete Selection, ,
- emacs, The GNU Emacs Manual}) is enabled, commands that operate on the
- active region (a.k.a.@: ``selection'') behave slightly differently.
- This works by adding the function @code{delete-selection-pre-hook} to
- the @code{pre-command-hook} (@pxref{Command Overview}). That function
- calls @code{delete-selection-helper} to delete the selection as
- appropriate for the command. If you want to adapt a command to Delete
- Selection mode, put the @code{delete-selection} property on the
- function's symbol (@pxref{Symbol Plists}); commands that don't have
- this property on their symbol won't delete the selection. This
- property can have one of several values to tailor the behavior to what
- the command is supposed to do; see the doc strings of
- @code{delete-selection-pre-hook} and @code{delete-selection-helper}
- for the details.
- @node The Region
- @section The Region
- @c The index entry must be just "region" to make it the first hit
- @c when the user types "i region RET", because otherwise the Info
- @c reader will present substring matches in alphabetical order,
- @c putting this one near the end, with something utterly unrelated as
- @c the first hit.
- @cindex region
- 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.
- The next two functions signal an error if the mark does not point
- anywhere. If Transient Mark mode is enabled and
- @code{mark-even-if-inactive} is @code{nil}, they also signal an error
- if the mark is inactive.
- @defun region-beginning
- This function returns the position of the beginning of the region (as
- an integer). This is the position of either point or the mark,
- whichever is smaller.
- @end defun
- @defun region-end
- This function returns the position of the end of the region (as an
- integer). This is the position of either point or the mark, whichever is
- larger.
- @end defun
- @c FIXME: Mention it in tips.texi?
- Instead of using @code{region-beginning} and @code{region-end}, 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. @xref{Interactive Codes}.
- @defun use-region-p
- This function returns @code{t} if Transient Mark mode is enabled, the
- mark is active, and there is a valid region in the buffer. This
- function is intended to be used by commands that operate on the
- region, instead of on text near point, when the mark is active.
- @cindex empty region
- @vindex use-empty-active-region
- A region is valid if it has a non-zero size, or if the user option
- @code{use-empty-active-region} is non-@code{nil} (by default, it is
- @code{nil}). The function @code{region-active-p} is similar to
- @code{use-region-p}, but considers all regions as valid. In most
- cases, you should not use @code{region-active-p}, since if the region
- is empty it is often more appropriate to operate on point.
- @end defun
|