mirror of
https://github.com/neovim/neovim
synced 2025-07-29 09:51:52 +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) {
|
if (wp != NULL && tp != NULL) {
|
||||||
switchwin_T switchwin;
|
switchwin_T switchwin;
|
||||||
if (switch_win_noblock(&switchwin, wp, tp, true) == OK) {
|
if (switch_win_noblock(&switchwin, wp, tp, true) == OK) {
|
||||||
// in diff mode, prevent that the window scrolls
|
// With 'splitkeep' != cursor and in diff mode, prevent that the
|
||||||
// and keep the topline
|
// window scrolls and keep the topline.
|
||||||
if (curwin->w_p_diff && switchwin.sw_curwin->w_p_diff) {
|
if (*p_spk != 'c' || (curwin->w_p_diff && switchwin.sw_curwin->w_p_diff)) {
|
||||||
skip_update_topline = true;
|
skip_update_topline = true;
|
||||||
}
|
}
|
||||||
check_cursor(curwin);
|
check_cursor(curwin);
|
||||||
fp = var2fpos(&argvars[0], true, &fnum, false);
|
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);
|
restore_win_noblock(&switchwin, true);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -326,4 +326,31 @@ describe('splitkeep', function()
|
|||||||
|
|
|
|
||||||
]])
|
]])
|
||||||
end)
|
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)
|
end)
|
||||||
|
@ -2075,6 +2075,24 @@ func Test_splitkeep_skipcol()
|
|||||||
call VerifyScreenDump(buf, 'Test_splitkeep_skipcol_1', {})
|
call VerifyScreenDump(buf, 'Test_splitkeep_skipcol_1', {})
|
||||||
endfunc
|
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()
|
func Test_new_help_window_on_error()
|
||||||
help change.txt
|
help change.txt
|
||||||
execute "normal! /CTRL-@\<CR>"
|
execute "normal! /CTRL-@\<CR>"
|
||||||
|
Reference in New Issue
Block a user