forked from aniani/vim
patch 8.1.0174: after paging up and down fold line is wrong
Problem: After paging up and down fold line is wrong. Solution: Correct the computation of w_topline and w_botline. (Hirohito Higashi)
This commit is contained in:
27
src/move.c
27
src/move.c
@@ -2457,22 +2457,27 @@ onepage(int dir, long count)
|
|||||||
beginline(BL_SOL | BL_FIX);
|
beginline(BL_SOL | BL_FIX);
|
||||||
curwin->w_valid &= ~(VALID_WCOL|VALID_WROW|VALID_VIRTCOL);
|
curwin->w_valid &= ~(VALID_WCOL|VALID_WROW|VALID_VIRTCOL);
|
||||||
|
|
||||||
/*
|
if (retval == OK && dir == FORWARD)
|
||||||
* 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())
|
|
||||||
{
|
{
|
||||||
scroll_cursor_top(1, FALSE);
|
// Avoid the screen jumping up and down when 'scrolloff' is non-zero.
|
||||||
if (curwin->w_topline <= old_topline
|
// But make sure we scroll at least one line (happens with mix of long
|
||||||
&& old_topline < curbuf->b_ml.ml_line_count)
|
// 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
|
#ifdef FEAT_FOLDING
|
||||||
|
(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);
|
(void)hasFolding(curwin->w_topline, &curwin->w_topline, NULL);
|
||||||
#endif
|
#endif
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
redraw_later(VALID);
|
redraw_later(VALID);
|
||||||
|
@@ -1,5 +1,7 @@
|
|||||||
" Test for folding
|
" Test for folding
|
||||||
|
|
||||||
|
source view_util.vim
|
||||||
|
|
||||||
func PrepIndent(arg)
|
func PrepIndent(arg)
|
||||||
return [a:arg] + repeat(["\t".a:arg], 5)
|
return [a:arg] + repeat(["\t".a:arg], 5)
|
||||||
endfu
|
endfu
|
||||||
@@ -648,3 +650,27 @@ func Test_foldopen_exception()
|
|||||||
endtry
|
endtry
|
||||||
call assert_match('E492:', a)
|
call assert_match('E492:', a)
|
||||||
endfunc
|
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
|
||||||
|
@@ -789,6 +789,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 */
|
||||||
|
/**/
|
||||||
|
174,
|
||||||
/**/
|
/**/
|
||||||
173,
|
173,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user