changeset 59832:ff1b86883ff8

(Qapply): New lisp var. (syms_of_undo): Intern and staticpro it. (Fprimitive_undo): Support formats (apply FUNNAME . ARGS) and (apply DELTA BEG END FUNNAME . ARGS) instead of (FUNNAME . ARGS).
author Kim F. Storm <storm@cua.dk>
date Mon, 31 Jan 2005 22:44:27 +0000
parents 4346e62d3d4f
children 62b43d677801
files src/undo.c
diffstat 1 files changed, 17 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/undo.c	Mon Jan 31 21:58:05 2005 +0000
+++ b/src/undo.c	Mon Jan 31 22:44:27 2005 +0000
@@ -40,6 +40,10 @@
 
 Lisp_Object Qinhibit_read_only;
 
+/* Marker for function call undo list elements.  */
+
+Lisp_Object Qapply;
+
 /* The first time a command records something for undo.
    it also allocates the undo-boundary object
    which will be added to the list at the end of the command.
@@ -543,10 +547,18 @@
 		  Fgoto_char (car);
 		  Fdelete_region (car, cdr);
 		}
-	      else if (SYMBOLP (car))
+	      else if (EQ (car, Qapply))
 		{
 		  Lisp_Object oldlist = current_buffer->undo_list;
-		  /* Element (FUNNAME . ARGS) means call FUNNAME to undo.  */
+		  /* Element (apply FUNNAME . ARGS) means call FUNNAME to undo.  */
+		  car = Fcar (cdr);
+		  if (INTEGERP (car))
+		    {
+		      /* Long format: (apply DELTA START END FUNNAME . ARGS).  */
+		      cdr = Fcdr (Fcdr (Fcdr (cdr)));
+		      car = Fcar (cdr);
+		    }
+		  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
@@ -608,6 +620,9 @@
   Qinhibit_read_only = intern ("inhibit-read-only");
   staticpro (&Qinhibit_read_only);
 
+  Qapply = intern ("apply");
+  staticpro (&Qapply);
+
   pending_boundary = Qnil;
   staticpro (&pending_boundary);