diff options
author | Stefan Monnier <monnier@iro.umontreal.ca> | 2002-04-04 20:42:56 +0000 |
---|---|---|
committer | Stefan Monnier <monnier@iro.umontreal.ca> | 2002-04-04 20:42:56 +0000 |
commit | 6396140ae1bc3a3cec38a7035a31ca9a5436cca1 (patch) | |
tree | 94ab1d0dc57136e63b7d89e5547e9b1b0f3900e6 /src/undo.c | |
parent | b3bbfb96761cf5bea428ee08bf41c04cc3b9df06 (diff) | |
download | emacs-6396140ae1bc3a3cec38a7035a31ca9a5436cca1.tar.gz |
(record_point): New fun.
(record_delete, record_insert): Use it.
Diffstat (limited to 'src/undo.c')
-rw-r--r-- | src/undo.c | 120 |
1 files changed, 63 insertions, 57 deletions
diff --git a/src/undo.c b/src/undo.c index ec6f9d6b1db..bf0c9f5b669 100644 --- a/src/undo.c +++ b/src/undo.c @@ -36,19 +36,15 @@ Lisp_Object Qinhibit_read_only; 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.) */ +/* 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. */ -void -record_insert (beg, length) - int beg, length; +static void +record_point (pt) { - Lisp_Object lbeg, lend; - - if (EQ (current_buffer->undo_list, Qt)) - return; + int at_boundary; /* Allocate a cons cell to be the undo boundary after this command. */ if (NILP (pending_boundary)) @@ -59,9 +55,58 @@ record_insert (beg, length) 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,59 +138,20 @@ record_delete (beg, string) 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)) + if (PT == beg + XSTRING (string)->size) { - /* 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); + XSETINT (sbeg, -beg); + record_point (PT); } 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); + { + XSETFASTINT (sbeg, beg); + record_point (beg); + } current_buffer->undo_list = Fcons (Fcons (string, sbeg), current_buffer->undo_list); |