From: Kenichi Handa Date: Wed, 16 Sep 1998 07:21:31 +0000 (+0000) Subject: (adjust_markers_for_replace): Don't adjust a byte X-Git-Tag: emacs-20.4~1690 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=23b20a7066f96cc984b0d58ccf96dad03850c7de;p=emacs.git (adjust_markers_for_replace): Don't adjust a byte position if it is FROM. (adjust_markers_for_combining): New function. (combine_bytes): Call adjust_markers_for_combining instead of adjust_markers_for_replace. (adjust_after_replace): Record deletion of combining after bytes with the correct position. Don't add combining bytes to the args given to adjust_point. Handle correctly the case that there are both before and after combining bytes. (replace_range): Likewise. Record the actual deletion after recoding deletions of combining bytes. --- diff --git a/src/insdel.c b/src/insdel.c index d942da1f155..60cfefd1af7 100644 --- a/src/insdel.c +++ b/src/insdel.c @@ -400,6 +400,45 @@ adjust_markers_for_delete (from, from_byte, to, to_byte) marker = m->chain; } } + +/* Adjust all markers for a byte combining of NBYTES at char position + FROM and byte position FROM_BYTE. */ + +static void +adjust_markers_for_combining (from, from_byte, nbytes) + register int from, from_byte, nbytes; +{ + Lisp_Object marker; + register struct Lisp_Marker *m; + register int bytepos; + register int to_byte = from_byte + nbytes; + + marker = BUF_MARKERS (current_buffer); + + while (!NILP (marker)) + { + m = XMARKER (marker); + bytepos = m->bytepos; + + if (bytepos >= to_byte) + { + record_marker_adjustment (marker, - nbytes); + m->charpos -= nbytes; + } + else if (bytepos > from_byte) + { + record_marker_adjustment (marker, from - m->charpos); + m->charpos = from; + m->bytepos = to_byte; + } + else if (bytepos == from_byte) + { + m->bytepos = to_byte; + } + + marker = m->chain; + } +} /* Adjust all markers for calling record_delete for combining bytes. whose range in bytes is FROM_BYTE to TO_BYTE. @@ -595,14 +634,6 @@ adjust_markers_for_replace (from, from_byte, old_chars, old_bytes, m->charpos = from; m->bytepos = from_byte; } - else if (m->bytepos == from_byte) - { - if (combined_before_bytes) - { - DEC_BOTH (m->charpos, m->bytepos); - INC_BOTH (m->charpos, m->bytepos); - } - } marker = m->chain; } @@ -1013,7 +1044,7 @@ combine_bytes (pos, pos_byte, nbytes) int pos, pos_byte, nbytes; { /* Adjust all markers. */ - adjust_markers_for_delete (pos, pos_byte, pos + nbytes, pos_byte); + adjust_markers_for_combining (pos, pos_byte, nbytes); adjust_overlays_for_delete (pos, nbytes); @@ -1576,7 +1607,7 @@ adjust_after_replace (from, from_byte, prev_text, len, len_byte) from_byte + combined_after_bytes); if (! EQ (current_buffer->undo_list, Qt)) - record_delete (from, deletion); + record_delete (from + len, deletion); } if (combined_before_bytes) @@ -1705,6 +1736,7 @@ replace_range (from, to, new, prepare, inherit, markers) int adjusted_inschars; INTERVAL intervals; int outgoing_insbytes = insbytes; + Lisp_Object deletion; CHECK_MARKERS (); @@ -1756,23 +1788,17 @@ replace_range (from, to, new, prepare, inherit, markers) if (to < GPT) gap_left (to, to_byte, 0); - { - Lisp_Object deletion; - deletion = Qnil; - - if (! EQ (current_buffer->undo_list, Qt)) - deletion = make_buffer_string_both (from, from_byte, to, to_byte, 1); + deletion = Qnil; - if (markers) - /* Relocate all markers pointing into the new, larger gap - to point at the end of the text before the gap. - Do this before recording the deletion, - so that undo handles this after reinserting the text. */ - adjust_markers_for_delete (from, from_byte, to, to_byte); + if (! EQ (current_buffer->undo_list, Qt)) + deletion = make_buffer_string_both (from, from_byte, to, to_byte, 1); - if (! EQ (current_buffer->undo_list, Qt)) - record_delete (from, deletion); - } + if (markers) + /* Relocate all markers pointing into the new, larger gap + to point at the end of the text before the gap. + Do this before recording the deletion, + so that undo handles this after reinserting the text. */ + adjust_markers_for_delete (from, from_byte, to, to_byte); GAP_SIZE += nbytes_del; ZV -= nchars_del; @@ -1832,7 +1858,7 @@ replace_range (from, to, new, prepare, inherit, markers) from + combined_after_bytes, from_byte + combined_after_bytes); if (! EQ (current_buffer->undo_list, Qt)) - record_delete (from, deletion); + record_delete (from + inschars, deletion); } if (combined_before_bytes) @@ -1849,8 +1875,13 @@ replace_range (from, to, new, prepare, inherit, markers) record_delete (from - 1, deletion); } - record_insert (from - !!combined_before_bytes, - inschars - combined_before_bytes + !!combined_before_bytes); + if (! EQ (current_buffer->undo_list, Qt)) + { + record_delete (from - !!combined_before_bytes, deletion); + record_insert (from - !!combined_before_bytes, + (inschars - combined_before_bytes + + !!combined_before_bytes)); + } GAP_SIZE -= outgoing_insbytes; GPT += inschars;