emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: New undo element (fun . args)


From: Kim F. Storm
Subject: Re: New undo element (fun . args)
Date: Wed, 02 Feb 2005 16:41:05 +0100
User-agent: Gnus/5.11 (Gnus v5.11) Emacs/21.3.50 (gnu/linux)

Stefan Monnier <address@hidden> writes:

>> One of the undoable operations in SES is setting a variable.
>> This doesn't relate directly to buffer text, but it might
>> be associated with some region somehow.  I don't know
>> how this is used, and I think it is important to check.
>
> Most of the vars that are thus set/unset are vars of the form "B6" or "C20",
> i.e. vars that hold the content of a cell.  So they do have some relation
> with one specific region of the buffer: the corresponding cell.  So we could
> just replace (apply ses-set-with-undo ,sym ,(symbol-value sym)) with (apply
> START END 0 ses-set-with-undo ,sym ,(symbol-value sym)) where START and END

Should be 0 START END.

> are the boundaries of the cell.  But since the same code is used for other
> vars as well, such as vars that relate to a particular column of
> the spreadsheet, it'll take a bit more effort.

I've tried to make cua use the new undo machinery, but it is more
complicated than I had imagined.

One obstacle is this piece of code in primitive-undo (undo.c):

It is slightly modified to add (apply cdr . nil) rather than (cdr .
nil) to the undo list in this case:

  /* 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, nil), current_buffer->undo_list);


I don't understand why this is necessary.  The primitive-undo
continues to the next undo boundary, so why is it important what is
recorded "between undo boundaries" ?

The problem I have with cua is that I don't record buffer changes as
such, but rather a change in where the active rectangle is.  It works
to some extent, but as soon as undo hits one of the entries I added to
the undo list, it gets stuck -- and the pending undo list seems to
be stuck at that specific (apply cdr ...) entry.

So somehow what I do breaks the test mentioned above.  But what
exactly is that test trying to differentiate.  I've looked at the
code in simple.el, and I simply don't get it.

Any ideas...?





reply via email to

[Prev in Thread] Current Thread [Next in Thread]