# HG changeset patch # User Bram Moolenaar # Date 1617564603 -7200 # Node ID 0e1b8b98f9f4c04d8cd8ac07c8e7a4091a1d671d # Parent b835b68b64a40e2ba65111794a18e602a10982ac patch 8.2.2711: "gj" in a closed fold does not move out of the fold Commit: https://github.com/vim/vim/commit/3c49e74e18993915a779cafe4af3749b39fd3e2a Author: Bram Moolenaar Date: Sun Apr 4 21:26:04 2021 +0200 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 https://github.com/vim/vim/issues/8062) diff --git a/src/normal.c b/src/normal.c --- a/src/normal.c +++ b/src/normal.c @@ -2564,7 +2564,11 @@ nv_screengo(oparg_T *oap, int dir, long { 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 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 --- 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 --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2711, +/**/ 2710, /**/ 2709,