Mercurial > emacs
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; }