# HG changeset patch # User Bram Moolenaar # Date 1663329605 -7200 # Node ID 9edb1a8161ac12d65e85b60ed5fb1cc45a361f8b # Parent 5ba1ec8cf49ff5bc061be35db0d5a29019145353 patch 9.0.0478: test for 'splitscroll' takes too much time Commit: https://github.com/vim/vim/commit/594f9e09cd68e6277b8aa08094405bc642c5792a Author: Luuk van Baal 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) diff --git a/runtime/optwin.vim b/runtime/optwin.vim --- a/runtime/optwin.vim +++ b/runtime/optwin.vim @@ -515,7 +515,7 @@ call AddOption("splitbelow", gettex call BinOptionG("sb", &sb) call AddOption("splitright", gettext("a new window is put right of the current one")) call BinOptionG("spr", &spr) -call AddOption("splitscroll", gettext("determines scroll behavior when spliting windows")) +call AddOption("splitscroll", gettext("determines scroll behavior for split windows")) call BinOptionG("spsc", &spsc) call AddOption("scrollbind", gettext("this window scrolls together with other bound windows")) call append("$", "\t" .. s:local_to_window) diff --git a/src/testdir/test_window_cmd.vim b/src/testdir/test_window_cmd.vim --- 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 :copen - 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 c "copenwincmd k" + 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\" | 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\" | 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() diff --git a/src/version.c b/src/version.c --- 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, diff --git a/src/window.c b/src/window.c --- 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); } }