]> code.delx.au - gnu-emacs/commitdiff
2006-08-22 Stefan Monnier <monnier@iro.umontreal.ca>
authorKim F. Storm <storm@cua.dk>
Tue, 22 Aug 2006 09:25:59 +0000 (09:25 +0000)
committerKim F. Storm <storm@cua.dk>
Tue, 22 Aug 2006 09:25:59 +0000 (09:25 +0000)
(Fset_buffer_multibyte): Record proper undo entry.

src/buffer.c

index 3502afc9bf01d716f942f9a9948ac69579b5bfe2..07d0f676aa20533cf11618de670b0f32c542c66c 100644 (file)
@@ -2115,10 +2115,11 @@ current buffer is cleared.  */)
 {
   struct Lisp_Marker *tail, *markers;
   struct buffer *other;
-  int undo_enabled_p = !EQ (current_buffer->undo_list, Qt);
   int begv, zv;
   int narrowed = (BEG != BEGV || Z != ZV);
   int modified_p = !NILP (Fbuffer_modified_p (Qnil));
+  Lisp_Object old_undo = current_buffer->undo_list;
+  struct gcpro gcpro1;
 
   if (current_buffer->base_buffer)
     error ("Cannot do `set-buffer-multibyte' on an indirect buffer");
@@ -2127,10 +2128,11 @@ current buffer is cleared.  */)
   if (NILP (flag) == NILP (current_buffer->enable_multibyte_characters))
     return flag;
 
-  /* It would be better to update the list,
-     but this is good enough for now.  */
-  if (undo_enabled_p)
-    current_buffer->undo_list = Qt;
+  GCPRO1 (old_undo);
+
+  /* Don't record these buffer changes.  We will put a special undo entry
+     instead.  */
+  current_buffer->undo_list = Qt;
 
   /* If the cached position is for this buffer, clear it out.  */
   clear_charpos_cache (current_buffer);
@@ -2330,8 +2332,18 @@ current buffer is cleared.  */)
       set_intervals_multibyte (1);
     }
 
-  if (undo_enabled_p)
-    current_buffer->undo_list = Qnil;
+  if (!EQ (old_undo, Qt))
+    {
+      /* Represent all the above changes by a special undo entry.  */
+      extern Lisp_Object Qapply;
+      Lisp_Object args[3];
+      args[0] = Qapply;
+      args[1] = intern ("set-buffer-multibyte");
+      args[2] = NILP (flag) ? Qt : Qnil;
+      current_buffer->undo_list = Fcons (Flist (3, args), old_undo);
+    }
+
+  UNGCPRO;
 
   /* Changing the multibyteness of a buffer means that all windows
      showing that buffer must be updated thoroughly.  */