changeset 14480:50954bb380b6

(record_marker_adjustment): New function. (Fprimitive_undo): Handle marker-adjustment elements.
author Richard M. Stallman <rms@gnu.org>
date Sat, 03 Feb 1996 18:07:27 +0000
parents 69fa625812a4
children 9785f1180901
files src/undo.c
diffstat 1 files changed, 34 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/undo.c	Sat Feb 03 18:06:29 1996 +0000
+++ b/src/undo.c	Sat Feb 03 18:07:27 1996 +0000
@@ -128,6 +128,31 @@
 	     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 @@
 		      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--;