From 322120c98067a85ac84b6cb247989f4751054d61 Mon Sep 17 00:00:00 2001 From: Benno Schulenberg Date: Sun, 8 Jan 2017 11:05:52 +0100 Subject: [PATCH] undo: properly create separate items for deletes at different positions That is: only extend the current Del or Backspace undo item when the cursor is still (or again) at the same spot. This fixes https://savannah.gnu.org/bugs/?50006. --- src/text.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/text.c b/src/text.c index 2c9e5f51..26dab10e 100644 --- a/src/text.c +++ b/src/text.c @@ -1368,15 +1368,21 @@ fprintf(stderr, " >> Updating... action = %d, openfile->last_action = %d, openf } case BACK: case DEL: { - /* Add the removed character after or before earlier removed stuff. */ char *char_buf = charalloc(mb_cur_max()); int char_len = parse_mbchar(&openfile->current->data[openfile->current_x], char_buf, NULL); - if (action == DEL) { + if (openfile->current_x == u->begin) { + /* They deleted more: add removed character after earlier stuff. */ u->strdata = addstrings(u->strdata, strlen(u->strdata), char_buf, char_len); u->mark_begin_x = openfile->current_x; - } else { + } else if (openfile->current_x == u->begin - char_len) { + /* They backspaced further: add removed character before earlier. */ u->strdata = addstrings(char_buf, char_len, u->strdata, strlen(u->strdata)); u->begin = openfile->current_x; + } else { + /* They deleted *elsewhere* on the line: start a new undo item. */ + free(char_buf); + add_undo(u->type); + return; } #ifdef DEBUG fprintf(stderr, " >> current undo data is \"%s\"\nu->begin = %lu\n", u->strdata, (unsigned long)u->begin); -- 2.11.0