changeset 32601:f9b498650e20

(adjust_markers_for_delete): Handle before-insertion markers correctly.
author Miles Bader <miles@gnu.org>
date Wed, 18 Oct 2000 06:19:58 +0000
parents faadf96091b5
children 0953c68ae245
files src/insdel.c
diffstat 1 files changed, 22 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/insdel.c	Wed Oct 18 01:55:32 2000 +0000
+++ b/src/insdel.c	Wed Oct 18 06:19:58 2000 +0000
@@ -1,5 +1,5 @@
 /* Buffer insertion/deletion and gap motion for GNU Emacs.
-   Copyright (C) 1985, 86,93,94,95,97,98, 1999 Free Software Foundation, Inc.
+   Copyright (C) 1985, 86,93,94,95,97,98, 1999, 2000 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
@@ -366,14 +366,33 @@
 	  m->charpos -= to - from;
 	  m->bytepos -= to_byte - from_byte;
 	}
-
       /* Here's the case where a marker is inside text being deleted.  */
       else if (charpos > from)
 	{
-	  record_marker_adjustment (marker, from - charpos);
+	  if (! m->insertion_type)
+	    /* Normal markers will end up at the beginning of the
+	       re-inserted text after undoing a deletion, and must be
+	       adjusted to move them to the correct place.  */ 
+	    record_marker_adjustment (marker, from - charpos);
+	  else if (charpos < to)
+	    /* Before-insertion markers will automatically move forward
+	       upon re-inserting the deleted text, so we have to arrange
+	       for them to move backward to the correct position.  */
+	    record_marker_adjustment (marker, charpos - to);
+
 	  m->charpos = from;
 	  m->bytepos = from_byte;
 	}
+      /* Here's the case where a before-insertion marker is immediately
+	 before the deleted region.  */
+      else if (charpos == from && m->insertion_type)
+	{
+	  /* Undoing the change uses normal insertion, which will
+	     incorrectly make MARKER move forward, so we arrange for it
+	     to then move backward to the correct place at the beginning
+	     of the deleted region.  */
+	  record_marker_adjustment (marker, to - from);
+	}
 
       marker = m->chain;
     }