Patch 9.0.1530
Problem:    Cursor moves to wrong line when 'foldmethod' is "diff". (Rick
            Howe)
Solution:   Adjust logic for scrolling. (Luuk van Baal, closes #12364,
            closes #12218)
Files:      src/move.c, src/testdir/test_normal.vim,
            src/testdir/dumps/Test_normal_j_below_botline.dump


*** ../vim-9.0.1529/src/move.c  2023-05-08 15:50:49.194261284 +0100
--- src/move.c  2023-05-09 15:52:40.846639135 +0100
***************
*** 1753,1774 ****
  }
  
  /*
-  * Return TRUE if scrollup() will scroll by screen line rather than text line.
-  */
-     static int
- scrolling_screenlines(int byfold UNUSED)
- {
-     return (curwin->w_p_wrap && curwin->w_p_sms)
- # ifdef FEAT_FOLDING
-       || (byfold && hasAnyFolding(curwin))
- # endif
- # ifdef FEAT_DIFF
-       || (curwin->w_p_diff && !curwin->w_p_wrap)
- # endif
-       ;
- }
- 
- /*
   * Scroll the current window up by "line_count" logical lines.  "CTRL-E"
   */
      void
--- 1753,1758 ----
***************
*** 1778,1784 ****
  {
      int               do_sms = curwin->w_p_wrap && curwin->w_p_sms;
  
!     if (scrolling_screenlines(byfold))
      {
        int         width1 = curwin->w_width - curwin_col_off();
        int         width2 = width1 + curwin_col_off2();
--- 1762,1775 ----
  {
      int               do_sms = curwin->w_p_wrap && curwin->w_p_sms;
  
!     if (do_sms
! # ifdef FEAT_FOLDING
!           || (byfold && hasAnyFolding(curwin))
! # endif
! # ifdef FEAT_DIFF
!           || (curwin->w_p_diff && !curwin->w_p_wrap)
! # endif
!        )
      {
        int         width1 = curwin->w_width - curwin_col_off();
        int         width2 = width1 + curwin_col_off2();
***************
*** 2466,2472 ****
  {
      int               used;
      int               scrolled = 0;
-     int               min_scrolled = 1;
      int               extra = 0;
      int               i;
      linenr_T  line_count;
--- 2457,2462 ----
***************
*** 2483,2488 ****
--- 2473,2479 ----
      int               old_empty_rows = curwin->w_empty_rows;
      linenr_T  cln;                // Cursor Line Number
      long      so = get_scrolloff_value();
+     int               do_sms = curwin->w_p_wrap && curwin->w_p_sms;
  
      cln = curwin->w_cursor.lnum;
      if (set_topbot)
***************
*** 2504,2510 ****
                break;
            if (used + loff.height > curwin->w_height)
            {
!               if (curwin->w_p_sms && curwin->w_p_wrap)
                {
                    // 'smoothscroll' and 'wrap' are set.  The above line is
                    // too long to show in its entirety, so we show just a part
--- 2495,2501 ----
                break;
            if (used + loff.height > curwin->w_height)
            {
!               if (do_sms)
                {
                    // 'smoothscroll' and 'wrap' are set.  The above line is
                    // too long to show in its entirety, so we show just a part
***************
*** 2565,2579 ****
        scrolled = used;
        if (cln == curwin->w_botline)
            scrolled -= curwin->w_empty_rows;
!       min_scrolled = scrolled;
!       if (curwin->w_p_sms && curwin->w_p_wrap)
        {
!           // 'smoothscroll' and 'wrap' are set
!           if (cln > curwin->w_botline)
!               // add screen lines below w_botline
!               for (linenr_T lnum = curwin->w_botline + 1; lnum <= cln; ++lnum)
!                   min_scrolled += PLINES_NOFILL(lnum);
! 
            // Calculate how many screen lines the current top line of window
            // occupies. If it is occupying more than the entire window, we
            // need to scroll the additional clipped lines to scroll past the
--- 2556,2564 ----
        scrolled = used;
        if (cln == curwin->w_botline)
            scrolled -= curwin->w_empty_rows;
!       if (do_sms)
        {
!           // 'smoothscroll' and 'wrap' are set.
            // Calculate how many screen lines the current top line of window
            // occupies. If it is occupying more than the entire window, we
            // need to scroll the additional clipped lines to scroll past the
***************
*** 2598,2604 ****
            if (top_plines > curwin->w_height)
            {
                scrolled += (top_plines - curwin->w_height);
-               min_scrolled += (top_plines - curwin->w_height);
            }
        }
      }
--- 2583,2588 ----
***************
*** 2725,2746 ****
       */
      if (line_count >= curwin->w_height && line_count > min_scroll)
        scroll_cursor_halfway(FALSE, TRUE);
!     else
      {
!       // With 'smoothscroll' scroll at least the height of the cursor line,
!       // unless it would move the cursor.
!       if (curwin->w_p_wrap && curwin->w_p_sms && line_count < min_scrolled
!               && (curwin->w_cursor.lnum < curwin->w_topline
!                   || (curwin->w_virtcol - curwin->w_skipcol >=
!                                         curwin->w_width - curwin_col_off())))
!           line_count = min_scrolled;
!       if (line_count > 0)
!       {
!           if (scrolling_screenlines(TRUE))
!               scrollup(scrolled, TRUE);  // TODO
!           else
!               scrollup(line_count, TRUE);
!       }
      }
  
      /*
--- 2709,2720 ----
       */
      if (line_count >= curwin->w_height && line_count > min_scroll)
        scroll_cursor_halfway(FALSE, TRUE);
!     else if (line_count > 0)
      {
!       if (do_sms)
!           scrollup(scrolled, TRUE);  // TODO
!       else
!           scrollup(line_count, TRUE);
      }
  
      /*
*** ../vim-9.0.1529/src/testdir/test_normal.vim 2023-05-07 17:39:19.807633903 
+0100
--- src/testdir/test_normal.vim 2023-05-09 15:52:40.850639138 +0100
***************
*** 3980,3983 ****
--- 3980,4001 ----
    call delete('Xmouseshapes')
  endfunc
  
+ " Test that "j" does not skip lines when scrolling below botline and
+ " 'foldmethod' is not "manual".
+ func Test_normal_j_below_botline()
+   CheckScreendump
+ 
+   let lines =<< trim END
+     set number foldmethod=diff scrolloff=0
+     call setline(1, map(range(1, 9), 'repeat(v:val, 200)'))
+     norm Lj
+   END
+   call writefile(lines, 'XNormalJBelowBotline', 'D')
+   let buf = RunVimInTerminal('-S XNormalJBelowBotline', #{rows: 19, cols: 40})
+ 
+   call VerifyScreenDump(buf, 'Test_normal_j_below_botline', {})
+ 
+   call StopVimInTerminal(buf)
+ endfunc
+ 
  " vim: shiftwidth=2 sts=2 expandtab
*** ../vim-9.0.1529/src/testdir/dumps/Test_normal_j_below_botline.dump  
2023-05-09 16:00:31.858876495 +0100
--- src/testdir/dumps/Test_normal_j_below_botline.dump  2023-05-09 
15:52:40.846639135 +0100
***************
*** 0 ****
--- 1,19 ----
+ | +0#af5f00255#ffffff0@1|2| |2+0#0000000&@35
+ | +0#af5f00255&@3|2+0#0000000&@35
+ | +0#af5f00255&@3|2+0#0000000&@35
+ | +0#af5f00255&@3|2+0#0000000&@35
+ | +0#af5f00255&@3|2+0#0000000&@35
+ | +0#af5f00255&@3|2+0#0000000&@19| @15
+ | +0#af5f00255&@1|3| |3+0#0000000&@35
+ | +0#af5f00255&@3|3+0#0000000&@35
+ | +0#af5f00255&@3|3+0#0000000&@35
+ | +0#af5f00255&@3|3+0#0000000&@35
+ | +0#af5f00255&@3|3+0#0000000&@35
+ | +0#af5f00255&@3|3+0#0000000&@19| @15
+ | +0#af5f00255&@1|4| >4+0#0000000&@35
+ | +0#af5f00255&@3|4+0#0000000&@35
+ | +0#af5f00255&@3|4+0#0000000&@35
+ | +0#af5f00255&@3|4+0#0000000&@35
+ | +0#af5f00255&@3|4+0#0000000&@35
+ | +0#af5f00255&@3|4+0#0000000&@19| @15
+ @22|4|,|1| @10|1|6|%| 
*** ../vim-9.0.1529/src/version.c       2023-05-09 14:59:55.964088966 +0100
--- src/version.c       2023-05-09 15:55:27.242763534 +0100
***************
*** 697,698 ****
--- 697,700 ----
  {   /* Add new patch number below this line */
+ /**/
+     1530,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
28. You have comandeered your teenager's phone line for the net and even his
    friends know not to call on his line anymore.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            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/20230509150155.43E301C1B21%40moolenaar.net.

Raspunde prin e-mail lui