]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.2.0883: scroll: 'smoothscroll' position is lost when using "|" v9.2.0883
authorHirohito Higashi <h.east.727@gmail.com>
Fri, 31 Jul 2026 18:28:25 +0000 (18:28 +0000)
committerChristian Brabandt <cb@256bit.org>
Fri, 31 Jul 2026 18:28:25 +0000 (18:28 +0000)
Problem:  With 'smoothscroll' the scroll position in a long line is lost when
          moving to a column with "|".
Solution: Adjust the skipped columns for the column the cursor ends up in,
          not for column zero.

related: #20885
closes:  #20890

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Hirohito Higashi <h.east.727@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
17 files changed:
src/normal.c
src/testdir/dumps/Test_smooth_long_scrolloff_1.dump
src/testdir/dumps/Test_smooth_long_scrolloff_2.dump
src/testdir/dumps/Test_smooth_long_scrolloff_3.dump
src/testdir/dumps/Test_smooth_long_scrolloff_4.dump
src/testdir/dumps/Test_smooth_long_scrolloff_5.dump
src/testdir/dumps/Test_smooth_long_scrolloff_6.dump
src/testdir/dumps/Test_smooth_long_scrolloff_7.dump
src/testdir/dumps/Test_smooth_long_scrolloff_ru_1.dump
src/testdir/dumps/Test_smooth_long_scrolloff_ru_2.dump
src/testdir/dumps/Test_smooth_long_scrolloff_ru_3.dump
src/testdir/dumps/Test_smooth_long_scrolloff_ru_4.dump
src/testdir/dumps/Test_smooth_long_scrolloff_ru_5.dump
src/testdir/dumps/Test_smooth_long_scrolloff_ru_6.dump
src/testdir/dumps/Test_smooth_long_scrolloff_ru_7.dump
src/testdir/test_scroll_opt.vim
src/version.c

index a7959d62f1e555e82e46327a2a9ccebe82e1d948..642d9e465f7b048f65b23f3c537b3b5af3552df8 100644 (file)
@@ -6604,7 +6604,10 @@ nv_pipe(cmdarg_T *cap)
 {
     cap->oap->motion_type = MCHAR;
     cap->oap->inclusive = FALSE;
-    beginline(0);
+    // Not using beginline(), the columns to skip for 'smoothscroll' must be
+    // adjusted for the column we end up in, not for column zero.
+    curwin->w_cursor.col = 0;
+    curwin->w_cursor.coladd = 0;
     if (cap->count0 > 0)
     {
        coladvance((colnr_T)(cap->count0 - 1));
@@ -6615,6 +6618,7 @@ nv_pipe(cmdarg_T *cap)
     // keep curswant at the column where we wanted to go, not where
     // we ended; differs if line is too short
     curwin->w_set_curswant = false;
+    adjust_skipcol();
 }
 
 /*
index f6ca843e78b6770fd66076d6d58f05967382f4e9..0175a354d6e04dfe0f350fa253484a4f677c50ac 100644 (file)
@@ -5,4 +5,4 @@
 |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g
 | |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o
 | |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n
-| @39
+|:|n|o|r|m| |j|7|2|1||| @28
index 9162df0c22cd70e1ec218a1085f8d104f9a44065..e52116654fc3e28cb3e6be649266817beb47b260 100644 (file)
@@ -5,4 +5,4 @@
 >l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g
 | |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o
 | |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n
-| @39
+|:|n|o|r|m| |j|7|2|1||| @28
index 1a1fcaeae0823fa4ffcc3d141f16885ab75f6e22..558ef73e452bcc3e9584d218840901d3720a96f7 100644 (file)
@@ -5,4 +5,4 @@
 > |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o
 | |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n
 |g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| @20
-@40
+|:|n|o|r|m| |j|7|2|1||| @28
index 4ed62b65bf4304256c8dc178b0b23ae1d091ab4a..70b2097277fcefdd38c4024421087b4d424c6267 100644 (file)
@@ -5,4 +5,4 @@
 | |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o
 > |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n
 |g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| @20
-@40
+|:|n|o|r|m| |j|7|2|1||| @28
index 6d7e1578d12f16f3c8bc6eb089620ad3fd3c42d0..6aeef32e0d67010003f68dd6755a49d54f3086aa 100644 (file)
@@ -5,4 +5,4 @@
 | |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o
 | |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n
 >g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| @20
-@40
+|:|n|o|r|m| |j|7|2|1||| @28
index 4f5dcea8b94198e331a17b1bd9cf3fc789922f74..bad57cfe40623540594d22891440dbc7bb08bb85 100644 (file)
@@ -5,4 +5,4 @@
 |g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| @20
 >t|h|r|e@1| @34
 |f|o|u|r| @35
-@40
+|:|n|o|r|m| |j|7|2|1||| @28
index 6d7e1578d12f16f3c8bc6eb089620ad3fd3c42d0..6aeef32e0d67010003f68dd6755a49d54f3086aa 100644 (file)
@@ -5,4 +5,4 @@
 | |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o
 | |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n
 >g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| @20
-@40
+|:|n|o|r|m| |j|7|2|1||| @28
index b78abfa72733b434955ce11c77b7747ee71ef189..3baa0eea64af86a99fe68d6cf2410f6ee0dc6c6f 100644 (file)
@@ -5,4 +5,4 @@
 |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g
 | |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o
 | |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n
-| @21|2|,|7|2|1| @8|2|0|%| 
+|:|n|o|r|m| |j|7|2|1||| @10|2|,|7|2|1| @8|2|0|%| 
index 906327d273b151f39b6a4c5c5a9b3b038803fd35..ac4b1b8f1807f54d051ae19f185597b6317f43a3 100644 (file)
@@ -5,4 +5,4 @@
 >l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g
 | |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o
 | |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n
-| @21|2|,|7|6|1| @8|2|0|%| 
+|:|n|o|r|m| |j|7|2|1||| @10|2|,|7|6|1| @8|2|0|%| 
index 021431d4779b1818ff5d5b19cb0c516660be2f6a..7f7184114700ae823c344924f58839c667055089 100644 (file)
@@ -5,4 +5,4 @@
 > |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o
 | |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n
 |g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| @20
-@22|2|,|8|0|1| @8|2|0|%| 
+|:|n|o|r|m| |j|7|2|1||| @10|2|,|8|0|1| @8|2|0|%| 
index 4e2f6b3938d6bae0741c11ddbca9f489e8e897a9..4e1cad8cf858c3074225be89fbdc1c435fc099ee 100644 (file)
@@ -5,4 +5,4 @@
 | |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o
 > |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n
 |g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| @20
-@22|2|,|8|4|1| @8|2|0|%| 
+|:|n|o|r|m| |j|7|2|1||| @10|2|,|8|4|1| @8|2|0|%| 
index 6e285023aba422dff26db97106856d96b6b75424..6ed2fd0ff4cb91930e2a1031aed57d9181be8fc6 100644 (file)
@@ -5,4 +5,4 @@
 | |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o
 | |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n
 >g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| @20
-@22|2|,|8@1|1| @8|2|0|%| 
+|:|n|o|r|m| |j|7|2|1||| @10|2|,|8@1|1| @8|2|0|%| 
index 456bff2cadde7f58c7149d3df2127066c5a5b496..6a8fe5476cd1f9199415044d73bf83a1980b6c38 100644 (file)
@@ -5,4 +5,4 @@
 |g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| @20
 >t|h|r|e@1| @34
 |f|o|u|r| @35
-@22|3|,|1| @10|3@1|%| 
+|:|n|o|r|m| |j|7|2|1||| @10|3|,|1| @10|3@1|%| 
index 6e285023aba422dff26db97106856d96b6b75424..6ed2fd0ff4cb91930e2a1031aed57d9181be8fc6 100644 (file)
@@ -5,4 +5,4 @@
 | |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o
 | |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n
 >g| |t|w|o| |l|o|n|g| |t|w|o| |l|o|n|g| @20
-@22|2|,|8@1|1| @8|2|0|%| 
+|:|n|o|r|m| |j|7|2|1||| @10|2|,|8@1|1| @8|2|0|%| 
index cf362b6a29a67ee8646c7901a1d1dc96f64462b6..992d76388c878074adfd35bd715919f1ef108b4c 100644 (file)
@@ -1330,6 +1330,25 @@ func Test_smoothscroll_keep_skipcol()
   bwipe!
 endfunc
 
+func Test_smoothscroll_cursor_back_in_line()
+  call NewWindow(10, 40)
+  setlocal smoothscroll
+  call setline(1, ['abcde '->repeat(150)]->repeat(2))
+
+  exe "norm! 10\<C-E>"
+  redraw
+  call assert_equal(400, winsaveview().skipcol)
+
+  " Moving to an earlier column in the same line scrolls back only as far as
+  " needed, not all the way to the start of the line.
+  norm! 240|
+  redraw
+  call assert_equal(200, winsaveview().skipcol)
+  call assert_equal(1, winline())
+
+  bwipe!
+endfunc
+
 func Test_smoothscroll_long_line_zb()
   call NewWindow(10, 40)
   call setline(1, 'abcde '->repeat(150))
index e7c89e81862dccb95655a119bd940a670a343859..56fbf8a76dadf8ef114458c88f917b813fa51738 100644 (file)
@@ -758,6 +758,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    883,
 /**/
     882,
 /**/