]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.0.1603: display wrong if scrolling multiple lines with 'smoothscroll' v9.0.1603
authorzeertzjq <zeertzjq@outlook.com>
Sat, 3 Jun 2023 21:08:33 +0000 (22:08 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 3 Jun 2023 21:08:33 +0000 (22:08 +0100)
Problem:    Display wrong when scrolling multiple lines with 'smoothscroll'
            set.
Solution:   Redraw when w_skipcol changed. (closes #12477, closes #12468)

src/move.c
src/testdir/dumps/Test_smooth_multi_skipcol_1.dump [new file with mode: 0644]
src/testdir/dumps/Test_smooth_multi_skipcol_2.dump [new file with mode: 0644]
src/testdir/test_scroll_opt.vim
src/version.c

index ff2f4940170d17afff9e7a8b236007c6197c485b..54f5648c214d16fd24226024113a10ca21c1743f 100644 (file)
@@ -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 (file)
index 0000000..80f563b
--- /dev/null
@@ -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 (file)
index 0000000..9ef4aaf
--- /dev/null
@@ -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| 
index 7a95e6fecfb9599814c6ae186a4d80a5140a83eb..3806486bf654275845219c2a5825d1631a759eca 100644 (file)
@@ -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\<C-E>")
+  call VerifyScreenDump(buf, 'Test_smooth_multi_skipcol_2', {})
+
+  call StopVimInTerminal(buf)
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
index a724b7ccfa85c2842ce78eee40e421f2da5903b7..311892c1ba7947dcae01fd7302edfa881371478c 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1603,
 /**/
     1602,
 /**/