[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] Changes to emacs/src/undo.c
From: |
Stefan Monnier |
Subject: |
[Emacs-diffs] Changes to emacs/src/undo.c |
Date: |
Thu, 04 Apr 2002 15:43:02 -0500 |
Index: emacs/src/undo.c
diff -c emacs/src/undo.c:1.54 emacs/src/undo.c:1.55
*** emacs/src/undo.c:1.54 Fri Nov 2 15:34:18 2001
--- emacs/src/undo.c Thu Apr 4 15:42:56 2002
***************
*** 36,54 ****
an undo-boundary. */
Lisp_Object pending_boundary;
! /* Record an insertion that just happened or is about to happen,
! for LENGTH characters at position BEG.
! (It is possible to record an insertion before or after the fact
! because we don't need to record the contents.) */
! void
! record_insert (beg, length)
! int beg, length;
{
! Lisp_Object lbeg, lend;
!
! if (EQ (current_buffer->undo_list, Qt))
! return;
/* Allocate a cons cell to be the undo boundary after this command. */
if (NILP (pending_boundary))
--- 36,50 ----
an undo-boundary. */
Lisp_Object pending_boundary;
! /* Record point as it was at beginning of this command (if necessary)
! And prepare the undo info for recording a change.
! PT is the position of point that will naturally occur as a result of the
! undo record that will be added just after this command terminates. */
! static void
! record_point (pt)
{
! int at_boundary;
/* Allocate a cons cell to be the undo boundary after this command. */
if (NILP (pending_boundary))
***************
*** 59,67 ****
--- 55,112 ----
Fundo_boundary ();
XSETBUFFER (last_undo_buffer, current_buffer);
+ if (CONSP (current_buffer->undo_list))
+ {
+ /* Set AT_BOUNDARY to 1 only when we have nothing other than
+ marker adjustment before undo boundary. */
+
+ Lisp_Object tail = current_buffer->undo_list, elt;
+
+ while (1)
+ {
+ if (NILP (tail))
+ elt = Qnil;
+ else
+ elt = XCAR (tail);
+ if (NILP (elt) || ! (CONSP (elt) && MARKERP (XCAR (elt))))
+ break;
+ tail = XCDR (tail);
+ }
+ at_boundary = NILP (elt);
+ }
+ else
+ at_boundary = 1;
+
if (MODIFF <= SAVE_MODIFF)
record_first_change ();
+ /* If we are just after an undo boundary, and
+ point wasn't at start of deleted range, record where it was. */
+ if (at_boundary
+ && last_point_position != pt
+ /* If we're called from batch mode, this could be nil. */
+ && BUFFERP (last_point_position_buffer)
+ && current_buffer == XBUFFER (last_point_position_buffer))
+ current_buffer->undo_list
+ = Fcons (make_number (last_point_position), current_buffer->undo_list);
+ }
+
+ /* Record an insertion that just happened or is about to happen,
+ for LENGTH characters at position BEG.
+ (It is possible to record an insertion before or after the fact
+ because we don't need to record the contents.) */
+
+ void
+ record_insert (beg, length)
+ int beg, length;
+ {
+ Lisp_Object lbeg, lend;
+
+ if (EQ (current_buffer->undo_list, Qt))
+ return;
+
+ record_point (beg);
+
/* If this is following another insertion and consecutive with it
in the buffer, combine the two. */
if (CONSP (current_buffer->undo_list))
***************
*** 93,151 ****
Lisp_Object string;
{
Lisp_Object sbeg;
- int at_boundary;
if (EQ (current_buffer->undo_list, Qt))
return;
! /* Allocate a cons cell to be the undo boundary after this command. */
! if (NILP (pending_boundary))
! pending_boundary = Fcons (Qnil, Qnil);
!
! if (BUFFERP (last_undo_buffer)
! && current_buffer != XBUFFER (last_undo_buffer))
! Fundo_boundary ();
! XSETBUFFER (last_undo_buffer, current_buffer);
!
! if (CONSP (current_buffer->undo_list))
{
! /* Set AT_BOUNDARY to 1 only when we have nothing other than
! marker adjustment before undo boundary. */
!
! Lisp_Object tail = current_buffer->undo_list, elt;
!
! while (1)
! {
! if (NILP (tail))
! elt = Qnil;
! else
! elt = XCAR (tail);
! if (NILP (elt) || ! (CONSP (elt) && MARKERP (XCAR (elt))))
! break;
! tail = XCDR (tail);
! }
! at_boundary = NILP (elt);
}
else
! at_boundary = 0;
!
! if (MODIFF <= SAVE_MODIFF)
! record_first_change ();
!
! if (PT == beg + XSTRING (string)->size)
! XSETINT (sbeg, -beg);
! else
! XSETFASTINT (sbeg, beg);
!
! /* If we are just after an undo boundary, and
! point wasn't at start of deleted range, record where it was. */
! if (at_boundary
! && last_point_position != XFASTINT (sbeg)
! /* If we're called from batch mode, this could be nil. */
! && BUFFERP (last_point_position_buffer)
! && current_buffer == XBUFFER (last_point_position_buffer))
! current_buffer->undo_list
! = Fcons (make_number (last_point_position), current_buffer->undo_list);
current_buffer->undo_list
= Fcons (Fcons (string, sbeg), current_buffer->undo_list);
--- 138,157 ----
Lisp_Object string;
{
Lisp_Object sbeg;
if (EQ (current_buffer->undo_list, Qt))
return;
! if (PT == beg + XSTRING (string)->size)
{
! XSETINT (sbeg, -beg);
! record_point (PT);
}
else
! {
! XSETFASTINT (sbeg, beg);
! record_point (beg);
! }
current_buffer->undo_list
= Fcons (Fcons (string, sbeg), current_buffer->undo_list);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] Changes to emacs/src/undo.c,
Stefan Monnier <=