changeset 16690:4e3c4e8e465c v8.1.1347

patch 8.1.1347: fractional scroll position not restored after closing window commit https://github.com/vim/vim/commit/bd2d68c2f42c7689f681aeaf82606d17f8a0312f Author: Bram Moolenaar <Bram@vim.org> Date: Sat May 18 15:36:11 2019 +0200 patch 8.1.1347: fractional scroll position not restored after closing window Problem: Fractional scroll position not restored after closing window. Solution: Do restore fraction if topline is not one.
author Bram Moolenaar <Bram@vim.org>
date Sat, 18 May 2019 15:45:05 +0200
parents 7f784d132212
children 21feeb36354f
files src/testdir/test_window_cmd.vim src/version.c src/window.c
diffstat 3 files changed, 20 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_window_cmd.vim
+++ b/src/testdir/test_window_cmd.vim
@@ -745,16 +745,8 @@ endfunc
 
 func Test_split_noscroll()
   let so_save = &so
-  new
-  only
-
-  " Make sure windows can hold all content after split.
-  for i in range(1, 20)
-    wincmd +
-    redraw!
-  endfor
-
-  call setline (1, range(1, 8))
+  enew
+  call setline(1, range(1, 8))
   normal 100%
   split
 
@@ -769,12 +761,20 @@ func Test_split_noscroll()
   call assert_equal(1, info1.topline)
   call assert_equal(1, info2.topline)
 
-  " Restore original state.
-  for i in range(1, 20)
-    wincmd -
-    redraw!
-  endfor
+  " window that fits all lines by itself, but not when split: closing other
+  " window should restore fraction.
   only!
+  call setline(1, range(1, &lines - 10))
+  exe &lines / 4
+  let winid1 = win_getid()
+  let info1 = getwininfo(winid1)[0]
+  call assert_equal(1, info1.topline)
+  new
+  redraw
+  close
+  let info1 = getwininfo(winid1)[0]
+  call assert_equal(1, info1.topline)
+
   bwipe!
   let &so = so_save
 endfunc
--- a/src/version.c
+++ b/src/version.c
@@ -768,6 +768,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1347,
+/**/
     1346,
 /**/
     1345,
--- a/src/window.c
+++ b/src/window.c
@@ -5830,10 +5830,11 @@ scroll_to_fraction(win_T *wp, int prev_h
     // Don't change w_topline in any of these cases:
     // - window height is 0
     // - 'scrollbind' is set and this isn't the current window
-    // - window height is sufficient to display the whole buffer
+    // - window height is sufficient to display the whole buffer and first line
+    //   is visible.
     if (height > 0
         && (!wp->w_p_scb || wp == curwin)
-        && (height < wp->w_buffer->b_ml.ml_line_count))
+        && (height < wp->w_buffer->b_ml.ml_line_count || wp->w_topline > 1))
     {
 	/*
 	 * Find a value for w_topline that shows the cursor at the same