[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Changing of line format and undo
From: |
Stefan Monnier |
Subject: |
Re: Changing of line format and undo |
Date: |
Sun, 02 Jul 2006 11:39:05 -0400 |
User-agent: |
Gnus/5.11 (Gnus v5.11) Emacs/22.0.50 (gnu/linux) |
> Thanks, you are right ;-) Now I see what Eli meant. I still believe that
> everything that can result in changing an external file should go into the
> undo history but this is really a corner case of course.
You can change C-x RET f to do what you want by having it add (manually in
elisp) an `apply' entry to buufer-undo-list.
E.g. I've changed my set-buffer-multibyte to do that (waiting for post-22
to commit it).
Stefan
--- orig/src/buffer.c
+++ mod/src/buffer.c
@@ -2112,10 +2100,11 @@
{
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");
@@ -2124,10 +2113,11 @@
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);
@@ -2327,8 +2317,18 @@
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] = Qset_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. */
- Re: Changing of line format and undo,
Stefan Monnier <=