From 0aa8c4b24d1941b60ae6e89c406fb1cd9b5bc5ce Mon Sep 17 00:00:00 2001 From: "Richard M. Stallman" Date: Sat, 16 May 1998 20:34:59 +0000 Subject: [PATCH] (insert_1_both, insert_from_string_1, replace_range) (insert_from_buffer_1, adjust_before_replace, adjust_after_replace): Don't copy text being deleted, if undo is disabled. --- src/insdel.c | 175 ++++++++++++++++++++++++++++++++++----------------- 1 file changed, 119 insertions(+), 56 deletions(-) diff --git a/src/insdel.c b/src/insdel.c index 9c01c333f0b..481f6bf267a 100644 --- a/src/insdel.c +++ b/src/insdel.c @@ -1014,7 +1014,7 @@ insert_1_both (string, nchars, nbytes, inherit, prepare, before_markers) register int nchars, nbytes; int inherit, prepare, before_markers; { - register Lisp_Object temp, deletion; + register Lisp_Object temp; int combined_before_bytes, combined_after_bytes; if (NILP (current_buffer->enable_multibyte_characters)) @@ -1045,23 +1045,33 @@ insert_1_both (string, nchars, nbytes, inherit, prepare, before_markers) if (combined_after_bytes) { - deletion = make_buffer_string_both (PT, PT_BYTE, - PT + combined_after_bytes, - PT_BYTE + combined_after_bytes, 1); + Lisp_Object deletion; + deletion = Qnil; + + if (! EQ (current_buffer->undo_list, Qt)) + deletion = make_buffer_string_both (PT, PT_BYTE, + PT + combined_after_bytes, + PT_BYTE + combined_after_bytes, 1); adjust_markers_for_record_delete (PT, PT_BYTE, PT + combined_after_bytes, PT_BYTE + combined_after_bytes); - record_delete (PT, deletion); + if (! EQ (current_buffer->undo_list, Qt)) + record_delete (PT, deletion); } if (combined_before_bytes) { - deletion = make_buffer_string_both (PT - 1, CHAR_TO_BYTE (PT - 1), - PT, PT_BYTE, 1); + Lisp_Object deletion; + deletion = Qnil; + + if (! EQ (current_buffer->undo_list, Qt)) + deletion = make_buffer_string_both (PT - 1, CHAR_TO_BYTE (PT - 1), + PT, PT_BYTE, 1); adjust_markers_for_record_delete (PT - 1, CHAR_TO_BYTE (PT - 1), PT, PT_BYTE); - record_delete (PT - 1, deletion); + if (! EQ (current_buffer->undo_list, Qt)) + record_delete (PT - 1, deletion); } record_insert (PT - !!combined_before_bytes, @@ -1170,7 +1180,6 @@ insert_from_string_1 (string, pos, pos_byte, nchars, nbytes, int combined_before_bytes, combined_after_bytes; int adjusted_nchars; INTERVAL intervals; - Lisp_Object deletion; /* Make OUTGOING_NBYTES describe the text as it will be inserted in this buffer. */ @@ -1220,23 +1229,33 @@ insert_from_string_1 (string, pos, pos_byte, nchars, nbytes, if (combined_after_bytes) { - deletion = make_buffer_string_both (PT, PT_BYTE, - PT + combined_after_bytes, - PT_BYTE + combined_after_bytes, 1); + Lisp_Object deletion; + deletion = Qnil; + + if (! EQ (current_buffer->undo_list, Qt)) + deletion = make_buffer_string_both (PT, PT_BYTE, + PT + combined_after_bytes, + PT_BYTE + combined_after_bytes, 1); adjust_markers_for_record_delete (PT, PT_BYTE, PT + combined_after_bytes, PT_BYTE + combined_after_bytes); - record_delete (PT, deletion); + if (! EQ (current_buffer->undo_list, Qt)) + record_delete (PT, deletion); } if (combined_before_bytes) { - deletion = make_buffer_string_both (PT - 1, CHAR_TO_BYTE (PT - 1), - PT, PT_BYTE, 1); + Lisp_Object deletion; + deletion = Qnil; + + if (! EQ (current_buffer->undo_list, Qt)) + deletion = make_buffer_string_both (PT - 1, CHAR_TO_BYTE (PT - 1), + PT, PT_BYTE, 1); adjust_markers_for_record_delete (PT - 1, CHAR_TO_BYTE (PT - 1), PT, PT_BYTE); - record_delete (PT - 1, deletion); + if (! EQ (current_buffer->undo_list, Qt)) + record_delete (PT - 1, deletion); } record_insert (PT - !!combined_before_bytes, @@ -1318,7 +1337,7 @@ insert_from_buffer_1 (buf, from, nchars, inherit) int from, nchars; int inherit; { - register Lisp_Object temp, deletion; + register Lisp_Object temp; int chunk; int from_byte = buf_charpos_to_bytepos (buf, from); int to_byte = buf_charpos_to_bytepos (buf, from + nchars); @@ -1391,23 +1410,33 @@ insert_from_buffer_1 (buf, from, nchars, inherit) if (combined_after_bytes) { - deletion = make_buffer_string_both (PT, PT_BYTE, - PT + combined_after_bytes, - PT_BYTE + combined_after_bytes, 1); + Lisp_Object deletion; + deletion = Qnil; + + if (! EQ (current_buffer->undo_list, Qt)) + deletion = make_buffer_string_both (PT, PT_BYTE, + PT + combined_after_bytes, + PT_BYTE + combined_after_bytes, 1); adjust_markers_for_record_delete (PT, PT_BYTE, PT + combined_after_bytes, PT_BYTE + combined_after_bytes); - record_delete (PT, deletion); + if (! EQ (current_buffer->undo_list, Qt)) + record_delete (PT, deletion); } if (combined_before_bytes) { - deletion = make_buffer_string_both (PT - 1, CHAR_TO_BYTE (PT - 1), - PT, PT_BYTE, 1); + Lisp_Object deletion; + deletion = Qnil; + + if (! EQ (current_buffer->undo_list, Qt)) + deletion = make_buffer_string_both (PT - 1, CHAR_TO_BYTE (PT - 1), + PT, PT_BYTE, 1); adjust_markers_for_record_delete (PT - 1, CHAR_TO_BYTE (PT - 1), PT, PT_BYTE); - record_delete (PT - 1, deletion); + if (! EQ (current_buffer->undo_list, Qt)) + record_delete (PT - 1, deletion); } record_insert (PT - !!combined_before_bytes, @@ -1474,12 +1503,17 @@ adjust_before_replace (from, from_byte, to, to_byte) int from, from_byte, to, to_byte; { Lisp_Object deletion; - deletion = make_buffer_string_both (from, from_byte, to, to_byte, 1); + + if (! EQ (current_buffer->undo_list, Qt)) + deletion = make_buffer_string_both (from, from_byte, to, to_byte, 1); CHECK_MARKERS (); adjust_markers_for_delete (from, from_byte, to, to_byte); - record_delete (from, deletion); + + if (! EQ (current_buffer->undo_list, Qt)) + record_delete (from, deletion); + adjust_overlays_for_delete (from, to - from); } @@ -1499,28 +1533,39 @@ adjust_after_replace (from, from_byte, prev_text, len, len_byte) = count_combining_before (GPT_ADDR, len_byte, from, from_byte); int combined_after_bytes = count_combining_after (GPT_ADDR, len_byte, from, from_byte); - Lisp_Object deletion; int nchars_del = 0, nbytes_del = 0; if (combined_after_bytes) { - deletion = make_buffer_string_both (from, from_byte, - from + combined_after_bytes, - from_byte + combined_after_bytes, 1); + Lisp_Object deletion; + deletion = Qnil; + + if (! EQ (current_buffer->undo_list, Qt)) + deletion = make_buffer_string_both (from, from_byte, + from + combined_after_bytes, + from_byte + combined_after_bytes, + 1); adjust_markers_for_record_delete (from, from_byte, from + combined_after_bytes, from_byte + combined_after_bytes); - record_delete (from, deletion); + + if (! EQ (current_buffer->undo_list, Qt)) + record_delete (from, deletion); } if (combined_before_bytes) { - deletion = make_buffer_string_both (from - 1, CHAR_TO_BYTE (from - 1), - from, from_byte, 1); + Lisp_Object deletion; + deletion = Qnil; + + if (! EQ (current_buffer->undo_list, Qt)) + deletion = make_buffer_string_both (from - 1, CHAR_TO_BYTE (from - 1), + from, from_byte, 1); adjust_markers_for_record_delete (from - 1, CHAR_TO_BYTE (from - 1), from, from_byte); - record_delete (from - 1, deletion); + if (! EQ (current_buffer->undo_list, Qt)) + record_delete (from - 1, deletion); } /* Update various buffer positions for the new text. */ @@ -1624,7 +1669,6 @@ replace_range (from, to, new, prepare, inherit, nomarkers) int adjusted_inschars; INTERVAL intervals; int outgoing_insbytes = insbytes; - Lisp_Object deletion; CHECK_MARKERS (); @@ -1676,16 +1720,23 @@ replace_range (from, to, new, prepare, inherit, nomarkers) if (to < GPT) gap_left (to, to_byte, 0); - deletion = make_buffer_string_both (from, from_byte, to, to_byte, 1); + { + Lisp_Object deletion; + deletion = Qnil; + + if (! EQ (current_buffer->undo_list, Qt)) + deletion = make_buffer_string_both (from, from_byte, to, to_byte, 1); - if (nomarkers) - /* 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 (nomarkers) + /* 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); - record_delete (from, deletion); + if (! EQ (current_buffer->undo_list, Qt)) + record_delete (from, deletion); + } GAP_SIZE += nbytes_del; ZV -= nchars_del; @@ -1733,23 +1784,33 @@ replace_range (from, to, new, prepare, inherit, nomarkers) if (combined_after_bytes) { - deletion = make_buffer_string_both (PT, PT_BYTE, - PT + combined_after_bytes, - PT_BYTE + combined_after_bytes, 1); + Lisp_Object deletion; + deletion = Qnil; + + if (! EQ (current_buffer->undo_list, Qt)) + deletion = make_buffer_string_both (PT, PT_BYTE, + PT + combined_after_bytes, + PT_BYTE + combined_after_bytes, 1); adjust_markers_for_record_delete (PT, PT_BYTE, PT + combined_after_bytes, PT_BYTE + combined_after_bytes); - record_delete (PT, deletion); + if (! EQ (current_buffer->undo_list, Qt)) + record_delete (PT, deletion); } if (combined_before_bytes) { - deletion = make_buffer_string_both (PT - 1, CHAR_TO_BYTE (PT - 1), - PT, PT_BYTE, 1); + Lisp_Object deletion; + deletion = Qnil; + + if (! EQ (current_buffer->undo_list, Qt)) + deletion = make_buffer_string_both (PT - 1, CHAR_TO_BYTE (PT - 1), + PT, PT_BYTE, 1); adjust_markers_for_record_delete (PT - 1, CHAR_TO_BYTE (PT - 1), PT, PT_BYTE); - record_delete (PT - 1, deletion); + if (! EQ (current_buffer->undo_list, Qt)) + record_delete (PT - 1, deletion); } record_insert (PT - !!combined_before_bytes, @@ -1966,11 +2027,12 @@ del_range_2 (from, from_byte, to, to_byte) else from_byte_1 = from_byte; - deletion - = make_buffer_string_both (from - !!combined_after_bytes, - from_byte_1, - to + combined_after_bytes, - to_byte + combined_after_bytes, 1); + if (! EQ (current_buffer->undo_list, Qt)) + deletion + = make_buffer_string_both (from - !!combined_after_bytes, + from_byte_1, + to + combined_after_bytes, + to_byte + combined_after_bytes, 1); if (combined_after_bytes) /* COMBINED_AFTER_BYTES nonzero means that the above code moved the gap. We must move the gap again to a proper place. */ @@ -1997,7 +2059,8 @@ del_range_2 (from, from_byte, to, to_byte) adjust_markers_for_record_delete (from - 1, from_byte_1, from, from_byte); } - record_delete (from - !!combined_after_bytes, deletion); + if (! EQ (current_buffer->undo_list, Qt)) + record_delete (from - !!combined_after_bytes, deletion); MODIFF++; /* Relocate point as if it were a marker. */ -- 2.39.2