Patch 8.2.2385
Problem:    "gj" and "gk" do not work correctly when inside a fold.
Solution:   Move check for folding. (closes #7724, closes #4095)
Files:      src/normal.c, src/testdir/test_fold.vim


*** ../vim-8.2.2384/src/normal.c        2021-01-16 20:20:59.646487092 +0100
--- src/normal.c        2021-01-21 16:58:17.807717313 +0100
***************
*** 2570,2581 ****
            else
            {
                // to previous line
-               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.
--- 2570,2575 ----
***************
*** 2583,2588 ****
--- 2577,2589 ----
                    (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;
+ 
                linelen = linetabsize(ml_get_curline());
                if (linelen > width1)
                    curwin->w_curswant += (((linelen - width1 - 1) / width2)
***************
*** 5957,5969 ****
       */
      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
!               )
        {
            oap->motion_type = MLINE;
            i = cursor_down(cap->count1, oap->op_type == OP_NOP);
--- 5958,5965 ----
       */
      case 'j':
      case K_DOWN:
!       // 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,5988 ****
  
      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
!          )
        {
            oap->motion_type = MLINE;
            i = cursor_up(cap->count1, oap->op_type == OP_NOP);
--- 5972,5979 ----
  
      case 'k':
      case K_UP:
!       // 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);
*** ../vim-8.2.2384/src/testdir/test_fold.vim   2020-12-21 14:01:38.328550550 
+0100
--- src/testdir/test_fold.vim   2021-01-21 17:01:00.123366585 +0100
***************
*** 859,862 ****
--- 859,897 ----
    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
*** ../vim-8.2.2384/src/version.c       2021-01-21 14:45:08.914738378 +0100
--- src/version.c       2021-01-21 17:02:49.451237190 +0100
***************
*** 752,753 ****
--- 752,755 ----
  {   /* Add new patch number below this line */
+ /**/
+     2385,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
199. You read this entire list of symptoms, looking for something
     that doesn't describe you.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/202101211612.10LGC7Mu1930678%40masaka.moolenaar.net.

Raspunde prin e-mail lui