mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
vim-patch:9.0.1561: display wrong when moving cursor to above the top line (#23644)
Problem: Display wrong when moving cursor to above the top line and
'smoothscroll' is set.
Solution: Call adjust_skipcol() in more places and make it work better.
(Luuk van Baal, closes vim/vim#12395)
798fa76dbf
This commit is contained in:
parent
bd247d835f
commit
5887ecab6d
@ -1502,11 +1502,11 @@ void adjust_skipcol(void)
|
|||||||
} else {
|
} else {
|
||||||
curwin->w_skipcol -= width1;
|
curwin->w_skipcol -= width1;
|
||||||
}
|
}
|
||||||
redraw_later(curwin, UPD_NOT_VALID);
|
|
||||||
scrolled = true;
|
scrolled = true;
|
||||||
validate_virtcol();
|
|
||||||
}
|
}
|
||||||
if (scrolled) {
|
if (scrolled) {
|
||||||
|
validate_virtcol();
|
||||||
|
redraw_later(curwin, UPD_NOT_VALID);
|
||||||
return; // don't scroll in the other direction now
|
return; // don't scroll in the other direction now
|
||||||
}
|
}
|
||||||
long col = curwin->w_virtcol - curwin->w_skipcol + scrolloff_cols;
|
long col = curwin->w_virtcol - curwin->w_skipcol + scrolloff_cols;
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include "nvim/mbyte.h"
|
#include "nvim/mbyte.h"
|
||||||
#include "nvim/memline.h"
|
#include "nvim/memline.h"
|
||||||
#include "nvim/memory.h"
|
#include "nvim/memory.h"
|
||||||
|
#include "nvim/move.h"
|
||||||
#include "nvim/normal.h"
|
#include "nvim/normal.h"
|
||||||
#include "nvim/option_defs.h"
|
#include "nvim/option_defs.h"
|
||||||
#include "nvim/pos.h"
|
#include "nvim/pos.h"
|
||||||
@ -414,6 +415,7 @@ int bck_word(long count, bool bigword, bool stop)
|
|||||||
finished:
|
finished:
|
||||||
stop = false;
|
stop = false;
|
||||||
}
|
}
|
||||||
|
adjust_skipcol();
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -518,6 +520,7 @@ int bckend_word(long count, bool bigword, bool eol)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
adjust_skipcol();
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -286,17 +286,56 @@ describe('display', function()
|
|||||||
local screen = Screen.new(75, 8)
|
local screen = Screen.new(75, 8)
|
||||||
screen:attach()
|
screen:attach()
|
||||||
exec([[
|
exec([[
|
||||||
call setline(1, ['a', 'bbbbb '->repeat(100), 'c'])
|
call setline(1, ['a', 'b ' .. 'bbbbb'->repeat(150), 'c'])
|
||||||
norm $j
|
norm $j
|
||||||
]])
|
]])
|
||||||
screen:expect([[
|
screen:expect([[
|
||||||
<<<bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb |
|
<<<bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
|
||||||
bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbb|
|
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
|
||||||
bb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb |
|
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
|
||||||
bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbb|
|
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
|
||||||
bb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb |
|
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
|
||||||
bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbb|
|
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
|
||||||
bb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb^ |
|
b^b |
|
||||||
|
|
|
||||||
|
]])
|
||||||
|
-- FIXME: moving the cursor above the topline does not set w_skipcol
|
||||||
|
-- correctly with cpo+=n and zero scrolloff (curs_columns() extra == 1).
|
||||||
|
exec('set number cpo+=n scrolloff=0')
|
||||||
|
feed('$0')
|
||||||
|
screen:expect([[
|
||||||
|
<<<b^bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
|
||||||
|
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
|
||||||
|
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
|
||||||
|
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
|
||||||
|
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
|
||||||
|
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
|
||||||
|
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
|
||||||
|
|
|
||||||
|
]])
|
||||||
|
-- Going to the start of the line with "b" did not set w_skipcol correctly with 'smoothscroll'.
|
||||||
|
exec('set smoothscroll')
|
||||||
|
feed('$b')
|
||||||
|
screen:expect([[
|
||||||
|
2 b ^bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
|
||||||
|
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
|
||||||
|
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
|
||||||
|
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
|
||||||
|
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
|
||||||
|
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
|
||||||
|
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
|
||||||
|
|
|
||||||
|
]])
|
||||||
|
-- Same for "ge".
|
||||||
|
feed('$ge')
|
||||||
|
screen:expect([[
|
||||||
|
2 ^b bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
|
||||||
|
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
|
||||||
|
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
|
||||||
|
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
|
||||||
|
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
|
||||||
|
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
|
||||||
|
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
|
||||||
|
|
|
|
||||||
]])
|
]])
|
||||||
end)
|
end)
|
||||||
|
@ -518,14 +518,29 @@ func Test_display_cursor_long_line()
|
|||||||
CheckScreendump
|
CheckScreendump
|
||||||
|
|
||||||
let lines =<< trim END
|
let lines =<< trim END
|
||||||
call setline(1, ['a', 'bbbbb '->repeat(100), 'c'])
|
call setline(1, ['a', 'b ' .. 'bbbbb'->repeat(150), 'c'])
|
||||||
norm $j
|
norm $j
|
||||||
END
|
END
|
||||||
|
|
||||||
call writefile(lines, 'XdispCursorLongline', 'D')
|
call writefile(lines, 'XdispCursorLongline', 'D')
|
||||||
let buf = RunVimInTerminal('-S XdispCursorLongline', #{rows: 8})
|
let buf = RunVimInTerminal('-S XdispCursorLongline', #{rows: 8})
|
||||||
|
|
||||||
call VerifyScreenDump(buf, 'Test_display_cursor_long_line', {})
|
call VerifyScreenDump(buf, 'Test_display_cursor_long_line_1', {})
|
||||||
|
|
||||||
|
" FIXME: moving the cursor above the topline does not set w_skipcol
|
||||||
|
" correctly with cpo+=n and zero scrolloff (curs_columns() extra == 1).
|
||||||
|
call term_sendkeys(buf, ":set number cpo+=n scrolloff=0\<CR>")
|
||||||
|
call term_sendkeys(buf, '$0')
|
||||||
|
call VerifyScreenDump(buf, 'Test_display_cursor_long_line_2', {})
|
||||||
|
|
||||||
|
" Going to the start of the line with "b" did not set w_skipcol correctly
|
||||||
|
" with 'smoothscroll'.
|
||||||
|
call term_sendkeys(buf, ":set smoothscroll\<CR>")
|
||||||
|
call term_sendkeys(buf, '$b')
|
||||||
|
call VerifyScreenDump(buf, 'Test_display_cursor_long_line_3', {})
|
||||||
|
" Same for "ge".
|
||||||
|
call term_sendkeys(buf, '$ge')
|
||||||
|
call VerifyScreenDump(buf, 'Test_display_cursor_long_line_4', {})
|
||||||
|
|
||||||
call StopVimInTerminal(buf)
|
call StopVimInTerminal(buf)
|
||||||
endfunc
|
endfunc
|
||||||
|
@ -502,7 +502,7 @@ func Test_smoothscroll_cursor_position()
|
|||||||
" regardless of number and cpo-=n.
|
" regardless of number and cpo-=n.
|
||||||
setl number list listchars=precedes:< cpo-=n
|
setl number list listchars=precedes:< cpo-=n
|
||||||
call s:check_col_calc(5, 1, 1)
|
call s:check_col_calc(5, 1, 1)
|
||||||
exe "normal 2|\<C-E>"
|
exe "normal 3|\<C-E>h"
|
||||||
call s:check_col_calc(6, 1, 18)
|
call s:check_col_calc(6, 1, 18)
|
||||||
norm h
|
norm h
|
||||||
call s:check_col_calc(5, 2, 17)
|
call s:check_col_calc(5, 2, 17)
|
||||||
|
Loading…
Reference in New Issue
Block a user