patch 9.0.0445: when opening/closing window text moves up/down
Problem: When opening/closing window text moves up/down.
Solution: Add the 'splitscroll' option. When off text will keep its
position as much as possible.
diff --git a/src/testdir/test_window_cmd.vim b/src/testdir/test_window_cmd.vim
index e38c8a8..a75286f 100644
--- a/src/testdir/test_window_cmd.vim
+++ b/src/testdir/test_window_cmd.vim
@@ -1631,5 +1631,133 @@
set laststatus&
endfunc
+" Ensure no scrolling happens with 'nosplitscroll' with and without a
+" winbar, tabline, for each possible value of 'laststatus', 'scrolloff',
+" 'equalalways', and regardless of the cursor position.
+func Test_splitscroll_with_splits()
+ set nowrap
+ set nosplitscroll
+ 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"]
+ 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))
+ execute 'norm gg' . pos
+ " No scroll for vertical split and quit
+ vsplit | quit
+ call assert_equal(1, line("w0"))
+
+ " No scroll for horizontal split
+ split | redraw! | wincmd k
+ call assert_equal(1, line("w0"))
+
+ " No scroll when resizing windows
+ 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 | split | split | quit
+ 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
+ only | norm ggLq:
+ call assert_equal(1, line("w0"))
+
+ " 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"))
+ only
+ endfor
+ endfor
+ endfor
+ tabonly!
+ endfor
+ endfor
+ endfor
+ endfor
+
+ tabnew | tabonly! | %bwipeout!
+ iunmap c
+ set wrap&
+ set scrolloff&
+ set splitbelow&
+ set laststatus&
+ set equalalways&
+ set splitscroll&
+endfunc
" vim: shiftwidth=2 sts=2 expandtab