]> git.wh0rd.org Git - nano.git/commitdiff
Preventing the addition of an extra newline when undoing a Backspace or Delete
authorBenno Schulenberg <bensberg@justemail.net>
Wed, 17 Jun 2015 10:41:57 +0000 (10:41 +0000)
committerBenno Schulenberg <bensberg@justemail.net>
Wed, 17 Jun 2015 10:41:57 +0000 (10:41 +0000)
at the tail of the file while nonewlines is not set.

git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@5250 35c25a1d-7b9e-4130-9fde-d3aeb78583b8

ChangeLog
src/text.c

index ed47f60881e05aa4f26dc0b91f5d725902d7bbf7..75691fc62d61e47cd9d3e15d35594a231478bb96 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2015-06-17  Benno Schulenberg  <bensberg@justemail.net>
+       * src/text.c (do_undo, add_undo): When undoing a Backspace at the tail
+       of the file and nonewlines is not set, then don't add another newline
+       but just reposition the cursor.  Also, when doing a Delete at the tail
+       of the file, don't add a superfluous undo structure.  This prevents
+       the appearance of an extra newline when undoing the Backspace/Delete.
+       Patch partially by Mark Majeres.  The problem was first reported in
+       https://lists.gnu.org/archive/html/nano-devel/2015-06/msg00003.html.
+
 2015-06-14  Benno Schulenberg  <bensberg@justemail.net>
        * src/winio.c (edit_draw): Add some debugging code to track which
        multidata codes (for multiline regexes) get assigned to which lines.
index f3637f8657bfa550ed2d18dbc8e1c3dfc71617fb..a0e801d46b0b5252c33701e8d212b4e76d7bb3f0 100644 (file)
@@ -501,6 +501,10 @@ void do_undo(void)
 #endif /* !DISABLE_WRAPPING */
     case JOIN:
        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 || u->xflags != UNdel_backspace ||
+               ISSET(NO_NEWLINES)) {
        t = make_new_node(f);
        t->data = mallocstrcpy(NULL, u->strdata);
        data = mallocstrncpy(NULL, f->data, u->mark_begin_x + 1);
@@ -510,6 +514,7 @@ void do_undo(void)
        splice_node(f, t, f->next);
        if (f == openfile->filebot)
            openfile->filebot = t;
+       }
        goto_line_posx(u->lineno, u->begin);
        break;
     case CUT_EOF:
@@ -880,6 +885,11 @@ void add_undo(undo_type current_action)
        ((current_action == CUT && u->type == CUT && !u->mark_set && keeping_cutbuffer()) ||
        (current_action == ADD && u->type == ADD && u->mark_begin_x == fs->current_x)))
        return;
+    /* When trying to delete the final newline, don't add an undo for it. */
+    if (current_action == DEL && openfile->current->next == openfile->filebot &&
+               openfile->current->data[openfile->current_x] == '\0' &&
+               openfile->current_x != 0 && !ISSET(NO_NEWLINES))
+       return;
 
     /* Blow away the old undo stack if we are starting from the middle. */
     while (fs->undotop != NULL && fs->undotop != fs->current_undo) {
@@ -924,6 +934,7 @@ void add_undo(undo_type current_action)
     case ADD:
        break;
     case BACK:
+       u->xflags = UNdel_backspace;
     case DEL:
        if (u->begin != strlen(fs->current->data)) {
            char *char_buf = charalloc(mb_cur_max() + 1);