+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.
#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);
splice_node(f, t, f->next);
if (f == openfile->filebot)
openfile->filebot = t;
+ }
goto_line_posx(u->lineno, u->begin);
break;
case CUT_EOF:
((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) {
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);