summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2018-07-10 15:07:15 +0200
committerBram Moolenaar <Bram@vim.org>2018-07-10 15:07:15 +0200
commit907dad72ef9d29422352fb74ba156e7085a3fc71 (patch)
tree87f564906e64ad84b4c09a941f3fd873784570a9
parent6259e5769dd50d8a3b5b99f553bab34ff5c8a6ce (diff)
downloadvim-git-907dad72ef9d29422352fb74ba156e7085a3fc71.tar.gz
patch 8.1.0174: after paging up and down fold line is wrongv8.1.0174
Problem: After paging up and down fold line is wrong. Solution: Correct the computation of w_topline and w_botline. (Hirohito Higashi)
-rw-r--r--src/move.c27
-rw-r--r--src/testdir/test_fold.vim26
-rw-r--r--src/version.c2
3 files changed, 44 insertions, 11 deletions
diff --git a/src/move.c b/src/move.c
index a56003013..b2b84868a 100644
--- a/src/move.c
+++ b/src/move.c
@@ -2457,22 +2457,27 @@ onepage(int dir, long count)
beginline(BL_SOL | BL_FIX);
curwin->w_valid &= ~(VALID_WCOL|VALID_WROW|VALID_VIRTCOL);
- /*
- * Avoid the screen jumping up and down when 'scrolloff' is non-zero.
- * But make sure we scroll at least one line (happens with mix of long
- * wrapping lines and non-wrapping line).
- */
- if (retval == OK && dir == FORWARD && check_top_offset())
+ if (retval == OK && dir == FORWARD)
{
- scroll_cursor_top(1, FALSE);
- if (curwin->w_topline <= old_topline
- && old_topline < curbuf->b_ml.ml_line_count)
+ // Avoid the screen jumping up and down when 'scrolloff' is non-zero.
+ // But make sure we scroll at least one line (happens with mix of long
+ // wrapping lines and non-wrapping line).
+ if (check_top_offset())
{
- curwin->w_topline = old_topline + 1;
+ scroll_cursor_top(1, FALSE);
+ if (curwin->w_topline <= old_topline
+ && old_topline < curbuf->b_ml.ml_line_count)
+ {
+ curwin->w_topline = old_topline + 1;
#ifdef FEAT_FOLDING
- (void)hasFolding(curwin->w_topline, &curwin->w_topline, NULL);
+ (void)hasFolding(curwin->w_topline, &curwin->w_topline, NULL);
#endif
+ }
}
+#ifdef FEAT_FOLDING
+ else if (curwin->w_botline > curbuf->b_ml.ml_line_count)
+ (void)hasFolding(curwin->w_topline, &curwin->w_topline, NULL);
+#endif
}
redraw_later(VALID);
diff --git a/src/testdir/test_fold.vim b/src/testdir/test_fold.vim
index de6688365..df4b12c8c 100644
--- a/src/testdir/test_fold.vim
+++ b/src/testdir/test_fold.vim
@@ -1,5 +1,7 @@
" Test for folding
+source view_util.vim
+
func PrepIndent(arg)
return [a:arg] + repeat(["\t".a:arg], 5)
endfu
@@ -648,3 +650,27 @@ func Test_foldopen_exception()
endtry
call assert_match('E492:', a)
endfunc
+
+func Test_fold_last_line_with_pagedown()
+ enew!
+ set fdm=manual
+
+ let expect = '+-- 11 lines: 9---'
+ let content = range(1,19)
+ call append(0, content)
+ normal dd9G
+ normal zfG
+ normal zt
+ call assert_equal('9', getline(foldclosed('.')))
+ call assert_equal('19', getline(foldclosedend('.')))
+ call assert_equal(expect, ScreenLines(1, len(expect))[0])
+ call feedkeys("\<C-F>", 'xt')
+ call assert_equal(expect, ScreenLines(1, len(expect))[0])
+ call feedkeys("\<C-F>", 'xt')
+ call assert_equal(expect, ScreenLines(1, len(expect))[0])
+ call feedkeys("\<C-B>\<C-F>\<C-F>", 'xt')
+ call assert_equal(expect, ScreenLines(1, len(expect))[0])
+
+ set fdm&
+ enew!
+endfunc
diff --git a/src/version.c b/src/version.c
index de6f550dd..6b422e670 100644
--- a/src/version.c
+++ b/src/version.c
@@ -790,6 +790,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 174,
+/**/
173,
/**/
172,