changeset 59853:d0109a1ac6a0

(replace_range_2): Fix bugs in adjusting markers and point.
author Kenichi Handa <handa@m17n.org>
date Tue, 01 Feb 2005 23:47:06 +0000
parents 44381d53da68
children 75a481e7d8f1
files src/insdel.c
diffstat 1 files changed, 10 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/insdel.c	Tue Feb 01 20:11:09 2005 +0000
+++ b/src/insdel.c	Tue Feb 01 23:47:06 2005 +0000
@@ -1,5 +1,5 @@
 /* Buffer insertion/deletion and gap motion for GNU Emacs.
-   Copyright (C) 1985, 86,93,94,95,97,98, 1999, 2000, 01, 2003
+   Copyright (C) 1985, 86,93,94,95,97,98, 1999, 2000, 01, 2003, 2005
    Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
@@ -1745,17 +1745,21 @@
 
   /* Adjust markers for the deletion and the insertion.  */
   if (markers
-      && ! (nchars_del == 1 && inschars == 1))
+      && ! (nchars_del == 1 && inschars == 1 && nbytes_del == insbytes))
     adjust_markers_for_replace (from, from_byte, nchars_del, nbytes_del,
 				inschars, insbytes);
 
   offset_intervals (current_buffer, from, inschars - nchars_del);
 
   /* Relocate point as if it were a marker.  */
-  if (from < PT && nchars_del != inschars)
-    adjust_point ((from + inschars - (PT < to ? PT : to)),
-		  (from_byte + insbytes
-		   - (PT_BYTE < to_byte ? PT_BYTE : to_byte)));
+  if (from < PT && (nchars_del != inschars || nbytes_del != insbytes))
+    {
+      if (PT < to)
+	/* PT was within the deleted text.  Move it to FROM.  */
+	adjust_point (from - PT, from_byte - PT_BYTE);
+      else
+	adjust_point (inschars - nchars_del, insbytes - nbytes_del);
+    }
 
   if (insbytes == 0)
     evaporate_overlays (from);