diff options
author | Richard M. Stallman <rms@gnu.org> | 1996-02-03 18:07:27 +0000 |
---|---|---|
committer | Richard M. Stallman <rms@gnu.org> | 1996-02-03 18:07:27 +0000 |
commit | 714bced97609934cef99d8fa674a0a5cab20d9e3 (patch) | |
tree | 4eb2c685945d694393b65d3fe4028d6a0291aadc /src/undo.c | |
parent | 8948d3170a7d786664da33c009da0c7194b345c3 (diff) | |
download | emacs-714bced97609934cef99d8fa674a0a5cab20d9e3.tar.gz |
(record_marker_adjustment): New function.
(Fprimitive_undo): Handle marker-adjustment elements.
Diffstat (limited to 'src/undo.c')
-rw-r--r-- | src/undo.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/undo.c b/src/undo.c index 0e6116500a4..d2cc1d2dcd4 100644 --- a/src/undo.c +++ b/src/undo.c @@ -128,6 +128,31 @@ record_delete (beg, length) current_buffer->undo_list); } +/* Record the fact that MARKER is about to be adjusted by ADJUSTMENT. + This is done only when a marker points within text being deleted, + because that's the only case where an automatic marker adjustment + won't be inverted automatically by undoing the buffer modification. */ + +record_marker_adjustment (marker, adjustment) + Lisp_Object marker; + int adjustment; +{ + 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 (current_buffer != XBUFFER (last_undo_buffer)) + Fundo_boundary (); + XSETBUFFER (last_undo_buffer, current_buffer); + + current_buffer->undo_list + = Fcons (Fcons (marker, make_number (adjustment)), + current_buffer->undo_list); +} + /* Record that a replacement is about to take place, for LENGTH characters at location BEG. The replacement does not change the number of characters. */ @@ -463,6 +488,15 @@ Return what remains of the list.") SET_PT (pos); } } + else if (MARKERP (car) && INTEGERP (cdr)) + { + /* (MARKER . INTEGER) means a marker MARKER + was adjusted by INTEGER. */ + if (XMARKER (car)->buffer) + Fset_marker (car, + make_number (marker_position (car) - XINT (cdr)), + Fmarker_buffer (car)); + } } } arg--; |