summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuuk van Baal <luukvbaal@gmail.com>2022-09-16 12:52:58 +0100
committerBram Moolenaar <Bram@vim.org>2022-09-16 12:52:58 +0100
commit594f9e09cd68e6277b8aa08094405bc642c5792a (patch)
tree108b28b300454e9269ff35530f8047fc0fc30399
parent3e8b7a6056986caf561f1b6168af7837919df9b9 (diff)
downloadvim-git-594f9e09cd68e6277b8aa08094405bc642c5792a.tar.gz
patch 9.0.0478: test for 'splitscroll' takes too much timev9.0.0478
Problem: Test for 'splitscroll' takes too much time. Solution: Only test some of the combinations. (Luuk van Baal, closes #11139)
-rw-r--r--runtime/optwin.vim2
-rw-r--r--src/testdir/test_window_cmd.vim233
-rw-r--r--src/version.c2
-rw-r--r--src/window.c9
4 files changed, 122 insertions, 124 deletions
diff --git a/runtime/optwin.vim b/runtime/optwin.vim
index 6b9b5fec9..f2748b4eb 100644
--- a/runtime/optwin.vim
+++ b/runtime/optwin.vim
@@ -515,7 +515,7 @@ call <SID>AddOption("splitbelow", gettext("a new window is put below the current
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)
diff --git a/src/testdir/test_window_cmd.vim b/src/testdir/test_window_cmd.vim
index cbf2db563..d0be91ed7 100644
--- 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"))
-
- " 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 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 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 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 for vertical split
- quit | vsplit | wincmd l
- call assert_equal(1, line("w0"))
- wincmd h
- call assert_equal(1, 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 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 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())
-
- " Scroll when cursor becomes invalid in insert mode
- norm Lic
- wincmd k | only
- call assert_notequal(1, line("w0"))
-
- " 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
+ 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 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 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 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 for vertical split
+ quit | vsplit | wincmd l
+ call assert_equal(1, line("w0"))
+ wincmd h
+ call assert_equal(1, 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 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 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())
+
+ " 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()
diff --git a/src/version.c b/src/version.c
index 615544612..b45a6910a 100644
--- 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
index fc7b8df3b..2e4a80678 100644
--- 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);
}
}