diff --git a/src/nvim/move.c b/src/nvim/move.c index bcb37dbda6..3ba0f07e55 100644 --- a/src/nvim/move.c +++ b/src/nvim/move.c @@ -2040,6 +2040,7 @@ void scroll_cursor_bot(win_T *wp, int min_scroll, bool set_topbot) break; } + linenr_T loff_lnum_before = loff.lnum; // Add one line above topline_back(wp, &loff); if (loff.height == MAXCOL) { @@ -2055,13 +2056,13 @@ void scroll_cursor_bot(win_T *wp, int min_scroll, bool set_topbot) || loff.fill <= fill_below_window)) { // Count screen lines that are below the window. scrolled += loff.height; - if (loff.lnum == wp->w_botline - && loff.fill == 0) { + if (loff.lnum == wp->w_botline && loff_lnum_before > curwin->w_botline) { scrolled -= wp->w_empty_rows; } } if (boff.lnum < wp->w_buffer->b_ml.ml_line_count) { + linenr_T boff_lnum_before = boff.lnum; // Add one line below botline_forw(wp, &boff); assert(boff.height != MAXCOL); @@ -2077,8 +2078,7 @@ void scroll_cursor_bot(win_T *wp, int min_scroll, bool set_topbot) && boff.fill > wp->w_filler_rows)) { // Count screen lines that are below the window. scrolled += boff.height; - if (boff.lnum == wp->w_botline - && boff.fill == 0) { + if (boff.lnum >= curwin->w_botline && boff_lnum_before < curwin->w_botline) { scrolled -= wp->w_empty_rows; } } diff --git a/test/old/testdir/test_normal.vim b/test/old/testdir/test_normal.vim index 6a272c80f4..6c174a63e3 100644 --- a/test/old/testdir/test_normal.vim +++ b/test/old/testdir/test_normal.vim @@ -4307,16 +4307,21 @@ func Test_single_line_filler_zb() endfunc " Test for zb with fewer buffer lines than window height, non-zero 'scrolloff' -" and cursor on fold. -func Test_zb_with_cursor_on_fold() +" and cursor on or just above a fold. +func Test_zb_with_cursor_on_or_just_above_fold() 15new call setline(1, range(1, 5) + ['', 'foo{{{', 'bar}}}', '', 'baz']) setlocal foldmethod=marker scrolloff=1 call assert_equal(8, foldclosedend(7)) + call cursor(7, 1) normal! zb call assert_equal(1, line('w0')) + call cursor(6, 1) + normal! zb + call assert_equal(1, line('w0')) + bwipe! endfunc