From: Benno Schulenberg Date: Sat, 27 Jun 2015 09:17:36 +0000 (+0000) Subject: Skipping the undo of a backspace *only* when it really X-Git-Tag: v2.4.2~10 X-Git-Url: https://git.wh0rd.org/?a=commitdiff_plain;h=412b9fc0a2b48641c24ce7176b0bfae52c854329;p=nano.git Skipping the undo of a backspace *only* when it really tried to delete the final, magic newline. git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@5267 35c25a1d-7b9e-4130-9fde-d3aeb78583b8 --- diff --git a/ChangeLog b/ChangeLog index 31e8f148..9aed0c14 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2015-06-27 Benno Schulenberg + * src/text.c (do_undo, add_undo): Skip undoing a backspace *only* when + it really tried to delete the final, magic newline. + 2015-06-23 Benno Schulenberg * src/winio.c (edit_draw): Verify that there exists multidata for the found starting line before trying to use it. When a file is inserted diff --git a/src/nano.h b/src/nano.h index 3355b427..b31f40bd 100644 --- a/src/nano.h +++ b/src/nano.h @@ -570,7 +570,7 @@ enum #define KEY_WINCH -2 /* Some extra bits for the undo function. */ -#define UNdel_backspace (1<<1) +#define SKIP_FINAL_BACKSPACE (1<<1) #define UNcut_marked_forward (1<<2) #define UNcut_cutline (1<<3) #endif /* !NANO_TINY */ diff --git a/src/text.c b/src/text.c index 3d3033aa..004ba6b4 100644 --- a/src/text.c +++ b/src/text.c @@ -503,8 +503,7 @@ void do_undo(void) undidmsg = _("line join"); /* When the join was done by a Backspace at the tail of the file, * don't actually add another line; just position the cursor. */ - if (f->next != openfile->filebot || ISSET(NO_NEWLINES) || - u->xflags != UNdel_backspace) { + if (ISSET(NO_NEWLINES) || u->xflags != SKIP_FINAL_BACKSPACE) { t = make_new_node(f); t->data = mallocstrcpy(NULL, u->strdata); data = mallocstrncpy(NULL, f->data, u->mark_begin_x + 1); @@ -936,7 +935,10 @@ void add_undo(undo_type action) case ADD: break; case BACK: - u->xflags = UNdel_backspace; + /* If the next line is the magic line, don't ever undo this + * backspace, as it won't actually have deleted anything. */ + if (fs->current->next == fs->filebot && fs->current->data[0] != '\0') + u->xflags = SKIP_FINAL_BACKSPACE; case DEL: if (u->begin != strlen(fs->current->data)) { char *char_buf = charalloc(mb_cur_max() + 1);