changeset 30675:bc48f3752d8d v9.0.0672

patch 9.0.0672: line partly shows with 'smoothscroll' and 'scrolloff' zero Commit: https://github.com/vim/vim/commit/9bab7a024393200bb2c03b3abddfda86436990a7 Author: Bram Moolenaar <Bram@vim.org> Date: Thu Oct 6 14:57:53 2022 +0100 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 #11269)
author Bram Moolenaar <Bram@vim.org>
date Thu, 06 Oct 2022 16:00:04 +0200
parents b03910cf523e
children fee795c501bb
files src/move.c src/testdir/dumps/Test_smooth_wrap_1.dump src/testdir/dumps/Test_smooth_wrap_2.dump src/testdir/dumps/Test_smooth_wrap_3.dump src/testdir/dumps/Test_smooth_wrap_4.dump src/testdir/test_scroll_opt.vim src/version.c
diffstat 7 files changed, 69 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/move.c
+++ b/src/move.c
@@ -2171,6 +2171,7 @@ scroll_cursor_bot(int min_scroll, int se
 {
     int		used;
     int		scrolled = 0;
+    int		min_scrolled = 1;
     int		extra = 0;
     int		i;
     linenr_T	line_count;
@@ -2236,6 +2237,10 @@ scroll_cursor_bot(int min_scroll, int se
 	scrolled = used;
 	if (cln == curwin->w_botline)
 	    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_nofill(lnum);
     }
 
     /*
@@ -2361,7 +2366,12 @@ scroll_cursor_bot(int min_scroll, int se
     if (line_count >= curwin->w_height && line_count > min_scroll)
 	scroll_cursor_halfway(FALSE);
     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);
+    }
 
     /*
      * If topline didn't change we need to restore w_botline and w_empty_rows
new file mode 100644
--- /dev/null
+++ b/src/testdir/dumps/Test_smooth_wrap_1.dump
@@ -0,0 +1,8 @@
+|<+0#4040ff13#ffffff0@2|h+0#0000000&| |s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| @10
+|L|i|n|e| |w|i|t|h| |s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| |w|i|t|h| 
+|s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| 
+|w|i|t|h| |s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| @10
+>L|i|n|e| |w|i|t|h| |s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| |w|i|t|h| 
+|s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| 
+|w|i|t|h| |s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| @10
+@22|3|,|1| @10|T|o|p| 
new file mode 100644
--- /dev/null
+++ b/src/testdir/dumps/Test_smooth_wrap_2.dump
@@ -0,0 +1,8 @@
+|<+0#4040ff13#ffffff0@2|h+0#0000000&| |s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| @10
+|L|i|n|e| |w|i|t|h| |s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| |w|i|t|h| 
+|s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| 
+|w|i|t|h| |s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| @10
+>L|i|n|e| |w|i|t|h| |s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| |w|i|t|h| 
+|s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| 
+|w|i|t|h| |s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| @10
+@22|4|,|1| @10|2|5|%| 
new file mode 100644
--- /dev/null
+++ b/src/testdir/dumps/Test_smooth_wrap_3.dump
@@ -0,0 +1,8 @@
+|<+0#4040ff13#ffffff0@2|h+0#0000000&| |s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| @10
+|L|i|n|e| |w|i|t|h| |s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| |w|i|t|h| 
+|s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| 
+|w|i|t|h| |s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| @10
+>L|i|n|e| |w|i|t|h| |s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| |w|i|t|h| 
+|s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| 
+|w|i|t|h| |s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| @10
+@22|5|,|1| @10|5|0|%| 
new file mode 100644
--- /dev/null
+++ b/src/testdir/dumps/Test_smooth_wrap_4.dump
@@ -0,0 +1,8 @@
+|<+0#4040ff13#ffffff0@2|h+0#0000000&| |s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| @10
+|L|i|n|e| |w|i|t|h| |s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| |w|i|t|h| 
+|s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| 
+|w|i|t|h| |s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| @10
+>L|i|n|e| |w|i|t|h| |s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| |w|i|t|h| 
+|s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| 
+|w|i|t|h| |s|o|m|e| |t|e|x|t| |w|i|t|h| |s|o|m|e| |t|e|x|t| @10
+@22|7|,|1| @10|B|o|t| 
--- a/src/testdir/test_scroll_opt.vim
+++ b/src/testdir/test_scroll_opt.vim
@@ -167,6 +167,31 @@ func Test_smoothscroll_diff_mode()
   call StopVimInTerminal(buf)
 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
--- a/src/version.c
+++ b/src/version.c
@@ -700,6 +700,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    672,
+/**/
     671,
 /**/
     670,