diff --git a/src/nano.h b/src/nano.h index 694acd38..a1bb6720 100644 --- a/src/nano.h +++ b/src/nano.h @@ -274,7 +274,8 @@ typedef struct undo { /* copy copy copy */ ssize_t mark_begin_x; /* Another shadow variable */ - + ssize_t linescut; + /* How many lines we cut on a straight non-marked non-to-end cut */ struct undo *next; } undo; diff --git a/src/text.c b/src/text.c index d70060b9..861014b8 100644 --- a/src/text.c +++ b/src/text.c @@ -443,12 +443,17 @@ void do_undo(void) case CUTTOEND: undidmsg = _("text cut"); cutbuffer = copy_filestruct(u->cutbuffer); + + /* Compute cutbottom for the uncut using out copy */ for (cutbottom = cutbuffer; cutbottom->next != NULL; cutbottom = cutbottom->next) ; + + /* Get to where we need to uncut from */ if (u->mark_set && u->mark_begin_lineno < u->lineno) do_gotolinecolumn(u->mark_begin_lineno, u->mark_begin_x+1, FALSE, FALSE, FALSE, FALSE); else do_gotolinecolumn(u->lineno, u->begin+1, FALSE, FALSE, FALSE, FALSE); + do_uncut_text(); free_filestruct(cutbuffer); cutbuffer = NULL; @@ -548,19 +553,39 @@ void do_redo(void) undidmsg = _("line cut"); do_gotolinecolumn(u->lineno, u->begin+1, FALSE, FALSE, FALSE, FALSE); openfile->mark_set = u->mark_set; - t = cutbuffer; + if (cutbuffer) + free(cutbuffer); cutbuffer = NULL; + + /* Move ahead the same # lines we had if a marked cut */ if (u->mark_set) { for (i = 1, t = openfile->fileage; i != u->mark_begin_lineno; i++) t = t->next; openfile->mark_begin = t; + } else if (!u->to_end) { + /* Here we have a regular old potentially multi-line ^K cut. We'll + need to trick nano into thinking it's a marked cut to cut more + than one line again */ +#ifdef DEBUG + fprintf(stderr, "Undoing multi-^K cut, u->linescut = %d\n", u->linescut); +#endif + for (i = 0, t = openfile->current; i < u->linescut; i++) { + +#ifdef DEBUG + fprintf(stderr, "Advancing, lineno = %d, data = \"%s\"\n", t->lineno, t->data); +#endif + t = t->next; + } + openfile->mark_begin = t; + openfile->mark_begin_x = 0; + openfile->mark_set = TRUE; } + openfile->mark_begin_x = u->mark_begin_x; do_cut_text(FALSE, u->to_end, TRUE); openfile->mark_set = FALSE; openfile->mark_begin = NULL; openfile->mark_begin_x = 0; - cutbuffer = t; edit_refresh(); break; default: @@ -766,6 +791,9 @@ void add_undo(undo_type current_action, openfilestruct *fs) u->strdata = NULL; u->cutbuffer = NULL; u->cutbottom = NULL; + u->mark_begin_lineno = 0; + u->mark_begin_x = 0; + u->linescut = 0; u->xflags = 0; switch (u->type) { @@ -908,6 +936,7 @@ void update_undo(undo_type action, openfilestruct *fs) free(u->cutbuffer); u->cutbuffer = copy_filestruct(cutbuffer); u->cutbottom = cutbottom; + u->linescut++; break; case SPLIT: case UNSPLIT: