1
0
forked from aniani/vim

patch 9.1.0407: Stuck with long line and half-page scrolling

Problem:  No scrolling happens with half-page scrolling with line
          filling entire window when 'smoothscroll' is disabled.
          (Mathias Rav, after v9.1.0285)
Solution: Adjust amount to move cursor by so that it is moved the same
          number of lines as was scrolled, even when scrolling different
          number of lines than requested with 'nosmoothscroll'.

fixes: #14743
closes: #14746

Signed-off-by: Luuk van Baal <luukvbaal@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Luuk van Baal
2024-05-11 11:27:52 +02:00
committed by Christian Brabandt
parent 031a745608
commit 58448e09be
3 changed files with 19 additions and 5 deletions

View File

@@ -3158,9 +3158,10 @@ static int get_scroll_overlap(int dir)
/*
* Scroll "count" lines with 'smoothscroll' in direction "dir". Return TRUE
* when scrolling happened.
* when scrolling happened. Adjust "curscount" for scrolling different amount of
* lines when 'smoothscroll' is disabled.
*/
static int scroll_with_sms(int dir, long count)
static int scroll_with_sms(int dir, long count, long *curscount)
{
int prev_sms = curwin->w_p_sms;
colnr_T prev_skipcol = curwin->w_skipcol;
@@ -3183,7 +3184,10 @@ static int scroll_with_sms(int dir, long count)
fixdir = dir * -1;
while (curwin->w_skipcol > 0
&& curwin->w_topline < curbuf->b_ml.ml_line_count)
{
scroll_redraw(fixdir == FORWARD, 1);
*curscount += (fixdir == dir ? 1 : -1);
}
}
curwin->w_p_sms = prev_sms;
@@ -3220,7 +3224,7 @@ pagescroll(int dir, long count, int half)
curwin->w_p_scr = MIN(curwin->w_height, count);
count = MIN(curwin->w_height, curwin->w_p_scr);
int curscount = count;
long curscount = count;
// Adjust count so as to not reveal end of buffer lines.
if (dir == FORWARD
&& (curwin->w_topline + curwin->w_height + count > buflen
@@ -3240,7 +3244,7 @@ pagescroll(int dir, long count, int half)
// (Try to) scroll the window unless already at the end of the buffer.
if (count > 0)
{
nochange = scroll_with_sms(dir, count);
nochange = scroll_with_sms(dir, count, &curscount);
curwin->w_cursor.lnum = prev_lnum;
curwin->w_cursor.col = prev_col;
curwin->w_curswant = prev_curswant;
@@ -3259,7 +3263,7 @@ pagescroll(int dir, long count, int half)
// Scroll [count] times 'window' or current window height lines.
count *= ((ONE_WINDOW && p_window > 0 && p_window < Rows - 1) ?
MAX(1, p_window - 2) : get_scroll_overlap(dir));
nochange = scroll_with_sms(dir, count);
nochange = scroll_with_sms(dir, count, &count);
// Place cursor at top or bottom of window.
validate_botline();

View File

@@ -4260,4 +4260,12 @@ func Test_page_cursor_topbot()
bwipe!
endfunc
" Test for Ctrl-D with long line
func Test_halfpage_longline()
10new
call setline(1, ['long'->repeat(1000), 'short'])
exe "norm! \<C-D>"
call assert_equal(2, line('.'))
bwipe!
endfunc
" vim: shiftwidth=2 sts=2 expandtab nofoldenable

View File

@@ -704,6 +704,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
407,
/**/
406,
/**/