1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2025-01-04 11:40:22 +00:00

(Insertion): Add insert-buffer-substring-no-properties.

(Kill Functions): kill-region has new arg yank-handler.
(Yanking): New node.
(Yank Commands): Add yank-undo-function.
(Low-Level Kill Ring):
kill-new and kill-append have new arg yank-handler.
(Changing Properties): Add remove-list-of-text-properties.
(Atomic Changes): New node.
This commit is contained in:
Richard M. Stallman 2003-08-13 17:28:31 +00:00
parent 55ccf8be37
commit d73eac4dc3

View File

@ -58,6 +58,7 @@ the character after point.
position stored in a register.
* Base 64:: Conversion to or from base 64 encoding.
* MD5 Checksum:: Compute the MD5 ``message digest''/``checksum''.
* Atomic Changes:: Installing several buffer changs ``atomically''.
* Change Hooks:: Supplying functions to be run when text is changed.
@end menu
@ -396,6 +397,11 @@ We hold these truth@point{}
---------- Buffer: bar ----------
@end group
@end example
@end defun
@defun insert-buffer-substring-no-properties from-buffer-or-name &optional start end
This is like @code{insert-buffer-substring} except that it does not
copy any text properties.
@end defun
@xref{Sticky Properties}, for other insertion functions that inherit
@ -761,6 +767,7 @@ would be difficult to change the terminology now.
@menu
* Kill Ring Concepts:: What text looks like in the kill ring.
* Kill Functions:: Functions that kill text.
* Yanking:: How yanking is done.
* Yank Commands:: Commands that access the kill ring.
* Low-Level Kill Ring:: Functions and variables for kill ring access.
* Internals of Kill Ring:: Variables that hold kill-ring data.
@ -805,7 +812,7 @@ adds it to the most recent element. It determines automatically (using
@code{last-command}) whether the previous command was a kill command,
and if so appends the killed text to the most recent entry.
@deffn Command kill-region start end
@deffn Command kill-region start end &optional yank-handler
This function kills the text in the region defined by @var{start} and
@var{end}. The text is deleted but saved in the kill ring, along with
its text properties. The value is always @code{nil}.
@ -818,6 +825,10 @@ If the buffer or text is read-only, @code{kill-region} modifies the kill
ring just the same, then signals an error without modifying the buffer.
This is convenient because it lets the user use a series of kill
commands to copy text from a read-only buffer into the kill ring.
If @var{yank-handler} is non-@code{nil}, this puts that value onto
the string of killed text, as a @code{yank-handler} property.
@xref{Yanking}.
@end deffn
@defopt kill-read-only-ok
@ -842,6 +853,67 @@ support Emacs 18. For newer Emacs versions, it is better to use
Ring}.
@end deffn
@node Yanking
@subsection Yanking
Yanking means inserting text from the kill ring, but it does
not insert the text blindly. Yank commands and some other commands
use @code{insert-for-yank} to perform special processing on the
text that they copy into the buffer.
@defun insert-for-yank string
This function normally works like @code{insert} except that it doesn't
insert the text properties in the @code{yank-excluded-properties}
list. However, if the first character of @var{string} has a
non-@code{nil}@code{yank-handler} text property, that property
can do various special processing on the text being inserted.
@end defun
@defun insert-buffer-substring-as-yank buf &optional start end
This function resembles @code{insert-buffer-substring} except that it
doesn't insert the text properties in the
@code{yank-excluded-properties} list.
@end defun
You can put a @code{yank-handler} text property on the text to
control how it will be inserted if it is yanked. The
@code{insert-for-yank} function looks for a @code{yank-handler}
property on the first character in its @var{string} argument. The
property value must be a list of one to four elements, with the
following format (where elements after the first may be omitted):
@example
(@var{function} @var{param} @var{noexclude} @var{undo})
@end example
Here is what the elements do:
@table @var
@item function
When @var{function} is present and non-nil, it is called instead of
@code{insert} to insert the string. @var{function} takes one
argument---the string to insert.
@item param
If @var{param} is present and non-@code{nil}, it replaces @var{string}
as the object passed to @var{function} (or @code{insert}); for
example, if @var{function} is @code{yank-rectangle}, @var{param}
should be a list of strings to insert as a rectangle.
@item noexclude
If @var{noexclude} is present and non-@code{nil}, the normal removal of the
yank-excluded-properties is not performed; instead @var{function} is
responsible for removing those properties. This may be necessary
if @var{function} adjusts point before or after inserting the object.
@item undo
If @var{undo} is present and non-nil, it is a function that will be
called by @code{yank-pop} to undo the insertion of the current object.
It is called with two arguments, the start and end of the current
region. @var{function} can set @code{yank-undo-function} to override
the @var{undo} value.
@end table
@node Yank Commands
@comment node-name, next, previous, up
@subsection Functions for Yanking
@ -889,6 +961,17 @@ oldest.
The return value is always @code{nil}.
@end deffn
@defvar yank-undo-function
If this variable is non-@code{nil}, the function @code{yank-pop} uses
its value instead of @code{delete-region} to delete the text
inserted by the previous @code{yank} or
@code{yank-pop} command.
The function @code{insert-for-yank} automatically sets this variable
according to the @var{undo} element of the @code{yank-handler}
text property, if there is one.
@end defvar
@node Low-Level Kill Ring
@subsection Low-Level Kill Ring
@ -912,19 +995,23 @@ If @var{n} is zero, indicating a request for the latest kill,
the kill ring.
@end defun
@defun kill-new string
@defun kill-new string &optional yank-handler
This function puts the text @var{string} into the kill ring as a new
entry at the front of the ring. It discards the oldest entry if
appropriate. It also invokes the value of
@code{interprogram-cut-function} (see below).
If @var{yank-handler} is non-@code{nil}, this puts that value onto
the string of killed text, as a @code{yank-handler} property.
@xref{Yanking}.
@end defun
@defun kill-append string before-p
@defun kill-append string before-p &optional yank-handler
This function appends the text @var{string} to the first entry in the
kill ring. Normally @var{string} goes at the end of the entry, but if
@var{before-p} is non-@code{nil}, it goes at the beginning. This
function also invokes the value of @code{interprogram-cut-function} (see
below).
below). This handles @var{yank-handler} just like @code{kill-new}.
@end defun
@defvar interprogram-paste-function
@ -2435,6 +2522,12 @@ To remove all text properties from certain text, use
list.
@end defun
@defun remove-list-of-text-properties start end list-of-properties &optional object
Like @code{remove-list-properties} except that
@var{list-of-properties} is a list property names only, not an
alternating list of property values.
@end defun
@defun set-text-properties start end props &optional object
This function completely replaces the text property list for the text
between @var{start} and @var{end} in the string or buffer @var{object}.
@ -3697,6 +3790,96 @@ using the specified or chosen coding system. However, if
coding instead.
@end defun
@node Atomic Changes
@section Atomic Change Groups
@cindex atomic changes
In data base terminology, an @dfn{atomic} change is an indivisible
change---it can succeed entirely or it can fail entirely, but it
cannot partly succeed. A Lisp program can make a series of changes to
one or several buffers as an @dfn{atomic change group}, meaning that
either the entire series of changes will be installed in their buffers
or, in case of an error, none of them will be.
To do this for one buffer, the one already current, simply write a
call to @code{atomic-change-group} around the code that makes the
changes, like this:
@example
(atomic-change-group
(insert foo)
(delete-region x y))
@end example
@noindent
If an error (or other nonlocal exit) occurs inside the body of
@code{atomic-change-group}, it unmakes all the changes in that buffer
that were during the execution of the body. This kind of change group
has no effect on any other buffers--any such changes remain.
If you need something more sophisticated, such as to make changes in
various buffers constitute one atomic group, you must directly call
lower-level functions that @code{atomic-change-group} uses.
@defun prepare-change-group &optional buffer
This function sets up a change group for buffer @var{buffer}, which
defaults to the current buffer. It returns a ``handle'' that
represents the change group. You must use this handle to activate the
change group and subsequently to finish it.
@end defun
To use the change group, you must @dfn{activate} it. You must do
this before making any changes in the text of @var{buffer}.
@defun activate-change-group handle
This function activates the change group that @var{handle} designates.
@end defun
After you activate the change group, any changes you make in that
buffer become part of it. Once you have made all the desired changes
in the buffer, you must @dfn{finish} the change group. There are two
ways to do this: you can either accept (and finalize) all the changes,
or cancel them all.
@defun accept-change-group handle
This function accepts all the changes in the change group specified by
@var{handle}, making them final.
@end defun
@defun cancel-change-group handle
This function cancels and undoes all the changes in the change group
specified by @var{handle}.
@end defun
Your code should use @code{unwind-protect} to make sure the group is
always finished. The call to @code{activate-change-group} should be
inside the @code{unwind-protect}, in case the user types @kbd{C-g}
just after it runs. (This is one reason why
@code{prepare-change-group} and @code{activate-change-group} are
separate functions, because normally you would call
@code{prepare-change-group} before the start of that
@code{unwind-protect}.) Once you finish the group, don't use the
handle again---in particular, don't try to finish the same group
twice.
To make a multibuffer change group, call @code{prepare-change-group}
once for each buffer you want to cover, then use @code{nconc} to
combine the returned values, like this:
@example
(nconc (prepare-change-group buffer-1)
(prepare-change-group buffer-2))
@end example
You can then activate the multibuffer change group with a single call
to @code{activate-change-group}, and finish it with a single call to
@code{accept-change-group} or @code{cancel-change-group}.
Nested use of several change groups for the same buffer works as you
would expect. Non-nested use of change groups for the same buffer
will get Emacs confused, so don't let it happen; the first change
group you start for any given buffer should be the last one finished.
@node Change Hooks
@section Change Hooks
@cindex change hooks