changeset 31329:5c83140aafc9 v9.0.0998

patch 9.0.0998: "gk" may reset skipcol when not needed Commit: https://github.com/vim/vim/commit/1b73edd9ee40aec400f3611f59823cec5fd1c489 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Dec 3 11:51:54 2022 +0000 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.
author Bram Moolenaar <Bram@vim.org>
date Sat, 03 Dec 2022 13:00:04 +0100
parents aeffee6a601a
children baea2b085d5e
files src/move.c src/testdir/test_scroll_opt.vim src/version.c
diffstat 3 files changed, 44 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/move.c
+++ b/src/move.c
@@ -2343,7 +2343,7 @@ scroll_cursor_top(int min_scroll, int al
     {
 	/*
 	 * 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;
@@ -2360,7 +2360,8 @@ scroll_cursor_top(int min_scroll, int al
 	check_topfill(curwin, FALSE);
 #endif
 	// 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();
 	if (curwin->w_topline != old_topline
 		|| curwin->w_skipcol != old_skipcol
--- a/src/testdir/test_scroll_opt.vim
+++ b/src/testdir/test_scroll_opt.vim
@@ -359,6 +359,12 @@ func Test_smoothscroll_long_line_showbre
   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
@@ -368,12 +374,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>"
 
@@ -450,9 +450,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
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    998,
+/**/
     997,
 /**/
     996,