changeset 30285:9edb1a8161ac v9.0.0478

patch 9.0.0478: test for 'splitscroll' takes too much time Commit: https://github.com/vim/vim/commit/594f9e09cd68e6277b8aa08094405bc642c5792a Author: Luuk van Baal <luukvbaal@gmail.com> Date: Fri Sep 16 12:52:58 2022 +0100 patch 9.0.0478: test for 'splitscroll' takes too much time Problem: Test for 'splitscroll' takes too much time. Solution: Only test some of the combinations. (Luuk van Baal, closes https://github.com/vim/vim/issues/11139)
author Bram Moolenaar <Bram@vim.org>
date Fri, 16 Sep 2022 14:00:05 +0200
parents 5ba1ec8cf49f
children dab162d5609c
files runtime/optwin.vim src/testdir/test_window_cmd.vim src/version.c src/window.c
diffstat 4 files changed, 110 insertions(+), 112 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/optwin.vim
+++ b/runtime/optwin.vim
@@ -515,7 +515,7 @@ call <SID>AddOption("splitbelow", gettex
 call <SID>BinOptionG("sb", &sb)
 call <SID>AddOption("splitright", gettext("a new window is put right of the current one"))
 call <SID>BinOptionG("spr", &spr)
-call <SID>AddOption("splitscroll", gettext("determines scroll behavior when spliting windows"))
+call <SID>AddOption("splitscroll", gettext("determines scroll behavior for split windows"))
 call <SID>BinOptionG("spsc", &spsc)
 call <SID>AddOption("scrollbind", gettext("this window scrolls together with other bound windows"))
 call append("$", "\t" .. s:local_to_window)
--- a/src/testdir/test_window_cmd.vim
+++ b/src/testdir/test_window_cmd.vim
@@ -1637,127 +1637,119 @@ endfunc
 func Test_splitscroll_with_splits()
   set nowrap
   set nosplitscroll
+
+  " disallow window resizing
+  let save_WS = &t_WS
+  set t_WS=
+
   let gui = has("gui_running")
-  inoremap c <cmd>:copen<CR>
-  for winbar in [0, 1]
-    for sb in [0, 1]
-      for ea in [0, 1]
-        for tab in [0, 1]
-          for so in [0, 5]
-            for ls in range(0, 2)
-              for pos in ["H", "M", "L"]
-              tabnew | tabonly! | redraw
-              let tabline = (gui ? 0 : (tab ? 1 : 0))
-              let winbar_sb = (sb ? winbar : 0)
-              execute 'set scrolloff=' . so
-              execute 'set laststatus=' . ls
-              execute 'set ' . (ea ? 'equalalways' : 'noequalalways')
-              execute 'set ' . (sb ? 'splitbelow' : 'nosplitbelow')
-              execute tab ? 'tabnew' : ''
-              execute winbar ? 'nnoremenu 1.10 WinBar.Test :echo' : ''
-              call setline(1, range(1, 256))
-              " No scroll for restore_snapshot
-              norm G
-              try
-                copen | close | colder
-              catch /E380/
-              endtry
-              call assert_equal(257 - winheight(0), line("w0"))
+  inoremap <expr> c "<cmd>copen<bar>wincmd k<CR>"
+  for run in range(0, 10)
+    tabnew | tabonly! | redraw    
+    let tabline = (gui ? 0 : ((run % 5) ? 1 : 0))
+    let winbar_sb = (run % 2) && (run % 3)
+    execute 'set scrolloff=' . !(run % 3) ? 0 : run
+    execute 'set laststatus=' . (run % 3)
+    execute 'set ' . ((run % 2) ? 'equalalways' : 'noequalalways')
+    execute 'set ' . ((run % 3) ? 'splitbelow' : 'nosplitbelow')
+    execute (run % 5) ? 'tabnew' : ''
+    execute (run % 2) ? 'nnoremenu 1.10 WinBar.Test :echo' : ''
+    let pos = !(run % 3) ? 'H' : ((run % 2) ? 'M' : 'L')
+    call setline(1, range(1, 256))
+    " No scroll for restore_snapshot
+    norm G
+    try
+      copen | close | colder
+    catch /E380/
+    endtry
+    call assert_equal(257 - winheight(0), line("w0"))
 
-              " No scroll for firstwin horizontal split
-              execute 'norm gg' . pos
-              split | redraw | wincmd k
-              call assert_equal(1, line("w0"))
-              call assert_equal(&scroll, winheight(0) / 2)
-              wincmd j
-              call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0"))
+    " No scroll for firstwin horizontal split
+    execute 'norm gg' . pos
+    split | redraw | wincmd k
+    call assert_equal(1, line("w0"))
+    call assert_equal(&scroll, winheight(0) / 2)
+    wincmd j
+    call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0"))
 
-              " No scroll when resizing windows
-              wincmd k | resize +2
-              call assert_equal(1, line("w0"))
-              wincmd j
-              call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0"))
+    " No scroll when resizing windows
+    wincmd k | resize +2
+    call assert_equal(1, line("w0"))
+    wincmd j
+    call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0"))
 
-              " No scroll when dragging statusline
-              call win_move_statusline(1, -3)
-              call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0"))
-              wincmd k
-              call assert_equal(1, line("w0"))
+    " No scroll when dragging statusline
+    call win_move_statusline(1, -3)
+    call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0"))
+    wincmd k
+    call assert_equal(1, line("w0"))
 
-              " No scroll when changing shellsize
-              set lines+=2
-              call assert_equal(1, line("w0"))
-              wincmd j
-              call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0"))
-              set lines-=2
-              call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0"))
-              wincmd k
-              call assert_equal(1, line("w0"))
+    " No scroll when changing shellsize
+    set lines+=2
+    call assert_equal(1, line("w0"))
+    wincmd j
+    call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0"))
+    set lines-=2
+    call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0"))
+    wincmd k
+    call assert_equal(1, line("w0"))
 
-              " No scroll when equalizing windows
-              wincmd =
-              call assert_equal(1, line("w0"))
-              wincmd j
-              call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0"))
-              wincmd k
-              call assert_equal(1, line("w0"))
-
-              " No scroll in windows split multiple times
-              vsplit | split | 4wincmd w
-              call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0"))
-              1wincmd w | quit | wincmd l | split
-              call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0"))
-              wincmd j
-              call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0"))
+    " No scroll when equalizing windows
+    wincmd =
+    call assert_equal(1, line("w0"))
+    wincmd j
+    call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0"))
+    wincmd k
+    call assert_equal(1, line("w0"))
 
-              " No scroll in small window
-              2wincmd w | only | 5split | wincmd k
-              call assert_equal(1, line("w0"))
-              wincmd j
-              call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0"))
+    " No scroll in windows split multiple times
+    vsplit | split | 4wincmd w
+    call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0"))
+    1wincmd w | quit | wincmd l | split
+    call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0"))
+    wincmd j
+    call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0"))
 
-              " No scroll for vertical split
-              quit | vsplit | wincmd l
-              call assert_equal(1, line("w0"))
-              wincmd h
-              call assert_equal(1, line("w0"))
+    " No scroll in small window
+    2wincmd w | only | 5split | wincmd k
+    call assert_equal(1, line("w0"))
+    wincmd j
+    call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0"))
 
-              " No scroll in windows split and quit multiple times
-              quit | redraw | split | redraw | split | redraw | quit | redraw
-              call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0"))
+    " No scroll for vertical split
+    quit | vsplit | wincmd l
+    call assert_equal(1, line("w0"))
+    wincmd h
+    call assert_equal(1, line("w0"))
 
-              " No scroll for new buffer
-              1wincmd w | only | copen | wincmd k
-              call assert_equal(1, line("w0"))
-              only
-              call assert_equal(1, line("w0"))
-              above copen | wincmd j
-              call assert_equal(win_screenpos(0)[0] - tabline, line("w0"))
+    " No scroll in windows split and quit multiple times
+    quit | redraw | split | redraw | split | redraw | quit | redraw
+    call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0"))
 
-              " No scroll when opening cmdwin, and no cursor move when closing
-              " cmdwin.
-              only | norm ggL
-              let curpos = getcurpos()
-              norm q:
-              call assert_equal(1, line("w0"))
-              call assert_equal(curpos, getcurpos())
+    " No scroll for new buffer
+    1wincmd w | only | copen | wincmd k
+    call assert_equal(1, line("w0"))
+    only
+    call assert_equal(1, line("w0"))
+    above copen | wincmd j
+    call assert_equal(win_screenpos(0)[0] - tabline, line("w0"))
 
-              " Scroll when cursor becomes invalid in insert mode
-              norm Lic
-              wincmd k | only
-              call assert_notequal(1, line("w0"))
+    " No scroll when opening cmdwin, and no cursor move when closing cmdwin.
+    only | norm ggL
+    let curpos = getcurpos()
+    norm q:
+    call assert_equal(1, line("w0"))
+    call assert_equal(curpos, getcurpos())
 
-              " No scroll when topline not equal to 1
-              execute "norm gg5\<C-e>" | split | wincmd k
-              call assert_equal(6, line("w0"))
-              wincmd j
-              call assert_equal(5 + win_screenpos(0)[0] - tabline - winbar_sb, line("w0"))
-              endfor
-            endfor
-          endfor
-        endfor
-      endfor
-    endfor
+    " Scroll when cursor becomes invalid in insert mode
+    norm Lic
+    call assert_equal(curpos, getcurpos())
+
+    " No scroll when topline not equal to 1
+    only | execute "norm gg5\<C-e>" | split | wincmd k
+    call assert_equal(6, line("w0"))
+    wincmd j
+    call assert_equal(5 + win_screenpos(0)[0] - tabline - winbar_sb, line("w0"))
   endfor
 
   tabnew | tabonly! | %bwipeout!
@@ -1768,6 +1760,7 @@ func Test_splitscroll_with_splits()
   set laststatus&
   set equalalways&
   set splitscroll&
+  let &t_WS = save_WS
 endfunc
 
 function Test_nosplitscroll_cmdwin_cursor_position()
--- a/src/version.c
+++ b/src/version.c
@@ -704,6 +704,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    478,
+/**/
     477,
 /**/
     476,
--- a/src/window.c
+++ b/src/window.c
@@ -6403,7 +6403,6 @@ win_fix_scroll(int resize)
     static void
 win_fix_cursor(int normal)
 {
-    int      top = FALSE;
     win_T    *wp = curwin;
     long     so = get_scrolloff_value();
     linenr_T nlnum = 0;
@@ -6418,7 +6417,7 @@ win_fix_cursor(int normal)
     so = MIN(wp->w_height / 2, so);
     // Check if cursor position is above topline or below botline.
     if (wp->w_cursor.lnum < (wp->w_topline + so) && wp->w_topline != 1)
-	top = nlnum = MIN(wp->w_topline + so, wp->w_buffer->b_ml.ml_line_count);
+	nlnum = MIN(wp->w_topline + so, wp->w_buffer->b_ml.ml_line_count);
     else if (wp->w_cursor.lnum > (wp->w_botline - so - 1)
 	    && (wp->w_botline - wp->w_buffer->b_ml.ml_line_count) != 1)
 	nlnum = MAX(wp->w_botline - so - 1, 1);
@@ -6436,7 +6435,11 @@ win_fix_cursor(int normal)
 	}
 	else
 	{   // Ensure cursor stays visible if we are not in normal mode.
-	    wp->w_fraction = top ? 0 : FRACTION_MULT;
+	    wp->w_fraction = 0.5 * FRACTION_MULT;
+	    // Make sure cursor is closer to topline than botline.
+	    if (so == wp->w_height / 2
+			  && nlnum - wp->w_topline > wp->w_botline - 1 - nlnum)
+		wp->w_fraction++;
 	    scroll_to_fraction(wp, wp->w_prev_height);
 	}
     }