From 3c49e74e18993915a779cafe4af3749b39fd3e2a Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sun, 4 Apr 2021 21:26:04 +0200 Subject: [PATCH] patch 8.2.2711: "gj" in a closed fold does not move out of the fold Problem: "gj" in a closed fold does not move out of the fold. (Marco Hinz) Solution: Add a check for being in a closed fold. (closes #8062) --- src/normal.c | 12 ++++++++++-- src/testdir/test_fold.vim | 27 ++++++++++++++++----------- src/version.c | 2 ++ 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/normal.c b/src/normal.c index 4299a90df..a15ae3589 100644 --- a/src/normal.c +++ b/src/normal.c @@ -2564,7 +2564,11 @@ nv_screengo(oparg_T *oap, int dir, long dist) { if (dir == BACKWARD) { - if ((long)curwin->w_curswant >= width1) + if ((long)curwin->w_curswant >= width1 +#ifdef FEAT_FOLDING + && !hasFolding(curwin->w_cursor.lnum, NULL, NULL) +#endif + ) // Move back within the line. This can give a negative value // for w_curswant if width1 < width2 (with cpoptions+=n), // which will get clipped to column 0. @@ -2598,7 +2602,11 @@ nv_screengo(oparg_T *oap, int dir, long dist) n = ((linelen - width1 - 1) / width2 + 1) * width2 + width1; else n = width1; - if (curwin->w_curswant + width2 < (colnr_T)n) + if (curwin->w_curswant + width2 < (colnr_T)n +#ifdef FEAT_FOLDING + && !hasFolding(curwin->w_cursor.lnum, NULL, NULL) +#endif + ) // move forward within line curwin->w_curswant += width2; else diff --git a/src/testdir/test_fold.vim b/src/testdir/test_fold.vim index 20171f034..e5dc1ecec 100644 --- a/src/testdir/test_fold.vim +++ b/src/testdir/test_fold.vim @@ -890,28 +890,33 @@ func Test_fold_relative_move() new set fdm=indent sw=2 wrap tw=80 - let content = [ ' foo', ' bar', ' baz', - \ repeat('x', &columns + 1), - \ ' foo', ' bar', ' baz' + let longtext = repeat('x', &columns + 1) + let content = [ ' foo', ' ' .. longtext, ' baz', + \ longtext, + \ ' foo', ' ' .. longtext, ' baz' \ ] call append(0, content) normal zM - call cursor(3, 1) - call assert_true(foldclosed(line('.'))) - normal gj - call assert_equal(2, winline()) + for lnum in range(1, 3) + call cursor(lnum, 1) + call assert_true(foldclosed(line('.'))) + normal gj + call assert_equal(2, winline()) + endfor call cursor(2, 1) call assert_true(foldclosed(line('.'))) normal 2gj call assert_equal(3, winline()) - call cursor(5, 1) - call assert_true(foldclosed(line('.'))) - normal gk - call assert_equal(3, winline()) + for lnum in range(5, 7) + call cursor(lnum, 1) + call assert_true(foldclosed(line('.'))) + normal gk + call assert_equal(3, winline()) + endfor call cursor(6, 1) call assert_true(foldclosed(line('.'))) diff --git a/src/version.c b/src/version.c index db31f8874..c9632c361 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 2711, /**/ 2710, /**/ -- 2.40.0