Patch 9.0.0640
Problem:    Cannot scroll by screen line if a line wraps.
Solution:   Add the 'smoothscroll' option.  Only works for CTRL-E and CTRL-Y
            so far.
Files:      runtime/doc/options.txt, runtime/doc/quickref.txt,
            runtime/optwin.vim, src/structs.h, src/optiondefs.h, src/option.c,
            src/drawline.c, src/move.c, src/testdir/test_scroll_opt.vim,
            src/testdir/dumps/Test_smoothscroll_1.dump,
            src/testdir/dumps/Test_smoothscroll_2.dump,
            src/testdir/dumps/Test_smoothscroll_3.dump,
            src/testdir/dumps/Test_smoothscroll_4.dump,
            src/testdir/dumps/Test_smoothscroll_5.dump,
            src/testdir/dumps/Test_smoothscroll_6.dump,
            src/testdir/dumps/Test_smoothscroll_7.dump,
            src/testdir/dumps/Test_smoothscroll_8.dump


*** ../vim-9.0.0639/runtime/doc/options.txt     2022-10-01 19:43:48.602494034 
+0100
--- runtime/doc/options.txt     2022-10-02 21:26:06.080848259 +0100
***************
*** 7273,7278 ****
--- 7302,7315 ----
        reset.
        NOTE: This option is reset when 'compatible' is set.
  
+                       *'smoothscroll'* *'sms'* *'nosmoothscroll'* *'nosms'*
+ 'smoothscroll' 'sms'  boolean  (default off)
+                       local to window
+       Scrolling works with screen lines.  When 'wrap' is set and the first
+       line in the window wraps part of it may not be visible, as if it is
+       above the window.
+       NOTE: only partly implemented, works with CTRL-E and CTRL-Y.
+ 
                                        *'softtabstop'* *'sts'*
  'softtabstop' 'sts'   number  (default 0)
                        local to buffer
*** ../vim-9.0.0639/runtime/doc/quickref.txt    2022-09-11 16:59:48.934110049 
+0100
--- runtime/doc/quickref.txt    2022-10-02 21:25:42.356954154 +0100
***************
*** 910,915 ****
--- 910,916 ----
  'smartcase'     'scs'     no ignore case when pattern has uppercase
  'smartindent'   'si'      smart autoindenting for C programs
  'smarttab'      'sta'     use 'shiftwidth' when inserting <Tab>
+ 'smoothscroll'          'sms'     scroll by screen lines when 'wrap' is set
  'softtabstop'   'sts'     number of spaces that <Tab> uses while editing
  'spell'                           enable spell checking
  'spellcapcheck'   'spc'     pattern to locate end of a sentence
***************
*** 919,925 ****
  'spellsuggest'          'sps'     method(s) used to suggest spelling 
corrections
  'splitbelow'    'sb'      new window from split is below the current one
  'splitright'    'spr'     new window is put right of the current one
! 'splitscroll'   'spsc'    determines scroll behavior when splitting windows
  'startofline'   'sol'     commands move cursor to first non-blank in line
  'statusline'    'stl'     custom format for the status line
  'suffixes'      'su'      suffixes that are ignored with multiple match
--- 920,926 ----
  'spellsuggest'          'sps'     method(s) used to suggest spelling 
corrections
  'splitbelow'    'sb'      new window from split is below the current one
  'splitright'    'spr'     new window is put right of the current one
! 'splitscroll'   'spsc'    determines scroll behavior for split windows
  'startofline'   'sol'     commands move cursor to first non-blank in line
  'statusline'    'stl'     custom format for the status line
  'suffixes'      'su'      suffixes that are ignored with multiple match
*** ../vim-9.0.0639/runtime/optwin.vim  2022-09-16 12:52:54.505955519 +0100
--- runtime/optwin.vim  2022-10-02 21:23:47.637513388 +0100
***************
*** 343,348 ****
--- 343,351 ----
  call <SID>AddOption("scroll", gettext("number of lines to scroll for CTRL-U 
and CTRL-D"))
  call append("$", "\t" .. s:local_to_window)
  call <SID>OptionL("scr")
+ call <SID>AddOption("smoothscroll", gettext("scroll by screen line"))
+ call append("$", "\t" .. s:local_to_window)
+ call <SID>BinOptionL("sms")
  call <SID>AddOption("scrolloff", gettext("number of screen lines to show 
around the cursor"))
  call append("$", " \tset so=" . &so)
  call <SID>AddOption("wrap", gettext("long lines wrap"))
*** ../vim-9.0.0639/src/structs.h       2022-09-29 19:14:37.675876694 +0100
--- src/structs.h       2022-10-02 17:48:59.045171364 +0100
***************
*** 262,267 ****
--- 262,269 ----
  #endif
      long      wo_scr;
  #define w_p_scr w_onebuf_opt.wo_scr   // 'scroll'
+     int               wo_sms;
+ #define w_p_sms w_onebuf_opt.wo_sms   // 'smoothscroll'
  #ifdef FEAT_SPELL
      int               wo_spell;
  # define w_p_spell w_onebuf_opt.wo_spell // 'spell'
***************
*** 3592,3602 ****
                                    // below w_topline (at end of file)
      int               w_old_botfill;      // w_botfill at last redraw
  #endif
!     colnr_T   w_leftcol;          // window column number of the left most
                                    // character in the window; used when
                                    // 'wrap' is off
!     colnr_T   w_skipcol;          // starting column when a single line
!                                   // doesn't fit in the window
  
      int               w_empty_rows;       // number of ~ rows in window
  #ifdef FEAT_DIFF
--- 3594,3605 ----
                                    // below w_topline (at end of file)
      int               w_old_botfill;      // w_botfill at last redraw
  #endif
!     colnr_T   w_leftcol;          // screen column number of the left most
                                    // character in the window; used when
                                    // 'wrap' is off
!     colnr_T   w_skipcol;          // starting screen column for the first
!                                   // line in the window; used when 'wrap' is
!                                   // on
  
      int               w_empty_rows;       // number of ~ rows in window
  #ifdef FEAT_DIFF
*** ../vim-9.0.0639/src/optiondefs.h    2022-09-11 16:59:48.934110049 +0100
--- src/optiondefs.h    2022-10-02 17:10:56.126414341 +0100
***************
*** 194,199 ****
--- 194,200 ----
  #endif
  #define PV_SCBIND     OPT_WIN(WV_SCBIND)
  #define PV_SCROLL     OPT_WIN(WV_SCROLL)
+ #define PV_SMS                OPT_WIN(WV_SMS)
  #define PV_SISO               OPT_BOTH(OPT_WIN(WV_SISO))
  #define PV_SO         OPT_BOTH(OPT_WIN(WV_SO))
  #ifdef FEAT_SPELL
***************
*** 2282,2287 ****
--- 2283,2291 ----
      {"smarttab",    "sta",  P_BOOL|P_VI_DEF|P_VIM,
                            (char_u *)&p_sta, PV_NONE,
                            {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
+     {"smoothscroll", "sms", P_BOOL|P_VI_DEF|P_RWIN,
+                           (char_u *)VAR_WIN, PV_SMS,
+                           {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
      {"softtabstop", "sts",  P_NUM|P_VI_DEF|P_VIM,
                            (char_u *)&p_sts, PV_STS,
                            {(char_u *)0L, (char_u *)0L} SCTX_INIT},
*** ../vim-9.0.0639/src/option.c        2022-09-22 13:57:29.075199731 +0100
--- src/option.c        2022-10-02 17:16:24.590652593 +0100
***************
*** 2964,2969 ****
--- 2964,2978 ----
      }
  #endif
  
+     else if ((int *)varp == &curwin->w_p_sms)
+     {
+       if (!curwin->w_p_sms)
+       {
+           curwin->w_skipcol = 0;
+           changed_line_abv_curs();
+       }
+     }
+ 
      // when 'textmode' is set or reset also change 'fileformat'
      else if ((int *)varp == &curbuf->b_p_tx)
      {
***************
*** 5436,5441 ****
--- 5445,5451 ----
        case PV_RLC:    return (char_u *)&(curwin->w_p_rlc);
  #endif
        case PV_SCROLL: return (char_u *)&(curwin->w_p_scr);
+       case PV_SMS:    return (char_u *)&(curwin->w_p_sms);
        case PV_WRAP:   return (char_u *)&(curwin->w_p_wrap);
  #ifdef FEAT_LINEBREAK
        case PV_LBR:    return (char_u *)&(curwin->w_p_lbr);
*** ../vim-9.0.0639/src/drawline.c      2022-09-25 20:58:08.801019377 +0100
--- src/drawline.c      2022-10-02 17:47:17.184646130 +0100
***************
*** 387,393 ****
              }
  
              sprintf((char *)wlv->extra, fmt, number_width(wp), num);
!             if (wp->w_skipcol > 0)
                  for (wlv->p_extra = wlv->extra; *wlv->p_extra == ' ';
                          ++wlv->p_extra)
                      *wlv->p_extra = '-';
--- 387,393 ----
              }
  
              sprintf((char *)wlv->extra, fmt, number_width(wp), num);
!             if (wp->w_skipcol > 0 && wlv->startrow == 0)
                  for (wlv->p_extra = wlv->extra; *wlv->p_extra == ' ';
                          ++wlv->p_extra)
                      *wlv->p_extra = '-';
***************
*** 492,498 ****
                if (wlv->n_extra < 0)
                    wlv->n_extra = 0;
            }
!           if (wp->w_skipcol > 0 && wp->w_p_wrap && wp->w_briopt_sbr)
                wlv->need_showbreak = FALSE;
            // Correct end of highlighted area for 'breakindent',
            // required when 'linebreak' is also set.
--- 492,499 ----
                if (wlv->n_extra < 0)
                    wlv->n_extra = 0;
            }
!           if (wp->w_skipcol > 0 && wlv->startrow == 0
!                                          && wp->w_p_wrap && wp->w_briopt_sbr)
                wlv->need_showbreak = FALSE;
            // Correct end of highlighted area for 'breakindent',
            // required when 'linebreak' is also set.
***************
*** 540,546 ****
        wlv->c_extra = NUL;
        wlv->c_final = NUL;
        wlv->n_extra = (int)STRLEN(sbr);
!       if (wp->w_skipcol == 0 || !wp->w_p_wrap)
            wlv->need_showbreak = FALSE;
        wlv->vcol_sbr = wlv->vcol + MB_CHARLEN(sbr);
        // Correct end of highlighted area for 'showbreak',
--- 541,547 ----
        wlv->c_extra = NUL;
        wlv->c_final = NUL;
        wlv->n_extra = (int)STRLEN(sbr);
!       if ((wp->w_skipcol == 0 && wlv->startrow == 0) || !wp->w_p_wrap)
            wlv->need_showbreak = FALSE;
        wlv->vcol_sbr = wlv->vcol + MB_CHARLEN(sbr);
        // Correct end of highlighted area for 'showbreak',
***************
*** 750,756 ****
  
      // Highlight 'cursorcolumn' & 'colorcolumn' past end of the line.
      if (wp->w_p_wrap)
!       v = wp->w_skipcol;
      else
        v = wp->w_leftcol;
  
--- 751,757 ----
  
      // Highlight 'cursorcolumn' & 'colorcolumn' past end of the line.
      if (wp->w_p_wrap)
!       v = wlv->startrow == 0 ? wp->w_skipcol : 0;
      else
        v = wp->w_leftcol;
  
***************
*** 1411,1417 ****
      // 'nowrap' or 'wrap' and a single line that doesn't fit: Advance to the
      // first character to be displayed.
      if (wp->w_p_wrap)
!       v = wp->w_skipcol;
      else
        v = wp->w_leftcol;
      if (v > 0 && !number_only)
--- 1412,1418 ----
      // 'nowrap' or 'wrap' and a single line that doesn't fit: Advance to the
      // first character to be displayed.
      if (wp->w_p_wrap)
!       v = startrow == 0 ? wp->w_skipcol : 0;
      else
        v = wp->w_leftcol;
      if (v > 0 && !number_only)
***************
*** 3219,3227 ****
        // special character (via 'listchars' option "precedes:<char>".
        if (lcs_prec_todo != NUL
                && wp->w_p_list
!               && (wp->w_p_wrap ?
!                   (wp->w_skipcol > 0  && wlv.row == 0) :
!                   wp->w_leftcol > 0)
  #ifdef FEAT_DIFF
                && wlv.filler_todo <= 0
  #endif
--- 3220,3227 ----
        // special character (via 'listchars' option "precedes:<char>".
        if (lcs_prec_todo != NUL
                && wp->w_p_list
!               && (wp->w_p_wrap ? (wp->w_skipcol > 0 && wlv.row == 0)
!                                : wp->w_leftcol > 0)
  #ifdef FEAT_DIFF
                && wlv.filler_todo <= 0
  #endif
*** ../vim-9.0.0639/src/move.c  2022-09-24 21:06:35.408199744 +0100
--- src/move.c  2022-10-02 20:48:28.203440999 +0100
***************
*** 36,41 ****
--- 36,67 ----
  static void botline_forw(lineoff_T *lp);
  
  /*
+  * Reduce "n" for the screen lines skipped with "wp->w_skipcol".
+  */
+     static int
+ adjust_plines_for_skipcol(win_T *wp, int n)
+ {
+     if (wp->w_skipcol == 0)
+       return n;
+ 
+     int off = 0;
+     int width = wp->w_width - win_col_off(wp);
+     if (wp->w_skipcol >= width)
+     {
+       ++off;
+       int skip = wp->w_skipcol - width;
+       width -= win_col_off2(wp);
+       while (skip >= width)
+       {
+           ++off;
+           skip -= width;
+       }
+     }
+     wp->w_valid &= ~VALID_WROW;
+     return n - off;
+ }
+ 
+ /*
   * Compute wp->w_botline for the current wp->w_topline.  Can be called after
   * wp->w_topline changed.
   */
***************
*** 78,89 ****
--- 104,119 ----
        }
        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
                lnum <= wp->w_cursor.lnum && last >= wp->w_cursor.lnum
***************
*** 778,790 ****
            }
            else
  #endif
  #ifdef FEAT_DIFF
                if (lnum == wp->w_topline)
!                   wp->w_cline_row += plines_win_nofill(wp, lnum++, TRUE)
!                                                             + wp->w_topfill;
                else
  #endif
!                   wp->w_cline_row += plines_win(wp, lnum++, TRUE);
        }
      }
  
--- 808,825 ----
            }
            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;
!           }
        }
      }
  
***************
*** 1237,1243 ****
        else if (extra < 0)
            win_del_lines(curwin, 0, -extra, FALSE, FALSE, 0);
      }
!     else
        curwin->w_skipcol = 0;
      if (prev_skipcol != curwin->w_skipcol)
        redraw_later(UPD_NOT_VALID);
--- 1272,1278 ----
        else if (extra < 0)
            win_del_lines(curwin, 0, -extra, FALSE, FALSE, 0);
      }
!     else if (!curwin->w_p_sms)
        curwin->w_skipcol = 0;
      if (prev_skipcol != curwin->w_skipcol)
        redraw_later(UPD_NOT_VALID);
***************
*** 1422,1427 ****
--- 1457,1470 ----
      long      done = 0;       // total # of physical lines done
      int               wrow;
      int               moved = FALSE;
+     int               width1 = 0;
+     int               width2 = 0;
+ 
+     if (curwin->w_p_wrap && curwin->w_p_sms)
+     {
+       width1 = curwin->w_width - curwin_col_off();
+       width2 = width1 - curwin_col_off2();
+     }
  
  #ifdef FEAT_FOLDING
      linenr_T  first;
***************
*** 1442,1466 ****
        else
  #endif
        {
!           if (curwin->w_topline == 1)
                break;
!           --curwin->w_topline;
! #ifdef FEAT_DIFF
!           curwin->w_topfill = 0;
! #endif
! #ifdef FEAT_FOLDING
!           // A sequence of folded lines only counts for one logical line
!           if (hasFolding(curwin->w_topline, &first, NULL))
            {
                ++done;
-               if (!byfold)
-                   line_count -= curwin->w_topline - first - 1;
-               curwin->w_botline -= curwin->w_topline - first;
-               curwin->w_topline = first;
            }
            else
  #endif
!               done += PLINES_NOFILL(curwin->w_topline);
        }
        --curwin->w_botline;            // approximate w_botline
        invalidate_botline();
--- 1485,1541 ----
        else
  #endif
        {
!           if (curwin->w_topline == 1 && curwin->w_skipcol < width1)
                break;
!           if (curwin->w_p_wrap && curwin->w_p_sms
!                                                 && curwin->w_skipcol >= 
width1)
            {
+               if (curwin->w_skipcol >= width1 + width2)
+                   curwin->w_skipcol -= width2;
+               else
+                   curwin->w_skipcol -= width1;
+               redraw_later(UPD_NOT_VALID);
                ++done;
            }
            else
+           {
+               --curwin->w_topline;
+               curwin->w_skipcol = 0;
+ #ifdef FEAT_DIFF
+               curwin->w_topfill = 0;
+ #endif
+ #ifdef FEAT_FOLDING
+               // A sequence of folded lines only counts for one logical line
+               if (hasFolding(curwin->w_topline, &first, NULL))
+               {
+                   ++done;
+                   if (!byfold)
+                       line_count -= curwin->w_topline - first - 1;
+                   curwin->w_botline -= curwin->w_topline - first;
+                   curwin->w_topline = first;
+               }
+               else
  #endif
!               if (curwin->w_p_wrap && curwin->w_p_sms)
!               {
!                   int size = win_linetabsize(curwin, curwin->w_topline,
!                                  ml_get(curwin->w_topline), (colnr_T)MAXCOL);
!                   if (size > width1)
!                   {
!                       curwin->w_skipcol = width1;
!                       size -= width1;
!                       redraw_later(UPD_NOT_VALID);
!                   }
!                   while (size > width2)
!                   {
!                       curwin->w_skipcol += width2;
!                       size -= width2;
!                   }
!                   ++done;
!               }
!               else
!                   done += PLINES_NOFILL(curwin->w_topline);
!           }
        }
        --curwin->w_botline;            // approximate w_botline
        invalidate_botline();
***************
*** 1565,1570 ****
--- 1640,1680 ----
      }
      else
  #endif
+     if (curwin->w_p_wrap && curwin->w_p_sms)
+     {
+       int off1 = curwin_col_off();
+       int off2 = off1 + curwin_col_off2();
+       int add;
+       int size = win_linetabsize(curwin, curwin->w_topline,
+                                  ml_get(curwin->w_topline), (colnr_T)MAXCOL);
+       linenr_T prev_topline = curwin->w_topline;
+ 
+       // 'smoothscroll': increase "w_skipcol" until it goes over the end of
+       // the line, then advance to the next line.
+       for (int todo = line_count; todo > 0; --todo)
+       {
+           add = curwin->w_width - (curwin->w_skipcol > 0 ? off2 : off1);
+           curwin->w_skipcol += add;
+           if (curwin->w_skipcol >= size)
+           {
+               if (curwin->w_topline == curbuf->b_ml.ml_line_count)
+               {
+                   curwin->w_skipcol -= add;
+                   break;
+               }
+               ++curwin->w_topline;
+               ++curwin->w_botline;    // approximate w_botline
+               curwin->w_skipcol = 0;
+               if (todo > 1)
+                   size = win_linetabsize(curwin, curwin->w_topline,
+                                  ml_get(curwin->w_topline), (colnr_T)MAXCOL);
+           }
+       }
+       if (curwin->w_topline == prev_topline)
+           // need to redraw even though w_topline didn't change
+           redraw_later(UPD_NOT_VALID);
+     }
+     else
      {
        curwin->w_topline += line_count;
        curwin->w_botline += line_count;        // approximate w_botline
*** ../vim-9.0.0639/src/testdir/test_scroll_opt.vim     2020-08-12 
17:43:41.000000000 +0100
--- src/testdir/test_scroll_opt.vim     2022-10-02 21:12:04.864089029 +0100
***************
*** 1,4 ****
! " Test for reset 'scroll'
  
  func Test_reset_scroll()
    let scr = &l:scroll
--- 1,7 ----
! " Test for reset 'scroll' and 'smoothscroll'
! 
! source check.vim
! source screendump.vim
  
  func Test_reset_scroll()
    let scr = &l:scroll
***************
*** 34,37 ****
--- 37,83 ----
    quit!
  endfunc
  
+ func Test_smoothscroll_CtrlE_CtrlY()
+   CheckScreendump
+ 
+   let lines =<< trim END
+       vim9script
+       setline(1, [
+         'line one',
+         'word '->repeat(20),
+         'line three',
+         'long word '->repeat(7),
+         'line',
+         'line',
+         'line',
+       ])
+       set smoothscroll
+       :5
+   END
+   call writefile(lines, 'XSmoothScroll', 'D')
+   let buf = RunVimInTerminal('-S XSmoothScroll', #{rows: 12, cols: 40})
+ 
+   call term_sendkeys(buf, "\<C-E>")
+   call VerifyScreenDump(buf, 'Test_smoothscroll_1', {})
+   call term_sendkeys(buf, "\<C-E>")
+   call VerifyScreenDump(buf, 'Test_smoothscroll_2', {})
+   call term_sendkeys(buf, "\<C-E>")
+   call VerifyScreenDump(buf, 'Test_smoothscroll_3', {})
+   call term_sendkeys(buf, "\<C-E>")
+   call VerifyScreenDump(buf, 'Test_smoothscroll_4', {})
+ 
+   call term_sendkeys(buf, "\<C-Y>")
+   call VerifyScreenDump(buf, 'Test_smoothscroll_5', {})
+   call term_sendkeys(buf, "\<C-Y>")
+   call VerifyScreenDump(buf, 'Test_smoothscroll_6', {})
+   call term_sendkeys(buf, "\<C-Y>")
+   call VerifyScreenDump(buf, 'Test_smoothscroll_7', {})
+   call term_sendkeys(buf, "\<C-Y>")
+   call VerifyScreenDump(buf, 'Test_smoothscroll_8', {})
+ 
+   call StopVimInTerminal(buf)
+ endfunc
+ 
+ 
+ 
  " vim: shiftwidth=2 sts=2 expandtab
*** ../vim-9.0.0639/src/testdir/dumps/Test_smoothscroll_1.dump  2022-10-02 
21:28:20.104302650 +0100
--- src/testdir/dumps/Test_smoothscroll_1.dump  2022-10-02 21:10:59.857177833 
+0100
***************
*** 0 ****
--- 1,12 ----
+ |w+0&#ffffff0|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| 
|w|o|r|d| |w|o|r|d| 
+ |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| 
|w|o|r|d| 
+ |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| @20
+ |l|i|n|e| |t|h|r|e@1| @29
+ |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| 
|w|o|r|d| 
+ |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| @10
+ >l|i|n|e| @35
+ |l|i|n|e| @35
+ |l|i|n|e| @35
+ |~+0#4040ff13&| @38
+ |~| @38
+ | +0#0000000&@21|5|,|1| @10|B|o|t| 
*** ../vim-9.0.0639/src/testdir/dumps/Test_smoothscroll_2.dump  2022-10-02 
21:28:20.108302633 +0100
--- src/testdir/dumps/Test_smoothscroll_2.dump  2022-10-02 21:11:01.013157358 
+0100
***************
*** 0 ****
--- 1,12 ----
+ |w+0&#ffffff0|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| 
|w|o|r|d| |w|o|r|d| 
+ |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| @20
+ |l|i|n|e| |t|h|r|e@1| @29
+ |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| 
|w|o|r|d| 
+ |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| @10
+ >l|i|n|e| @35
+ |l|i|n|e| @35
+ |l|i|n|e| @35
+ |~+0#4040ff13&| @38
+ |~| @38
+ |~| @38
+ | +0#0000000&@21|5|,|1| @10|B|o|t| 
*** ../vim-9.0.0639/src/testdir/dumps/Test_smoothscroll_3.dump  2022-10-02 
21:28:20.112302620 +0100
--- src/testdir/dumps/Test_smoothscroll_3.dump  2022-10-02 21:11:02.169136933 
+0100
***************
*** 0 ****
--- 1,12 ----
+ |w+0&#ffffff0|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| @20
+ |l|i|n|e| |t|h|r|e@1| @29
+ |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| 
|w|o|r|d| 
+ |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| @10
+ >l|i|n|e| @35
+ |l|i|n|e| @35
+ |l|i|n|e| @35
+ |~+0#4040ff13&| @38
+ |~| @38
+ |~| @38
+ |~| @38
+ | +0#0000000&@21|5|,|1| @10|B|o|t| 
*** ../vim-9.0.0639/src/testdir/dumps/Test_smoothscroll_4.dump  2022-10-02 
21:28:20.116302603 +0100
--- src/testdir/dumps/Test_smoothscroll_4.dump  2022-10-02 21:11:03.325116546 
+0100
***************
*** 0 ****
--- 1,12 ----
+ |l+0&#ffffff0|i|n|e| |t|h|r|e@1| @29
+ |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| 
|w|o|r|d| 
+ |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| @10
+ |l|i|n|e| @35
+ |l|i|n|e| @35
+ >l|i|n|e| @35
+ |~+0#4040ff13&| @38
+ |~| @38
+ |~| @38
+ |~| @38
+ |~| @38
+ | +0#0000000&@21|7|,|1| @10|B|o|t| 
*** ../vim-9.0.0639/src/testdir/dumps/Test_smoothscroll_5.dump  2022-10-02 
21:28:20.120302590 +0100
--- src/testdir/dumps/Test_smoothscroll_5.dump  2022-10-02 21:11:04.477096269 
+0100
***************
*** 0 ****
--- 1,12 ----
+ |w+0&#ffffff0|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| @20
+ |l|i|n|e| |t|h|r|e@1| @29
+ |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| 
|w|o|r|d| 
+ |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| @10
+ |l|i|n|e| @35
+ |l|i|n|e| @35
+ >l|i|n|e| @35
+ |~+0#4040ff13&| @38
+ |~| @38
+ |~| @38
+ |~| @38
+ | +0#0000000&@21|7|,|1| @10|B|o|t| 
*** ../vim-9.0.0639/src/testdir/dumps/Test_smoothscroll_6.dump  2022-10-02 
21:28:20.124302573 +0100
--- src/testdir/dumps/Test_smoothscroll_6.dump  2022-10-02 21:11:05.629076032 
+0100
***************
*** 0 ****
--- 1,12 ----
+ |w+0&#ffffff0|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| 
|w|o|r|d| |w|o|r|d| 
+ |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| @20
+ |l|i|n|e| |t|h|r|e@1| @29
+ |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| 
|w|o|r|d| 
+ |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| @10
+ |l|i|n|e| @35
+ |l|i|n|e| @35
+ >l|i|n|e| @35
+ |~+0#4040ff13&| @38
+ |~| @38
+ |~| @38
+ | +0#0000000&@21|7|,|1| @10|B|o|t| 
*** ../vim-9.0.0639/src/testdir/dumps/Test_smoothscroll_7.dump  2022-10-02 
21:28:20.128302560 +0100
--- src/testdir/dumps/Test_smoothscroll_7.dump  2022-10-02 21:11:06.785055767 
+0100
***************
*** 0 ****
--- 1,12 ----
+ |w+0&#ffffff0|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| 
|w|o|r|d| |w|o|r|d| 
+ |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| 
|w|o|r|d| 
+ |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| @20
+ |l|i|n|e| |t|h|r|e@1| @29
+ |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| 
|w|o|r|d| 
+ |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| @10
+ |l|i|n|e| @35
+ |l|i|n|e| @35
+ >l|i|n|e| @35
+ |~+0#4040ff13&| @38
+ |~| @38
+ | +0#0000000&@21|7|,|1| @10|B|o|t| 
*** ../vim-9.0.0639/src/testdir/dumps/Test_smoothscroll_8.dump  2022-10-02 
21:28:20.132302543 +0100
--- src/testdir/dumps/Test_smoothscroll_8.dump  2022-10-02 21:11:07.937035610 
+0100
***************
*** 0 ****
--- 1,12 ----
+ |l+0&#ffffff0|i|n|e| |o|n|e| @31
+ |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| 
|w|o|r|d| 
+ |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| 
|w|o|r|d| 
+ |w|o|r|d| |w|o|r|d| |w|o|r|d| |w|o|r|d| @20
+ |l|i|n|e| |t|h|r|e@1| @29
+ |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| 
|w|o|r|d| 
+ |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| |l|o|n|g| |w|o|r|d| @10
+ |l|i|n|e| @35
+ |l|i|n|e| @35
+ >l|i|n|e| @35
+ |~+0#4040ff13&| @38
+ | +0#0000000&@21|7|,|1| @10|A|l@1| 
*** ../vim-9.0.0639/src/version.c       2022-10-02 15:18:30.541075996 +0100
--- src/version.c       2022-10-02 21:16:56.156462131 +0100
***************
*** 701,702 ****
--- 701,704 ----
  {   /* Add new patch number below this line */
+ /**/
+     640,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
245. You use Real Audio to listen to a radio station from a distant
     city rather than turn on your stereo system.

 /// 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/20221002203055.B681B1C09A3%40moolenaar.net.

Raspunde prin e-mail lui