Patch 9.0.0807
Problem:    With 'smoothscroll' typing "0" may not go to the first column.
Solution:   Recompute w_cline_height when needed.  Do not scroll up when it
            would move the cursor.
Files:      src/move.c, src/testdir/dumps/Test_smooth_long_9.dump


*** ../vim-9.0.0806/src/move.c  2022-10-14 20:09:00.895207512 +0100
--- src/move.c  2022-10-20 19:49:30.767430247 +0100
***************
*** 62,67 ****
--- 62,89 ----
  }
  
  /*
+  * Return how many lines "lnum" will take on the screen, taking into account
+  * whether it is the first line, whether w_skipcol is non-zero and limiting to
+  * the window height.
+  */
+     static int
+ plines_correct_topline(win_T *wp, linenr_T lnum)
+ {
+     int n;
+ #ifdef FEAT_DIFF
+     if (lnum == wp->w_topline)
+       n = plines_win_nofill(wp, lnum, FALSE) + wp->w_topfill;
+     else
+ #endif
+       n = plines_win(wp, lnum, FALSE);
+     if (lnum == wp->w_topline)
+       n = adjust_plines_for_skipcol(wp, n);
+     if (n > wp->w_height)
+       n = wp->w_height;
+     return n;
+ }
+ 
+ /*
   * Compute wp->w_botline for the current wp->w_topline.  Can be called after
   * wp->w_topline changed.
   */
***************
*** 105,118 ****
        else
  #endif
        {
! #ifdef FEAT_DIFF
!           if (lnum == wp->w_topline)
!               n = plines_win_nofill(wp, lnum, TRUE) + wp->w_topfill;
!           else
! #endif
!               n = plines_win(wp, lnum, TRUE);
!           if (lnum == wp->w_topline)
!               n = adjust_plines_for_skipcol(wp, n);
        }
        if (
  #ifdef FEAT_FOLDING
--- 127,133 ----
        else
  #endif
        {
!           n = plines_correct_topline(wp, lnum);
        }
        if (
  #ifdef FEAT_FOLDING
***************
*** 833,848 ****
            else
  #endif
            {
!               int n;
! #ifdef FEAT_DIFF
!               if (lnum == wp->w_topline)
!                   n = plines_win_nofill(wp, lnum, TRUE) + wp->w_topfill;
!               else
! #endif
!                   n = plines_win(wp, lnum, TRUE);
!               if (lnum++ == wp->w_topline)
!                   n = adjust_plines_for_skipcol(wp, n);
!               wp->w_cline_row += n;
            }
        }
      }
--- 848,855 ----
            else
  #endif
            {
!               wp->w_cline_row += plines_correct_topline(wp, lnum);
!               ++lnum;
            }
        }
      }
***************
*** 1660,1665 ****
--- 1667,1688 ----
  }
  
  /*
+  * 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
+ # endif
+       ;
+ }
+ 
+ /*
   * Scroll the current window up by "line_count" logical lines.  "CTRL-E"
   */
      void
***************
*** 1669,1682 ****
  {
      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
! # endif
!           )
      {
        int         width1 = curwin->w_width - curwin_col_off();
        int         width2 = width1 + curwin_col_off2();
--- 1692,1698 ----
  {
      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();
***************
*** 1829,1835 ****
      int           scrolloff_cols = so == 0 ? 0 : width1 + (so - 1) * width2;
      int           scrolled = FALSE;
  
!     validate_virtcol();
      if (curwin->w_cline_height == curwin->w_height)
      {
        // the line just fits in the window, don't scroll
--- 1845,1851 ----
      int           scrolloff_cols = so == 0 ? 0 : width1 + (so - 1) * width2;
      int           scrolled = FALSE;
  
!     validate_cheight();
      if (curwin->w_cline_height == curwin->w_height)
      {
        // the line just fits in the window, don't scroll
***************
*** 1841,1846 ****
--- 1857,1863 ----
        return;
      }
  
+     validate_virtcol();
      while (curwin->w_skipcol > 0
                 && curwin->w_virtcol < curwin->w_skipcol + 3 + scrolloff_cols)
      {
***************
*** 2539,2548 ****
        scroll_cursor_halfway(FALSE);
      else
      {
!       // With 'smoothscroll' scroll at least the height of the cursor line.
!       if (curwin->w_p_wrap && curwin->w_p_sms && line_count < min_scrolled)
            line_count = min_scrolled;
!       scrollup(line_count, TRUE);
      }
  
      /*
--- 2556,2575 ----
        scroll_cursor_halfway(FALSE);
      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);
!       }
      }
  
      /*
*** ../vim-9.0.0806/src/testdir/dumps/Test_smooth_long_9.dump   2022-10-12 
19:53:10.621726849 +0100
--- src/testdir/dumps/Test_smooth_long_9.dump   2022-10-20 19:50:06.083239149 
+0100
***************
*** 1,6 ****
! |<+0#4040ff13#ffffff0@2|t+0#0000000&|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| 
|l|o|t|s| |o|f| |t|e|x|t| |w|i|t
! |h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| 
|l|o
! |t|s| |o|f| |t|e|x>t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| 
|o
! |f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| 
|t|e
  |x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| 
|w
! |:|s|e|t| |s|c|r|o|l@1|o| @9|3|,|1|3|0| @8|B|o|t| 
--- 1,6 ----
! |<+0#4040ff13#ffffff0@2|o+0#0000000&|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| 
|o|f| |t|e|x|t| |w|i|t|h| |l|o
! |t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| 
|o
! |f| |t|e|x|t| |w|i>t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| 
|t|e
  |x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| 
|w
! |i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| 
|w|i|t|h| 
! @22|3|,|1|7|0| @8|B|o|t| 
*** ../vim-9.0.0806/src/version.c       2022-10-20 17:59:34.610510336 +0100
--- src/version.c       2022-10-20 20:12:31.351876602 +0100
***************
*** 697,698 ****
--- 697,700 ----
  {   /* Add new patch number below this line */
+ /**/
+     807,
  /**/

-- 
How come wrong numbers are never busy?

 /// 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/20221020195409.3189F1C17E4%40moolenaar.net.

Raspunde prin e-mail lui