Mercurial > emacs
changeset 59970:cf4b913c7074
(Fprimitive_undo): Record max one dummmy apply element.
author | Kim F. Storm <storm@cua.dk> |
---|---|
date | Mon, 07 Feb 2005 11:44:00 +0000 |
parents | 6af50633a8f1 |
children | c20f0be3ae10 |
files | src/undo.c |
diffstat | 1 files changed, 18 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/src/undo.c Sun Feb 06 22:32:31 2005 +0000 +++ b/src/undo.c Mon Feb 07 11:44:00 2005 +0000 @@ -1,5 +1,6 @@ /* undo handling for GNU Emacs. - Copyright (C) 1990, 1993, 1994, 2000 Free Software Foundation, Inc. + Copyright (C) 1990, 1993, 1994, 2000, 2002, 2004, 2005 + Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -454,6 +455,8 @@ Lisp_Object next; int count = SPECPDL_INDEX (); register int arg; + Lisp_Object oldlist; + int did_apply = 0; #if 0 /* This is a good feature, but would make undo-start unable to do what is expected. */ @@ -470,6 +473,8 @@ arg = XINT (n); next = Qnil; GCPRO2 (next, list); + /* I don't think we need to gcpro oldlist, as we use it only + to check for EQ. ++kfs */ /* In a writable buffer, enable undoing read-only text that is so because of text properties. */ @@ -479,6 +484,8 @@ /* Don't let `intangible' properties interfere with undo. */ specbind (Qinhibit_point_motion_hooks, Qt); + oldlist = current_buffer->undo_list; + while (arg > 0) { while (CONSP (list)) @@ -549,7 +556,6 @@ } else if (EQ (car, Qapply)) { - Lisp_Object oldlist = current_buffer->undo_list; /* Element (apply FUNNAME . ARGS) means call FUNNAME to undo. */ car = Fcar (cdr); if (INTEGERP (car)) @@ -560,13 +566,7 @@ } cdr = Fcdr (cdr); apply1 (car, cdr); - - /* Make sure this produces at least one undo entry, - so the test in `undo' for continuing an undo series - will work right. */ - if (EQ (oldlist, current_buffer->undo_list)) - current_buffer->undo_list - = Fcons (list3 (Qapply, Qcdr, Qnil), current_buffer->undo_list); + did_apply = 1; } else if (STRINGP (car) && INTEGERP (cdr)) { @@ -611,6 +611,15 @@ arg--; } + + /* Make sure an apply entry produces at least one undo entry, + so the test in `undo' for continuing an undo series + will work right. */ + if (did_apply + && EQ (oldlist, current_buffer->undo_list)) + current_buffer->undo_list + = Fcons (list3 (Qapply, Qcdr, Qnil), current_buffer->undo_list); + UNGCPRO; return unbind_to (count, list); }