1
0
forked from aniani/vim

patch 9.0.0647: the 'splitscroll' option is not a good name

Problem:    The 'splitscroll' option is not a good name.
Solution:   Rename 'splitscroll' to 'splitkeep' and make it a string option,
            also supporting "topline". (Luuk van Baal, closes #11258)
This commit is contained in:
Luuk van Baal
2022-10-03 15:28:08 +01:00
committed by Bram Moolenaar
parent 6b2d4ff714
commit 13ece2ae1d
21 changed files with 141 additions and 129 deletions

View File

@@ -1632,31 +1632,29 @@ func Test_win_equal_last_status()
set laststatus&
endfunc
" Ensure no scrolling happens with 'nosplitscroll' for a sequence of
" Test "screen" and "cursor" values for 'splitkeep' with a sequence of
" split operations for various options: with and without a winbar,
" tabline, for each possible value of 'laststatus', 'scrolloff',
" 'equalalways', and regardless of the cursor position.
func Test_nosplitscroll_options()
set nowrap
set nosplitscroll
" 'equalalways', and with the cursor at the top, middle and bottom.
func Test_splitkeep_options()
" disallow window resizing
let save_WS = &t_WS
set t_WS=
let gui = has("gui_running")
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 % 4) ? 0 : run)
execute 'set laststatus=' . (run % 3)
execute 'set ' . ((run % 2) ? 'equalalways' : 'noequalalways')
execute 'set ' . ((run % 3) ? 'splitbelow' : 'nosplitbelow')
for run in range(0, 20)
let &splitkeep = run > 10 ? 'topline' : 'screen'
let &scrolloff = (!(run % 4) ? 0 : run)
let &laststatus = (run % 3)
let &splitbelow = (run % 3)
let &equalalways = (run % 2)
let wsb = (run % 2) && &splitbelow
let tl = (gui ? 0 : ((run % 5) ? 1 : 0))
let pos = !(run % 3) ? 'H' : ((run % 2) ? 'M' : 'L')
tabnew | tabonly! | redraw
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
@@ -1672,17 +1670,17 @@ func Test_nosplitscroll_options()
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"))
call assert_equal(&spk == 'topline' ? 1 : win_screenpos(0)[0] - tl - wsb, line("w0"))
" No scroll when resizing windows
wincmd k | resize +2
wincmd k | resize +2 | redraw
call assert_equal(1, line("w0"))
wincmd j
call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0"))
call assert_equal(&spk == 'topline' ? 1 : win_screenpos(0)[0] - tl - wsb, 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"))
call assert_equal(&spk == 'topline' ? 1 : win_screenpos(0)[0] - tl - wsb, line("w0"))
wincmd k
call assert_equal(1, line("w0"))
@@ -1690,9 +1688,9 @@ func Test_nosplitscroll_options()
set lines+=2
call assert_equal(1, line("w0"))
wincmd j
call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0"))
call assert_equal(&spk == 'topline' ? 1 : win_screenpos(0)[0] - tl - wsb, line("w0"))
set lines-=2
call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0"))
call assert_equal(&spk == 'topline' ? 1 : win_screenpos(0)[0] - tl - wsb, line("w0"))
wincmd k
call assert_equal(1, line("w0"))
@@ -1700,23 +1698,23 @@ func Test_nosplitscroll_options()
wincmd =
call assert_equal(1, line("w0"))
wincmd j
call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0"))
call assert_equal(&spk == 'topline' ? 1 : win_screenpos(0)[0] - tl - wsb, 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"))
call assert_equal(&spk == 'topline' ? 1 : win_screenpos(0)[0] - tl - wsb, line("w0"))
1wincmd w | quit | wincmd l | split
call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0"))
call assert_equal(&spk == 'topline' ? 1 : win_screenpos(0)[0] - tl - wsb, line("w0"))
wincmd j
call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0"))
call assert_equal(&spk == 'topline' ? 1 : win_screenpos(0)[0] - tl - wsb, 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"))
call assert_equal(&spk == 'topline' ? 1 : win_screenpos(0)[0] - tl - wsb, line("w0"))
" No scroll for vertical split
quit | vsplit | wincmd l
@@ -1725,8 +1723,8 @@ func Test_nosplitscroll_options()
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"))
quit | redraw | split | split | quit | redraw
call assert_equal(&spk == 'topline' ? 1 : win_screenpos(0)[0] - tl - wsb, line("w0"))
" No scroll for new buffer
1wincmd w | only | copen | wincmd k
@@ -1734,7 +1732,7 @@ func Test_nosplitscroll_options()
only
call assert_equal(1, line("w0"))
above copen | wincmd j
call assert_equal(win_screenpos(0)[0] - tabline, line("w0"))
call assert_equal(&spk == 'topline' ? 1 : win_screenpos(0)[0] - tl, line("w0"))
" No scroll when opening cmdwin, and no cursor move when closing cmdwin.
only | norm ggL
@@ -1751,22 +1749,21 @@ func Test_nosplitscroll_options()
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"))
call assert_equal(&spk == 'topline' ? 6 : 5 + win_screenpos(0)[0] - tl - wsb, line("w0"))
endfor
tabnew | tabonly! | %bwipeout!
iunmap c
set wrap&
set scrolloff&
set splitbelow&
set laststatus&
set equalalways&
set splitscroll&
set splitkeep&
let &t_WS = save_WS
endfunc
function Test_nosplitscroll_cmdwin_cursor_position()
set nosplitscroll
function Test_splitkeep_cmdwin_cursor_position()
set splitkeep=screen
call setline(1, range(&lines))
" No scroll when cursor is at near bottom of window and cusor position
@@ -1789,11 +1786,11 @@ function Test_nosplitscroll_cmdwin_cursor_position()
call assert_equal(1, col('.'))
%bwipeout!
set splitscroll&
set splitkeep&
endfunction
function Test_nosplitscroll_misc()
set nosplitscroll
function Test_splitkeep_misc()
set splitkeep=screen
set splitbelow
call setline(1, range(1, &lines))
@@ -1815,67 +1812,68 @@ function Test_nosplitscroll_misc()
%bwipeout!
set splitbelow&
set splitscroll&
set splitkeep&
endfunc
function Test_nosplitscroll_callback()
function Test_splitkeep_callback()
CheckScreendump
let lines =<< trim END
set nosplitscroll
set splitkeep=screen
call setline(1, range(&lines))
function WincmdCb(a, b)
function C1(a, b)
split | wincmd p
endfunction
function TermCb(a, b)
function C2(a, b)
close | split
endfunction
nnoremap t <cmd>call popup_create(term_start(&shell, { 'hidden': 1, 'exit_cb': 'TermCb' }), {})<CR>
nnoremap j <cmd>call job_start([&shell, &shellcmdflag, "echo"], { 'exit_cb': 'WincmdCb' })<CR>
nn j <cmd>call job_start([&sh, &shcf, "true"], { 'exit_cb': 'C1' })<CR>
nn t <cmd>call popup_create(term_start([&sh, &shcf, "true"],
\ { 'hidden': 1, 'exit_cb': 'C2' }), {})<CR>
END
call writefile(lines, 'XTestNosplitscrollCallback', 'D')
let buf = RunVimInTerminal('-S XTestNosplitscrollCallback', #{rows: 8})
call writefile(lines, 'XTestSplitkeepCallback', 'D')
let buf = RunVimInTerminal('-S XTestSplitkeepCallback', #{rows: 8})
call term_sendkeys(buf, "j")
call VerifyScreenDump(buf, 'Test_nosplitscroll_callback_1', {})
call VerifyScreenDump(buf, 'Test_splitkeep_callback_1', {})
call term_sendkeys(buf, ":quit\<CR>Htexit\<CR>")
call VerifyScreenDump(buf, 'Test_nosplitscroll_callback_2', {})
call term_sendkeys(buf, ":quit\<CR>Ht")
call VerifyScreenDump(buf, 'Test_splitkeep_callback_2', {})
call term_sendkeys(buf, ":set sb\<CR>:quit\<CR>Gj")
call VerifyScreenDump(buf, 'Test_nosplitscroll_callback_3', {})
call VerifyScreenDump(buf, 'Test_splitkeep_callback_3', {})
call term_sendkeys(buf, ":quit\<CR>Gtexit\<CR>")
call VerifyScreenDump(buf, 'Test_nosplitscroll_callback_4', {})
call term_sendkeys(buf, ":quit\<CR>Gt")
call VerifyScreenDump(buf, 'Test_splitkeep_callback_4', {})
endfunc
function Test_nosplitscroll_fold()
CheckScreendump
function Test_splitkeep_fold()
CheckScreendump
let lines =<< trim END
set nosplitscroll
set foldmethod=marker
set number
let line = 1
for n in range(1, &lines)
call setline(line, ['int FuncName() {/*{{{*/', 1, 2, 3, 4, 5, '}/*}}}*/',
\ 'after fold'])
let line += 8
endfor
END
call writefile(lines, 'XTestNosplitscrollFold', 'D')
let buf = RunVimInTerminal('-S XTestNosplitscrollFold', #{rows: 10})
let lines =<< trim END
set splitkeep=screen
set foldmethod=marker
set number
let line = 1
for n in range(1, &lines)
call setline(line, ['int FuncName() {/*{{{*/', 1, 2, 3, 4, 5, '}/*}}}*/',
\ 'after fold'])
let line += 8
endfor
END
call writefile(lines, 'XTestSplitkeepFold', 'D')
let buf = RunVimInTerminal('-S XTestSplitkeepFold', #{rows: 10})
call term_sendkeys(buf, "L:wincmd s\<CR>")
call VerifyScreenDump(buf, 'Test_nosplitscroll_fold_1', {})
call VerifyScreenDump(buf, 'Test_splitkeep_fold_1', {})
call term_sendkeys(buf, ":quit\<CR>")
call VerifyScreenDump(buf, 'Test_nosplitscroll_fold_2', {})
call VerifyScreenDump(buf, 'Test_splitkeep_fold_2', {})
call term_sendkeys(buf, "H:below split\<CR>")
call VerifyScreenDump(buf, 'Test_nosplitscroll_fold_3', {})
call VerifyScreenDump(buf, 'Test_splitkeep_fold_3', {})
call term_sendkeys(buf, ":wincmd k\<CR>:quit\<CR>")
call VerifyScreenDump(buf, 'Test_nosplitscroll_fold_4', {})
call VerifyScreenDump(buf, 'Test_splitkeep_fold_4', {})
endfunction
" vim: shiftwidth=2 sts=2 expandtab