nano

nano with my custom patches
git clone git://bsandro.tech/nano
Log | Files | Refs | README | LICENSE

commit 322120c98067a85ac84b6cb247989f4751054d61
parent 54e6fe2b4ac51c0fea10498e32a01536acdb0416
Author: Benno Schulenberg <bensberg@justemail.net>
Date:   Sun,  8 Jan 2017 11:05:52 +0100

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.

Diffstat:
Msrc/text.c | 12+++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)

diff --git 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);