vim-patch:9.1.0280: several issues with 'smoothscroll' support

Problem:  Logic to make sure cursor is in visible part of the screen after
          scrolling the text with 'smoothscroll' is scattered, asymmetric
          and contains bugs.
Solution: Adjust and create helper function for 'smoothscroll' cursor logic.
          (Luuk van Baal)

9148ba8a46
This commit is contained in:
Luuk van Baal
2024-04-08 22:40:55 +02:00
parent e21423bb35
commit 8f5fd0884b
6 changed files with 213 additions and 174 deletions

View File

@@ -1772,4 +1772,19 @@ func Test_diff_toggle_wrap_skipcol_leftcol()
\ screenpos(win2, line('.', win2), col('.', win2)))
bwipe!
bwipe!
endfunc
" Ctrl-D reveals filler lines below the last line in the buffer.
func Test_diff_eob_halfpage()
5new
call setline(1, ['']->repeat(10) + ['a'])
diffthis
5new
call setline(1, ['']->repeat(3) + ['a', 'b'])
diffthis
wincmd j
exe "norm! G\<C-D>"
call assert_equal(6, line('w0'))
%bwipe!

View File

@@ -1023,30 +1023,36 @@ func Test_smoothscroll_page()
" Half-page scrolling does not go beyond end of buffer and moves the cursor.
" Even with 'nostartofline', the correct amount of lines is scrolled.
setl nostartofline
exe "norm! 0\<C-D>"
exe "norm! 15|\<C-D>"
call assert_equal(200, winsaveview().skipcol)
call assert_equal(204, col('.'))
call assert_equal(215, col('.'))
exe "norm! \<C-D>"
call assert_equal(400, winsaveview().skipcol)
call assert_equal(404, col('.'))
call assert_equal(415, col('.'))
exe "norm! \<C-D>"
call assert_equal(520, winsaveview().skipcol)
call assert_equal(601, col('.'))
call assert_equal(535, col('.'))
exe "norm! \<C-D>"
call assert_equal(520, winsaveview().skipcol)
call assert_equal(801, col('.'))
exe "norm! \<C-U>"
call assert_equal(735, col('.'))
exe "norm! \<C-D>"
call assert_equal(520, winsaveview().skipcol)
call assert_equal(601, col('.'))
call assert_equal(895, col('.'))
exe "norm! \<C-U>"
call assert_equal(400, winsaveview().skipcol)
call assert_equal(404, col('.'))
call assert_equal(320, winsaveview().skipcol)
call assert_equal(695, col('.'))
exe "norm! \<C-U>"
call assert_equal(200, winsaveview().skipcol)
call assert_equal(204, col('.'))
call assert_equal(120, winsaveview().skipcol)
call assert_equal(495, col('.'))
exe "norm! \<C-U>"
call assert_equal(0, winsaveview().skipcol)
call assert_equal(40, col('.'))
call assert_equal(375, col('.'))
exe "norm! \<C-U>"
call assert_equal(0, winsaveview().skipcol)
call assert_equal(175, col('.'))
exe "norm! \<C-U>"
call assert_equal(0, winsaveview().skipcol)
call assert_equal(15, col('.'))
bwipe!
endfunc
@@ -1074,6 +1080,14 @@ func Test_smoothscroll_next_topline()
redraw
call assert_equal(2, line('w0'))
" Cursor does not end up above topline, adjusting topline later.
setlocal nu cpo+=n
exe "norm! G$g013\<C-Y>"
redraw
call assert_equal(2, line('.'))
call assert_equal(0, winsaveview().skipcol)
set cpo-=n
bwipe!
endfunc