mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
vim-patch:9.0.0998: "gk" may reset skipcol when not needed
Problem: "gk" may reset skipcol when not needed.
Solution: Only reset skipcol if the cursor column is less.
1b73edd9ee
Co-authored-by: Bram Moolenaar <Bram@vim.org>
This commit is contained in:
parent
5ba11087b6
commit
c25fd85c2e
@ -1776,7 +1776,7 @@ void scroll_cursor_top(int min_scroll, int always)
|
||||
scroll_cursor_halfway(false, false);
|
||||
} else {
|
||||
// If "always" is false, only adjust topline to a lower value, higher
|
||||
// value may happen with wrapping lines
|
||||
// value may happen with wrapping lines.
|
||||
if (new_topline < curwin->w_topline || always) {
|
||||
curwin->w_topline = new_topline;
|
||||
}
|
||||
@ -1792,7 +1792,8 @@ void scroll_cursor_top(int min_scroll, int always)
|
||||
}
|
||||
check_topfill(curwin, false);
|
||||
// TODO(vim): if the line doesn't fit may optimize w_skipcol
|
||||
if (curwin->w_topline == curwin->w_cursor.lnum) {
|
||||
if (curwin->w_topline == curwin->w_cursor.lnum
|
||||
&& curwin->w_skipcol >= curwin->w_cursor.col) {
|
||||
reset_skipcol(curwin);
|
||||
}
|
||||
if (curwin->w_topline != old_topline
|
||||
|
@ -376,6 +376,12 @@ func Test_smoothscroll_long_line_showbreak()
|
||||
call StopVimInTerminal(buf)
|
||||
endfunc
|
||||
|
||||
func s:check_col_calc(win_col, win_line, buf_col)
|
||||
call assert_equal(a:win_col, wincol())
|
||||
call assert_equal(a:win_line, winline())
|
||||
call assert_equal(a:buf_col, col('.'))
|
||||
endfunc
|
||||
|
||||
" Test that if the current cursor is on a smooth scrolled line, we correctly
|
||||
" reposition it. Also check that we don't miscalculate the values by checking
|
||||
" the consistency between wincol() and col('.') as they are calculated
|
||||
@ -385,12 +391,6 @@ func Test_smoothscroll_cursor_position()
|
||||
setl smoothscroll wrap
|
||||
call setline(1, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
|
||||
|
||||
func s:check_col_calc(win_col, win_line, buf_col)
|
||||
call assert_equal(a:win_col, wincol())
|
||||
call assert_equal(a:win_line, winline())
|
||||
call assert_equal(a:buf_col, col('.'))
|
||||
endfunc
|
||||
|
||||
call s:check_col_calc(1, 1, 1)
|
||||
exe "normal \<C-E>"
|
||||
|
||||
@ -467,9 +467,41 @@ func Test_smoothscroll_cursor_position()
|
||||
call s:check_col_calc(1, 3, 37)
|
||||
normal gg
|
||||
|
||||
bwipeout!
|
||||
bwipe!
|
||||
endfunc
|
||||
|
||||
func Test_smoothscroll_cursor_scrolloff()
|
||||
call NewWindow(10, 20)
|
||||
setl smoothscroll wrap
|
||||
setl scrolloff=3
|
||||
|
||||
" 120 chars are 6 screen lines
|
||||
call setline(1, "abcdefghijklmnopqrstABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrstABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrstABCDEFGHIJKLMNOPQRST")
|
||||
call setline(2, "below")
|
||||
|
||||
call s:check_col_calc(1, 1, 1)
|
||||
|
||||
" CTRL-E shows "<<<DEFG...", cursor move four lines down
|
||||
exe "normal \<C-E>"
|
||||
call s:check_col_calc(1, 4, 81)
|
||||
|
||||
" cursor on start of second line, "gk" moves into first line, skipcol doesn't
|
||||
" change
|
||||
exe "normal G0gk"
|
||||
call s:check_col_calc(1, 5, 101)
|
||||
|
||||
" move cursor left one window width worth, scrolls one screen line
|
||||
exe "normal 20h"
|
||||
call s:check_col_calc(1, 5, 81)
|
||||
|
||||
" move cursor left one window width worth, scrolls one screen line
|
||||
exe "normal 20h"
|
||||
call s:check_col_calc(1, 4, 61)
|
||||
|
||||
bwipe!
|
||||
endfunc
|
||||
|
||||
|
||||
" Test that mouse picking is still accurate when we have smooth scrolled lines
|
||||
func Test_smoothscroll_mouse_pos()
|
||||
CheckNotGui
|
||||
|
Loading…
Reference in New Issue
Block a user