# HG changeset patch # User Bram Moolenaar # Date 1685826904 -7200 # Node ID ca42967a325325c5680096b16b05ff5ff8c335aa # Parent a046ef26570dd92312606e0316adc87c97371ffd patch 9.0.1603: display wrong if scrolling multiple lines with 'smoothscroll' Commit: https://github.com/vim/vim/commit/3c802277604a6b21110e41bedfe4c937ba7c2b7d Author: zeertzjq Date: Sat Jun 3 22:08:33 2023 +0100 patch 9.0.1603: display wrong if scrolling multiple lines with 'smoothscroll' Problem: Display wrong when scrolling multiple lines with 'smoothscroll' set. Solution: Redraw when w_skipcol changed. (closes #12477, closes #12468) diff --git a/src/move.c b/src/move.c --- a/src/move.c +++ b/src/move.c @@ -1785,6 +1785,7 @@ scrollup( int width2 = width1 + curwin_col_off2(); int size = 0; linenr_T prev_topline = curwin->w_topline; + colnr_T prev_skipcol = curwin->w_skipcol; if (do_sms) size = linetabsize(curwin, curwin->w_topline); @@ -1847,8 +1848,9 @@ scrollup( } } - if (curwin->w_topline == prev_topline) - // need to redraw even though w_topline didn't change + if (curwin->w_topline == prev_topline + || curwin->w_skipcol != prev_skipcol) + // need to redraw because wl_size of the topline may now be invalid redraw_later(UPD_NOT_VALID); } else diff --git a/src/testdir/dumps/Test_smooth_multi_skipcol_1.dump b/src/testdir/dumps/Test_smooth_multi_skipcol_1.dump new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_smooth_multi_skipcol_1.dump @@ -0,0 +1,10 @@ +> +8&#ffffff0@39 +| +0&&@39 +|a@39 +@10| @29 +@40 +@40 +@40 +@40 +|b@2| @36 +@22|1|,|0|-|1| @8|T|o|p| diff --git a/src/testdir/dumps/Test_smooth_multi_skipcol_2.dump b/src/testdir/dumps/Test_smooth_multi_skipcol_2.dump new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_smooth_multi_skipcol_2.dump @@ -0,0 +1,10 @@ +|<+0#4040ff13#ffffff0@2|a+8#0000000&@5>a| @29 +| +0&&@39 +@40 +@40 +@40 +|b@2| @36 +|c@2| @36 +|~+0#4040ff13&| @38 +|~| @38 +| +0#0000000&@21|3|,|5|0| @9|B|o|t| diff --git a/src/testdir/test_scroll_opt.vim b/src/testdir/test_scroll_opt.vim --- a/src/testdir/test_scroll_opt.vim +++ b/src/testdir/test_scroll_opt.vim @@ -777,7 +777,7 @@ func Test_smoothscroll_incsearch() call setline(14, 'bbbb') END call writefile(lines, 'XSmoothIncsearch', 'D') - let buf = RunVimInTerminal('-S XSmoothIncsearch', #{rows: 8, cols:40}) + let buf = RunVimInTerminal('-S XSmoothIncsearch', #{rows: 8, cols: 40}) call term_sendkeys(buf, "/b") call VerifyScreenDump(buf, 'Test_smooth_incsearch_1', {}) @@ -792,4 +792,26 @@ func Test_smoothscroll_incsearch() call StopVimInTerminal(buf) endfunc +" Test scrolling multiple lines and stopping at non-zero skipcol. +func Test_smoothscroll_multi_skipcol() + CheckScreendump + + let lines =<< trim END + setlocal cursorline scrolloff=0 smoothscroll + call setline(1, repeat([''], 9)) + call setline(3, repeat('a', 50)) + call setline(8, 'bbb') + call setline(9, 'ccc') + redraw + END + call writefile(lines, 'XSmoothMultiSkipcol', 'D') + let buf = RunVimInTerminal('-S XSmoothMultiSkipcol', #{rows: 10, cols: 40}) + call VerifyScreenDump(buf, 'Test_smooth_multi_skipcol_1', {}) + + call term_sendkeys(buf, "3\") + call VerifyScreenDump(buf, 'Test_smooth_multi_skipcol_2', {}) + + call StopVimInTerminal(buf) +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1603, +/**/ 1602, /**/ 1601,