# HG changeset patch # User Miles Bader # Date 971849998 0 # Node ID f9b498650e20701424801731b87ab65a23941e80 # Parent faadf96091b5690181086d78c52b612d20ec7096 (adjust_markers_for_delete): Handle before-insertion markers correctly. diff -r faadf96091b5 -r f9b498650e20 src/insdel.c --- 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; }