changeset 23687:09ad3f1b9714 v8.2.2385

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 <Bram@vim.org> 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)
author Bram Moolenaar <Bram@vim.org>
date Thu, 21 Jan 2021 17:15:04 +0100
parents bc2b820a579b
children 915625fad609
files src/normal.c src/testdir/test_fold.vim src/version.c
diffstat 3 files changed, 49 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- 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);
--- 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
--- 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,