summaryrefslogtreecommitdiff
path: root/src/undo.c
diff options
context:
space:
mode:
authorRichard M. Stallman <rms@gnu.org>1996-02-03 18:07:27 +0000
committerRichard M. Stallman <rms@gnu.org>1996-02-03 18:07:27 +0000
commit714bced97609934cef99d8fa674a0a5cab20d9e3 (patch)
tree4eb2c685945d694393b65d3fe4028d6a0291aadc /src/undo.c
parent8948d3170a7d786664da33c009da0c7194b345c3 (diff)
downloademacs-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.c34
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--;