nano

nano with my custom patches
git clone git://bsandro.tech/nano
Log | Files | Refs | README | LICENSE

commit 4f9c563e6b56d16632eebe2c40835d66017554ba
parent 1570651e3012c395e1555f80aba8d16ba3f11925
Author: David Lawrence Ramsey <pooka109@gmail.com>
Date:   Sun, 15 Jan 2017 16:01:17 -0600

softwrap: count softwrapped chunks properly in do_uncut_text()

Add the new function less_than_a_screenful() to accomplish this.
It uses go_back_chunks() to count the number of softwrapped chunks
between the end point and the starting point of the paste.

Now softwrap mode and non-softwrap mode behave the same way when
uncutting fewer than editwinrows rows of text.  Accordingly, remove
the call to ensure_line_is_visible(), as it no longer applies.

Diffstat:
Msrc/cut.c | 11++++++++---
Msrc/proto.h | 1+
Msrc/winio.c | 18++++++++++++++++++
3 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/src/cut.c b/src/cut.c @@ -257,6 +257,9 @@ void do_cut_till_eof(void) void do_uncut_text(void) { ssize_t was_lineno = openfile->current->lineno; + /* The line number where we started the paste. */ + size_t was_leftedge = 0; + /* The leftedge where we started the paste. */ /* If the cutbuffer is empty, there is nothing to do. */ if (cutbuffer == NULL) @@ -264,6 +267,9 @@ void do_uncut_text(void) #ifndef NANO_TINY add_undo(PASTE); + + if (ISSET(SOFTWRAP)) + was_leftedge = (xplustabs() / editwincols) * editwincols; #endif /* Add a copy of the text in the cutbuffer to the current filestruct @@ -274,7 +280,8 @@ void do_uncut_text(void) update_undo(PASTE); #endif - if (openfile->current->lineno - was_lineno < editwinrows) + /* If we pasted less than a screenful, don't center the cursor. */ + if (less_than_a_screenful(was_lineno, was_leftedge)) focusing = FALSE; /* Set the desired x position to where the pasted text ends. */ @@ -286,8 +293,6 @@ void do_uncut_text(void) /* Update the cursor position to account for the inserted lines. */ reset_cursor(); - ensure_line_is_visible(); - refresh_needed = TRUE; #ifndef DISABLE_COLOR diff --git a/src/proto.h b/src/proto.h @@ -709,6 +709,7 @@ int update_line(filestruct *fileptr, size_t index); bool need_horizontal_scroll(const size_t old_column, const size_t new_column); int go_back_chunks(int nrows, filestruct **line, size_t *leftedge); int go_forward_chunks(int nrows, filestruct **line, size_t *leftedge); +bool less_than_a_screenful(size_t was_lineno, size_t was_leftedge); void edit_scroll(scroll_dir direction, int nrows); void edit_redraw(filestruct *old_current); void edit_refresh(void); diff --git a/src/winio.c b/src/winio.c @@ -2835,6 +2835,24 @@ int go_forward_chunks(int nrows, filestruct **line, size_t *leftedge) return i; } +/* Return TRUE if there are fewer than a screen's worth of lines between + * the line at line number was_lineno (and column was_leftedge, if we're + * in softwrap mode) and the line at current[current_x]. */ +bool less_than_a_screenful(size_t was_lineno, size_t was_leftedge) +{ +#ifndef NANO_TINY + if (ISSET(SOFTWRAP)) { + filestruct *line = openfile->current; + size_t leftedge = (xplustabs() / editwincols) * editwincols; + int rows_left = go_back_chunks(editwinrows - 1, &line, &leftedge); + + return (rows_left > 0 || line->lineno < was_lineno || + (line->lineno == was_lineno && leftedge <= was_leftedge)); + } else +#endif + return (openfile->current->lineno - was_lineno < editwinrows); +} + /* Scroll the edit window in the given direction and the given number of rows, * and draw new lines on the blank lines left after the scrolling. We change * edittop, and assume that current and current_x are up to date. */