mirror of
https://github.com/neovim/neovim
synced 2025-07-16 01:01:49 +00:00
vim-patch:9.1.1482: scrolling with 'splitkeep' and line() (#34670)
Problem: Topline is preemptively updated by line() in WinResized autocmd with 'splitkeep' != "cursor". Solution: Set `skip_update_topline` when 'splitkeep' != "cursor". (Luuk van Baal)fe803c8c04
(cherry picked from commit0b91e9f83b
)
This commit is contained in:
committed by
github-actions[bot]
parent
db3b856779
commit
d5cbc99358
@ -4437,17 +4437,15 @@ static void f_line(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
|
||||
if (wp != NULL && tp != NULL) {
|
||||
switchwin_T switchwin;
|
||||
if (switch_win_noblock(&switchwin, wp, tp, true) == OK) {
|
||||
// in diff mode, prevent that the window scrolls
|
||||
// and keep the topline
|
||||
if (curwin->w_p_diff && switchwin.sw_curwin->w_p_diff) {
|
||||
// With 'splitkeep' != cursor and in diff mode, prevent that the
|
||||
// window scrolls and keep the topline.
|
||||
if (*p_spk != 'c' || (curwin->w_p_diff && switchwin.sw_curwin->w_p_diff)) {
|
||||
skip_update_topline = true;
|
||||
}
|
||||
check_cursor(curwin);
|
||||
fp = var2fpos(&argvars[0], true, &fnum, false);
|
||||
}
|
||||
if (curwin->w_p_diff && switchwin.sw_curwin->w_p_diff) {
|
||||
skip_update_topline = false;
|
||||
}
|
||||
skip_update_topline = false;
|
||||
restore_win_noblock(&switchwin, true);
|
||||
}
|
||||
} else {
|
||||
|
@ -326,4 +326,31 @@ describe('splitkeep', function()
|
||||
|
|
||||
]])
|
||||
end)
|
||||
|
||||
-- oldtest: Test_splitkeep_line()
|
||||
it("no scrolling with 'splitkeep' and line()", function()
|
||||
screen:try_resize(40, 6)
|
||||
exec([[
|
||||
set splitkeep=screen nosplitbelow
|
||||
autocmd WinResized * call line('w0', 1000)
|
||||
call setline(1, range(1000))
|
||||
]])
|
||||
screen:expect([[
|
||||
^0 |
|
||||
1 |
|
||||
2 |
|
||||
3 |
|
||||
4 |
|
||||
|
|
||||
]])
|
||||
feed(':wincmd s<CR>')
|
||||
screen:expect([[
|
||||
^0 |
|
||||
1 |
|
||||
{3:[No Name] [+] }|
|
||||
3 |
|
||||
{2:[No Name] [+] }|
|
||||
:wincmd s |
|
||||
]])
|
||||
end)
|
||||
end)
|
||||
|
@ -2075,6 +2075,24 @@ func Test_splitkeep_skipcol()
|
||||
call VerifyScreenDump(buf, 'Test_splitkeep_skipcol_1', {})
|
||||
endfunc
|
||||
|
||||
func Test_splitkeep_line()
|
||||
CheckScreendump
|
||||
|
||||
let lines =<< trim END
|
||||
set splitkeep=screen nosplitbelow
|
||||
autocmd WinResized * call line('w0', 1000)
|
||||
call setline(1, range(1000))
|
||||
END
|
||||
|
||||
call writefile(lines, 'XTestSplitkeepSkipcol', 'D')
|
||||
let buf = RunVimInTerminal('-S XTestSplitkeepSkipcol', #{rows: 6, cols: 40})
|
||||
|
||||
call VerifyScreenDump(buf, 'Test_splitkeep_line_1', {})
|
||||
|
||||
call term_sendkeys(buf, ":wincmd s\<CR>")
|
||||
call VerifyScreenDump(buf, 'Test_splitkeep_line_2', {})
|
||||
endfunc
|
||||
|
||||
func Test_new_help_window_on_error()
|
||||
help change.txt
|
||||
execute "normal! /CTRL-@\<CR>"
|
||||
|
Reference in New Issue
Block a user