vim-patch:9.2.0904: "zb" scrolls incorrectly with cursor just above fold (#41143)

Problem:  "zb" scrolls incorrectly with cursor just above fold.
Solution: Handle boff.lnum being set to the last line of a fold
          (zeertzjq).

With the cursor just above fold, botline_forw() moves boff.lnum to the
last line of the fold, but curwin->w_botline is at the first line of the
fold, so the boff.lnum == curwin->w_botline condition never holds.

Instead, check that boff.lnum has just moved to or past w_botline by
comparing its previous value with w_botline.

Also make a similar change to the loff.lnum check above for symmetry.
That one doesn't change behavior, as topline_back() sets loff.lnum to
the first line of a fold.

related: neovim/neovim#41122
closes:  vim/vim#20923

aee686334c
(cherry picked from commit 21a0227d2f)
This commit is contained in:
zeertzjq
2026-08-04 07:43:09 +08:00
committed by github-actions[bot]
parent c34d02ac79
commit 327c04a0d1
2 changed files with 11 additions and 6 deletions

View File

@@ -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