# HG changeset patch # User Bram Moolenaar # Date 1611245704 -3600 # Node ID 09ad3f1b9714748feeb3a3addfc97c485b87b08d # Parent bc2b820a579bde2d131317d6e64578ad1dbc9951 patch 8.2.2385: "gj" and "gk" do not work correctly when inside a fold Commit: https://github.com/vim/vim/commit/e71996bd0865659bde5450f466bc3e53e83431b2 Author: Bram Moolenaar Date: Thu Jan 21 17:03:07 2021 +0100 patch 8.2.2385: "gj" and "gk" do not work correctly when inside a fold Problem: "gj" and "gk" do not work correctly when inside a fold. Solution: Move check for folding. (closes https://github.com/vim/vim/issues/7724, closes https://github.com/vim/vim/issues/4095) diff --git a/src/normal.c b/src/normal.c --- a/src/normal.c +++ b/src/normal.c @@ -2570,19 +2570,20 @@ nv_screengo(oparg_T *oap, int dir, long else { // to previous line +#ifdef FEAT_FOLDING + // Move to the start of a closed fold. Don't do that when + // 'foldopen' contains "all": it will open in a moment. + if (!(fdo_flags & FDO_ALL)) + (void)hasFolding(curwin->w_cursor.lnum, + &curwin->w_cursor.lnum, NULL); +#endif if (curwin->w_cursor.lnum == 1) { retval = FAIL; break; } --curwin->w_cursor.lnum; -#ifdef FEAT_FOLDING - // Move to the start of a closed fold. Don't do that when - // 'foldopen' contains "all": it will open in a moment. - if (!(fdo_flags & FDO_ALL)) - (void)hasFolding(curwin->w_cursor.lnum, - &curwin->w_cursor.lnum, NULL); -#endif + linelen = linetabsize(ml_get_curline()); if (linelen > width1) curwin->w_curswant += (((linelen - width1 - 1) / width2) @@ -5957,13 +5958,8 @@ nv_g_cmd(cmdarg_T *cap) */ case 'j': case K_DOWN: - // with 'nowrap' it works just like the normal "j" command; also when - // in a closed fold - if (!curwin->w_p_wrap -#ifdef FEAT_FOLDING - || hasFolding(curwin->w_cursor.lnum, NULL, NULL) -#endif - ) + // with 'nowrap' it works just like the normal "j" command. + if (!curwin->w_p_wrap) { oap->motion_type = MLINE; i = cursor_down(cap->count1, oap->op_type == OP_NOP); @@ -5976,13 +5972,8 @@ nv_g_cmd(cmdarg_T *cap) case 'k': case K_UP: - // with 'nowrap' it works just like the normal "k" command; also when - // in a closed fold - if (!curwin->w_p_wrap -#ifdef FEAT_FOLDING - || hasFolding(curwin->w_cursor.lnum, NULL, NULL) -#endif - ) + // with 'nowrap' it works just like the normal "k" command. + if (!curwin->w_p_wrap) { oap->motion_type = MLINE; i = cursor_up(cap->count1, oap->op_type == OP_NOP); 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 @@ -859,4 +859,39 @@ func Test_fold_create_delete() bwipe! endfunc +func Test_fold_relative_move() + enew! + set fdm=indent sw=2 wrap tw=80 + + let content = [ ' foo', ' bar', ' baz', + \ repeat('x', 100), + \ ' foo', ' bar', ' baz' + \ ] + call append(0, content) + + normal zM + + call cursor(3, 1) + call assert_true(foldclosed(line('.'))) + normal gj + call assert_equal(2, winline()) + + 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()) + + call cursor(6, 1) + call assert_true(foldclosed(line('.'))) + normal 2gk + call assert_equal(2, winline()) + + set fdm& sw& wrap& tw& +endfunc + " vim: shiftwidth=2 sts=2 expandtab 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 */ /**/ + 2385, +/**/ 2384, /**/ 2383,