0
0
mirror of https://github.com/vim/vim.git synced 2025-09-28 04:24:06 -04:00

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.
This commit is contained in:
Bram Moolenaar
2022-12-03 11:51:54 +00:00
parent 8ffb7e051d
commit 1b73edd9ee
3 changed files with 44 additions and 9 deletions

View File

@@ -2343,7 +2343,7 @@ scroll_cursor_top(int min_scroll, int always)
{ {
/* /*
* If "always" is FALSE, only adjust topline to a lower value, higher * 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) if (new_topline < curwin->w_topline || always)
curwin->w_topline = new_topline; curwin->w_topline = new_topline;
@@ -2360,7 +2360,8 @@ scroll_cursor_top(int min_scroll, int always)
check_topfill(curwin, FALSE); check_topfill(curwin, FALSE);
#endif #endif
// TODO: if the line doesn't fit may optimize w_skipcol // TODO: 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(); reset_skipcol();
if (curwin->w_topline != old_topline if (curwin->w_topline != old_topline
|| curwin->w_skipcol != old_skipcol || curwin->w_skipcol != old_skipcol

View File

@@ -359,6 +359,12 @@ func Test_smoothscroll_long_line_showbreak()
call StopVimInTerminal(buf) call StopVimInTerminal(buf)
endfunc 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 " 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 " reposition it. Also check that we don't miscalculate the values by checking
" the consistency between wincol() and col('.') as they are calculated " the consistency between wincol() and col('.') as they are calculated
@@ -368,12 +374,6 @@ func Test_smoothscroll_cursor_position()
setl smoothscroll wrap setl smoothscroll wrap
call setline(1, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") 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) call s:check_col_calc(1, 1, 1)
exe "normal \<C-E>" exe "normal \<C-E>"
@@ -450,9 +450,41 @@ func Test_smoothscroll_cursor_position()
call s:check_col_calc(1, 3, 37) call s:check_col_calc(1, 3, 37)
normal gg normal gg
bwipeout! bwipe!
endfunc 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 " Test that mouse picking is still accurate when we have smooth scrolled lines
func Test_smoothscroll_mouse_pos() func Test_smoothscroll_mouse_pos()
CheckNotGui CheckNotGui

View File

@@ -695,6 +695,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
998,
/**/ /**/
997, 997,
/**/ /**/