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 -- Br...@Moolenaar.net --
http://www.Moolenaar.net \\\
/// \\\
\\\ sponsor Vim, vote for features --
http://www.Vim.org/sponsor/ ///
\\\ help me help AIDS victims --
http://ICCF-Holland.org ///