vim-patch:9.0.0672: line partly shows with 'smoothscroll' and 'scrolloff' zero

Problem:    Cursor line only partly shows with 'smoothscroll' and 'scrolloff'
            zero.
Solution:   Do not use 'smoothscroll' when adjusting the bottom of the window.
            (closes vim/vim#11269)

9bab7a0243

Co-authored-by: Bram Moolenaar <Bram@vim.org>
This commit is contained in:
Luuk van Baal
2023-04-26 17:08:35 +02:00
parent 8e4a4629ca
commit 3a1973debc
3 changed files with 62 additions and 0 deletions

View File

@@ -1627,6 +1627,7 @@ void scroll_cursor_bot(int min_scroll, int set_topbot)
{ {
int used; int used;
int scrolled = 0; int scrolled = 0;
int min_scrolled = 1;
int extra = 0; int extra = 0;
lineoff_T loff; lineoff_T loff;
lineoff_T boff; lineoff_T boff;
@@ -1676,6 +1677,12 @@ void scroll_cursor_bot(int min_scroll, int set_topbot)
if (cln == curwin->w_botline) { if (cln == curwin->w_botline) {
scrolled -= curwin->w_empty_rows; scrolled -= curwin->w_empty_rows;
} }
min_scrolled = scrolled;
if (cln > curwin->w_botline && curwin->w_p_sms && curwin->w_p_wrap) {
for (linenr_T lnum = curwin->w_botline + 1; lnum <= cln; lnum++) {
min_scrolled += plines_win_nofill(curwin, lnum, true);
}
}
} }
// Stop counting lines to scroll when // Stop counting lines to scroll when
@@ -1777,6 +1784,10 @@ void scroll_cursor_bot(int min_scroll, int set_topbot)
if (line_count >= curwin->w_height_inner && line_count > min_scroll) { if (line_count >= curwin->w_height_inner && line_count > min_scroll) {
scroll_cursor_halfway(false, true); scroll_cursor_halfway(false, true);
} else { } else {
// With 'smoothscroll' scroll at least the height of the cursor line.
if (curwin->w_p_wrap && curwin->w_p_sms && line_count < min_scrolled) {
line_count = min_scrolled;
}
scrollup(line_count, true); scrollup(line_count, true);
} }

View File

@@ -301,4 +301,30 @@ describe('smoothscroll', function()
feed('<C-E>') feed('<C-E>')
screen:expect_unchanged() screen:expect_unchanged()
end) end)
-- oldtest: Test_smoothscroll_wrap_scrolloff_zero()
it("works with zero 'scrolloff'", function()
screen:try_resize(40, 8)
exec([[
call setline(1, ['Line' .. (' with some text'->repeat(7))]->repeat(7))
set smoothscroll scrolloff=0
:3
]])
screen:expect([[
<<<h some text with some text |
Line with some text with some text with |
some text with some text with some text |
with some text with some text |
^Line with some text with some text with |
some text with some text with some text |
with some text with some text |
|
]])
feed('j')
screen:expect_unchanged()
feed('<C-E>j')
screen:expect_unchanged()
feed('G')
screen:expect_unchanged()
end)
end) end)

View File

@@ -184,6 +184,31 @@ func Test_smoothscroll_diff_mode()
call StopVimInTerminal(buf) call StopVimInTerminal(buf)
endfunc endfunc
func Test_smoothscroll_wrap_scrolloff_zero()
CheckScreendump
let lines =<< trim END
vim9script
setline(1, ['Line' .. (' with some text'->repeat(7))]->repeat(7))
set smoothscroll scrolloff=0
:3
END
call writefile(lines, 'XSmoothWrap', 'D')
let buf = RunVimInTerminal('-S XSmoothWrap', #{rows: 8, cols: 40})
call VerifyScreenDump(buf, 'Test_smooth_wrap_1', {})
call term_sendkeys(buf, "j")
call VerifyScreenDump(buf, 'Test_smooth_wrap_2', {})
call term_sendkeys(buf, "\<C-E>j")
call VerifyScreenDump(buf, 'Test_smooth_wrap_3', {})
call term_sendkeys(buf, "G")
call VerifyScreenDump(buf, 'Test_smooth_wrap_4', {})
call StopVimInTerminal(buf)
endfunc
" vim: shiftwidth=2 sts=2 expandtab " vim: shiftwidth=2 sts=2 expandtab