nano

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

commit 2d50c4f257e4caf8367916c2390f0bdb80204a8d
parent 6a9e2a4d3ea26b141484909a94359c1a5353b416
Author: Benno Schulenberg <bensberg@justemail.net>
Date:   Fri, 15 Apr 2016 14:39:54 +0200

softwrap: adjust for current_x when computing the amount to scroll

The number of lines to scroll is: the y position of the start of the
current line, plus the extra lines that this line occupies, plus the
extra lines that the next line occupies, plus one, minus the y position
of the last window line.

The y position of the start of the current line is current_y -
xplustabs() / COLS, the extra lines are strlenpt(data) / COLS,
and the y position of the last window line is editwinrows - 1.

Note that we first compute the amount to scroll before actually moving
to the next line, because we need the current value of current_x, not
the one that it will have in the next line.  The placewewant value is
not good either, because it might be beyond where we actually are.

This fixes https://savannah.gnu.org/bugs/?47665.

Diffstat:
Msrc/move.c | 17+++++++++--------
1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/src/move.c b/src/move.c @@ -451,16 +451,12 @@ void do_down( openfile->current->lineno - openfile->edittop->lineno); assert(openfile->current->next != NULL); - /* Move the current line of the edit window down. */ - openfile->current = openfile->current->next; - openfile->current_x = actual_x(openfile->current->data, - openfile->placewewant); - #ifndef NANO_TINY if (ISSET(SOFTWRAP)) { - /* Compute the amount to scroll. */ - amount = (strlenpt(openfile->current->data) / COLS + openfile->current_y + 2 - + strlenpt(openfile->current->prev->data) / COLS - editwinrows); + /* Compute the number of lines to scroll. */ + amount = strlenpt(openfile->current->data) / COLS - xplustabs() / COLS + + strlenpt(openfile->current->next->data) / COLS + + openfile->current_y - editwinrows + 2; topline = openfile->edittop; /* Reduce the amount when there are overlong lines at the top. */ for (enough = 1; enough < amount; enough++) { @@ -474,6 +470,11 @@ void do_down( } #endif + /* Move to the next line in the file. */ + openfile->current = openfile->current->next; + openfile->current_x = actual_x(openfile->current->data, + openfile->placewewant); + /* If scroll_only is FALSE and if we're on the last line of the * edit window, scroll the edit window down one line if we're in * smooth scrolling mode, or down half a page if we're not. If