mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
vim-patch:9.1.0822: topline might be changed in diff mode unexpectedly (#30988)
Problem: topline might be changed in diff mode unexpectedly
(Jaehwang Jung)
Solution: do not re-calculate topline, when using line() func
in diff mode.
fixes: vim/vim#15812
closes: vim/vim#15950
05a40e07c2
Co-authored-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
parent
ff93cccbc1
commit
05d9e6a9e8
@ -4351,9 +4351,17 @@ 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
|
||||||
|
// and keep the topline
|
||||||
|
if (curwin->w_p_diff && switchwin.sw_curwin->w_p_diff) {
|
||||||
|
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;
|
||||||
|
}
|
||||||
restore_win_noblock(&switchwin, true);
|
restore_win_noblock(&switchwin, true);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -2054,3 +2054,109 @@ it('diff mode overlapped diff blocks will be merged', function()
|
|||||||
|
|
|
|
||||||
]])
|
]])
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
-- oldtest: Test_diff_topline_noscroll()
|
||||||
|
it('diff mode does not scroll with line("w0")', function()
|
||||||
|
local screen = Screen.new(45, 20)
|
||||||
|
screen:attach()
|
||||||
|
exec([[
|
||||||
|
set scrolloff=5
|
||||||
|
call setline(1, range(1,60))
|
||||||
|
vnew
|
||||||
|
call setline(1, range(1,10) + range(50,60))
|
||||||
|
windo diffthis
|
||||||
|
norm! G
|
||||||
|
exe "norm! 30\<C-y>"
|
||||||
|
]])
|
||||||
|
screen:expect([[
|
||||||
|
{7: }9 │{7: }9 |
|
||||||
|
{7: }10 │{7: }10 |
|
||||||
|
{7: }{23:--------------------}│{7: }{22:11 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:12 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:13 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:14 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:15 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:16 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:17 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:18 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:19 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:20 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:^21 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:22 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:23 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:24 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:25 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:26 }|
|
||||||
|
{2:[No Name] [+] }{3:[No Name] [+] }|
|
||||||
|
|
|
||||||
|
]])
|
||||||
|
command([[echo line('w0', 1001)]])
|
||||||
|
screen:expect([[
|
||||||
|
{7: }9 │{7: }9 |
|
||||||
|
{7: }10 │{7: }10 |
|
||||||
|
{7: }{23:--------------------}│{7: }{22:11 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:12 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:13 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:14 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:15 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:16 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:17 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:18 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:19 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:20 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:^21 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:22 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:23 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:24 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:25 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:26 }|
|
||||||
|
{2:[No Name] [+] }{3:[No Name] [+] }|
|
||||||
|
9 |
|
||||||
|
]])
|
||||||
|
feed('<C-W>p')
|
||||||
|
screen:expect([[
|
||||||
|
{7: }{23:--------------------}│{7: }{22:39 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:40 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:41 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:42 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:43 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:44 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:45 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:46 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:47 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:48 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:49 }|
|
||||||
|
{7: }^50 │{7: }50 |
|
||||||
|
{7: }51 │{7: }51 |
|
||||||
|
{7: }52 │{7: }52 |
|
||||||
|
{7: }53 │{7: }53 |
|
||||||
|
{7: }54 │{7: }54 |
|
||||||
|
{7: }55 │{7: }55 |
|
||||||
|
{7:+ }{13:+-- 5 lines: 56····}│{7:+ }{13:+-- 5 lines: 56····}|
|
||||||
|
{3:[No Name] [+] }{2:[No Name] [+] }|
|
||||||
|
9 |
|
||||||
|
]])
|
||||||
|
feed('<C-W>p')
|
||||||
|
screen:expect([[
|
||||||
|
{7: }{23:--------------------}│{7: }{22:39 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:40 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:41 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:42 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:43 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:^44 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:45 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:46 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:47 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:48 }|
|
||||||
|
{7: }{23:--------------------}│{7: }{22:49 }|
|
||||||
|
{7: }50 │{7: }50 |
|
||||||
|
{7: }51 │{7: }51 |
|
||||||
|
{7: }52 │{7: }52 |
|
||||||
|
{7: }53 │{7: }53 |
|
||||||
|
{7: }54 │{7: }54 |
|
||||||
|
{7: }55 │{7: }55 |
|
||||||
|
{7:+ }{13:+-- 5 lines: 56····}│{7:+ }{13:+-- 5 lines: 56····}|
|
||||||
|
{2:[No Name] [+] }{3:[No Name] [+] }|
|
||||||
|
9 |
|
||||||
|
]])
|
||||||
|
end)
|
||||||
|
@ -2007,4 +2007,31 @@ func Test_diff_overlapped_diff_blocks_will_be_merged()
|
|||||||
call StopVimInTerminal(buf)
|
call StopVimInTerminal(buf)
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
" switching windows in diff mode caused an unneccessary scroll
|
||||||
|
func Test_diff_topline_noscroll()
|
||||||
|
CheckScreendump
|
||||||
|
|
||||||
|
let content =<< trim END
|
||||||
|
call setline(1, range(1,60))
|
||||||
|
vnew
|
||||||
|
call setline(1, range(1,10) + range(50,60))
|
||||||
|
windo diffthis
|
||||||
|
norm! G
|
||||||
|
exe "norm! 30\<C-y>"
|
||||||
|
END
|
||||||
|
call writefile(content, 'Xcontent', 'D')
|
||||||
|
let buf = RunVimInTerminal('-S Xcontent', {'rows': 20})
|
||||||
|
call VerifyScreenDump(buf, 'Test_diff_topline_1', {})
|
||||||
|
call term_sendkeys(buf, ":echo line('w0', 1001)\<cr>")
|
||||||
|
call term_wait(buf)
|
||||||
|
call VerifyScreenDump(buf, 'Test_diff_topline_2', {})
|
||||||
|
call term_sendkeys(buf, "\<C-W>p")
|
||||||
|
call term_wait(buf)
|
||||||
|
call VerifyScreenDump(buf, 'Test_diff_topline_3', {})
|
||||||
|
call term_sendkeys(buf, "\<C-W>p")
|
||||||
|
call term_wait(buf)
|
||||||
|
call VerifyScreenDump(buf, 'Test_diff_topline_4', {})
|
||||||
|
call StopVimInTerminal(buf)
|
||||||
|
endfunc
|
||||||
|
|
||||||
" vim: shiftwidth=2 sts=2 expandtab
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
Loading…
Reference in New Issue
Block a user