Mercurial > emacs
changeset 10480:fbb254882b9f
(subst_char_in_region_unwind): New function.
(Fsubst_char_in_region): Use it to make undo_list t temporarily.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Thu, 19 Jan 1995 18:56:10 +0000 |
parents | f2f290b13413 |
children | 24756aef26e3 |
files | src/editfns.c |
diffstat | 1 files changed, 19 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/editfns.c Thu Jan 19 18:50:26 1995 +0000 +++ b/src/editfns.c Thu Jan 19 18:56:10 1995 +0000 @@ -1266,6 +1266,13 @@ return make_number (0); } +static Lisp_Object +subst_char_in_region_unwind (arg) + Lisp_Object arg; +{ + return current_buffer->undo_list = arg; +} + DEFUN ("subst-char-in-region", Fsubst_char_in_region, Ssubst_char_in_region, 4, 5, 0, "From START to END, replace FROMCHAR with TOCHAR each time it occurs.\n\ @@ -1276,6 +1283,7 @@ { register int pos, stop, look; int changed = 0; + int count = specpdl_ptr - specpdl; validate_region (&start, &end); CHECK_NUMBER (fromchar, 2); @@ -1285,6 +1293,16 @@ stop = XINT (end); look = XINT (fromchar); + /* If we don't want undo, turn off putting stuff on the list. + That's faster than getting rid of things, + and it prevents even the entry for a first change. */ + if (!NILP (noundo)) + { + record_unwind_protect (subst_char_in_region_unwind, + current_buffer->undo_list); + current_buffer->undo_list = Qt; + } + while (pos < stop) { if (FETCH_CHAR (pos) == look) @@ -1315,6 +1333,7 @@ signal_after_change (XINT (start), stop - XINT (start), stop - XINT (start)); + unbind_to (count, Qnil); return Qnil; }