diff --git a/src/cut.c b/src/cut.c index 9fc9db4cc4d7a6aac1973702f70791af1969316f..0d07a1adbfef082b9f4ca1704bdf2d9cc63d71f2 100644 --- a/src/cut.c +++ b/src/cut.c @@ -258,7 +258,7 @@ void do_uncut_text(void) { ssize_t was_lineno = openfile->current->lineno; - /* If the cutbuffer is empty, get out. */ + /* If the cutbuffer is empty, there is nothing to do. */ if (cutbuffer == NULL) return; @@ -277,8 +277,7 @@ void do_uncut_text(void) if (openfile->current->lineno - was_lineno < editwinrows) focusing = FALSE; - /* Set the current place we want to where the text from the - * cutbuffer ends. */ + /* Set the desired x position to where the pasted text ends. */ openfile->placewewant = xplustabs(); /* Mark the file as modified. */ diff --git a/src/files.c b/src/files.c index acf51dcb102a5aa87bf6a3beaab2f5bfbfaa5d55..840d6bfed588020f2df306e9b187744268ed8fc7 100644 --- a/src/files.c +++ b/src/files.c @@ -906,8 +906,7 @@ void read_file(FILE *f, int fd, const char *filename, bool undoable, bool checkw openfile->current_x = 0; } - /* Set the current place we want to the end of the last line of the - * file we inserted. */ + /* Set the desired x position at the end of what was inserted. */ openfile->placewewant = xplustabs(); if (!writable) @@ -2978,7 +2977,7 @@ bool writehist(FILE *hist, const filestruct *head) { const filestruct *item; - /* Write a history list from the oldest entry to the newest. */ + /* Write a history list, from the oldest item to the newest. */ for (item = head; item != NULL; item = item->next) { size_t length = strlen(item->data); diff --git a/src/proto.h b/src/proto.h index 126295ff3429b525de8d0414dac45985b5e8f355..b34db490385dd52e639bed99c283f99126fcab3d 100644 --- a/src/proto.h +++ b/src/proto.h @@ -348,7 +348,7 @@ const char *tail(const char *path); #ifndef DISABLE_HISTORIES char *histfilename(void); void load_history(void); -bool writehist(FILE *hist, const filestruct *histhead); +bool writehist(FILE *hist, const filestruct *head); void save_history(void); int check_dotnano(void); void load_poshistory(void); @@ -743,8 +743,8 @@ void statusline(message_type importance, const char *msg, ...); void bottombars(int menu); void onekey(const char *keystroke, const char *desc, int length); void reset_cursor(void); -void edit_draw(filestruct *fileptr, const char *converted, int - line, size_t start); +void edit_draw(filestruct *fileptr, const char *converted, + int line, size_t from_col); int update_line(filestruct *fileptr, size_t index); bool need_horizontal_scroll(const size_t old_column, const size_t new_column); void edit_scroll(scroll_dir direction, ssize_t nlines); diff --git a/src/text.c b/src/text.c index 26dab10ec023104f7975f562092578393ba38edd..9ec43b0703296c7027eb5ac604881f770172a802 100644 --- a/src/text.c +++ b/src/text.c @@ -823,10 +823,12 @@ void do_undo(void) statusline(HUSH, _("Undid action (%s)"), undidmsg); renumber(f); + openfile->current_undo = openfile->current_undo->next; openfile->last_action = OTHER; openfile->mark_set = FALSE; openfile->placewewant = xplustabs(); + openfile->totsize = u->wassize; set_modified(); } @@ -974,6 +976,7 @@ void do_redo(void) openfile->last_action = OTHER; openfile->mark_set = FALSE; openfile->placewewant = xplustabs(); + openfile->totsize = u->newsize; set_modified(); } diff --git a/src/winio.c b/src/winio.c index 070949f9fa98769a824ec54a2f1138c46766c6c6..194d716f10872b08b6952de459894a5268429abc 100644 --- a/src/winio.c +++ b/src/winio.c @@ -2294,8 +2294,8 @@ void reset_cursor(void) * character of this page. That is, the first character of converted * corresponds to character number actual_x(fileptr->data, from_col) of the * line. */ -void edit_draw(filestruct *fileptr, const char *converted, int - line, size_t from_col) +void edit_draw(filestruct *fileptr, const char *converted, + int line, size_t from_col) { #if !defined(NANO_TINY) || !defined(DISABLE_COLOR) size_t from_x = actual_x(fileptr->data, from_col); @@ -2483,8 +2483,8 @@ void edit_draw(filestruct *fileptr, const char *converted, int while (TRUE) { index += startmatch.rm_so; startmatch.rm_eo -= startmatch.rm_so; - if (regexec(varnish->end, start_line->data + - index + startmatch.rm_eo, 0, NULL, + if (regexec(varnish->end, start_line->data + index + + startmatch.rm_eo, 0, NULL, (index + startmatch.rm_eo == 0) ? 0 : REG_NOTBOL) == REG_NOMATCH) /* No end found after this start. */ @@ -2497,8 +2497,8 @@ void edit_draw(filestruct *fileptr, const char *converted, int } /* Indeed, there is a start without an end on that line. */ - /* We've already checked that there is no end before fileptr - * and after the start. But is there an end after the start + /* We've already checked that there is no end between the start + * and the current line. But is there an end after the start * at all? We don't paint unterminated starts. */ while (end_line != NULL && regexec(varnish->end, end_line->data, 1, &endmatch, 0) == REG_NOMATCH) @@ -2557,9 +2557,8 @@ void edit_draw(filestruct *fileptr, const char *converted, int * the beginning of the line. */ endmatch.rm_so += startmatch.rm_eo; endmatch.rm_eo += startmatch.rm_eo; - /* There is an end on this line. But does - * it appear on this page, and is the match - * more than zero characters long? */ + /* Only paint the match if it is visible on screen and + * it is more than zero characters long. */ if (endmatch.rm_eo > from_x && endmatch.rm_eo > startmatch.rm_so) { paintlen = actual_x(thetext, strnlenpt(fileptr->data, @@ -2662,15 +2661,12 @@ void edit_draw(filestruct *fileptr, const char *converted, int int update_line(filestruct *fileptr, size_t index) { int line = 0; - /* The line in the edit window that we want to update. */ + /* The row in the edit window we will be updating. */ int extralinesused = 0; char *converted; - /* fileptr->data converted to have tabs and control characters - * expanded. */ + /* The data of the line with tabs and control characters expanded. */ size_t page_start; - assert(fileptr != NULL); - #ifndef NANO_TINY if (ISSET(SOFTWRAP)) { filestruct *tmp; @@ -2795,8 +2791,6 @@ void edit_scroll(scroll_dir direction, ssize_t nlines) ssize_t i; filestruct *foo; - assert(nlines > 0); - /* Part 1: nlines is the number of lines we're going to scroll the * text of the edit window. */ @@ -2856,12 +2850,10 @@ void edit_scroll(scroll_dir direction, ssize_t nlines) if (nlines > editwinrows) nlines = editwinrows; - /* If we scrolled up, we're on the line before the scrolled - * region. */ + /* If we scrolled up, we're on the line before the scrolled region. */ foo = openfile->edittop; - /* If we scrolled down, move down to the line before the scrolled - * region. */ + /* If we scrolled down, move down to the line before the scrolled region. */ if (direction == DOWNWARD) { for (i = editwinrows - nlines; i > 0 && foo != NULL; i--) foo = foo->next; @@ -2873,8 +2865,8 @@ void edit_scroll(scroll_dir direction, ssize_t nlines) * blank, so we don't need to draw it unless the mark is on or we're * not on the first page. */ for (i = nlines; i > 0 && foo != NULL; i--) { - if ((i == nlines && direction == DOWNWARD) || (i == 1 && - direction == UPWARD)) { + if ((i == nlines && direction == DOWNWARD) || + (i == 1 && direction == UPWARD)) { if (need_horizontal_scroll(openfile->placewewant, 0)) update_line(foo, (foo == openfile->current) ? openfile->current_x : 0); @@ -2883,6 +2875,7 @@ void edit_scroll(scroll_dir direction, ssize_t nlines) openfile->current_x : 0); foo = foo->next; } + compute_maxrows(); }