To: vim_dev@googlegroups.com Subject: Patch 9.0.0647 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ [Note: if you have been using 'nosplitscroll' you need to change that to set 'splitkeep' to "screen"] Patch 9.0.0647 Problem: The 'splitscroll' option is not a good name. Solution: Rename 'splitscroll' to 'splitkeep' and make it a string option, also supporting "topline". (Luuk van Baal, closes #11258) Files: runtime/doc/options.txt, runtime/doc/quickref.txt, runtime/optwin.vim, src/globals.h, src/move.c, src/option.h, src/optiondefs.h, src/optionstr.c, src/structs.h, src/window.c src/testdir/gen_opt_test.vim, src/testdir/test_window_cmd.vim, src/testdir/dumps/Test_nosplitscroll_callback_1.dump, src/testdir/dumps/Test_nosplitscroll_callback_2.dump, src/testdir/dumps/Test_nosplitscroll_callback_3.dump, src/testdir/dumps/Test_nosplitscroll_callback_4.dump, src/testdir/dumps/Test_splitkeep_callback_1.dump, src/testdir/dumps/Test_splitkeep_callback_2.dump, src/testdir/dumps/Test_splitkeep_callback_3.dump, src/testdir/dumps/Test_splitkeep_callback_4.dump, src/testdir/dumps/Test_nosplitscroll_fold_1.dump, src/testdir/dumps/Test_nosplitscroll_fold_2.dump, src/testdir/dumps/Test_nosplitscroll_fold_3.dump, src/testdir/dumps/Test_nosplitscroll_fold_4.dump, src/testdir/dumps/Test_splitkeep_fold_1.dump, src/testdir/dumps/Test_splitkeep_fold_2.dump, src/testdir/dumps/Test_splitkeep_fold_3.dump, src/testdir/dumps/Test_splitkeep_fold_4.dump *** ../vim-9.0.0646/runtime/doc/options.txt 2022-10-02 21:29:18.412089556 +0100 --- runtime/doc/options.txt 2022-10-03 15:03:41.332341511 +0100 *************** *** 7488,7511 **** When on, splitting a window will put the new window below the current one. |:split| *'splitright'* *'spr'* *'nosplitright'* *'nospr'* 'splitright' 'spr' boolean (default off) global When on, splitting a window will put the new window right of the current one. |:vsplit| - *'splitscroll'* *'spsc'* *'nosplitscroll'* *'nospsc'* - 'splitscroll' 'spsc' boolean (default on) - global - The value of this option determines the scroll behavior when opening, - closing or resizing horizontal splits. When "on", splitting a window - horizontally will keep the same relative cursor position in the old and - new window, as well windows that are resized. When "off", scrolling - will be avoided to stabilize the window content. Instead, the cursor - position will be changed when necessary. In this case, the jumplist - will be populated with the previous cursor position. Scrolling cannot - be guaranteed to be avoided when 'wrap' is enabled. - *'startofline'* *'sol'* *'nostartofline'* *'nosol'* 'startofline' 'sol' boolean (default on) global --- 7518,7545 ---- When on, splitting a window will put the new window below the current one. |:split| + *'splitkeep'* *'spk' + 'splitkeep' 'spk' string (default "cursor") + global + The value of this option determines the scroll behavior when opening, + closing or resizing horizontal splits. + + Possible values are: + cursor Keep the same relative cursor position. + screen Keep the text on the same screen line. + topline Keep the topline the same. + + For the "screen" and "topline" values, the cursor position will be + changed when necessary. In this case, the jumplist will be populated + with the previous cursor position. For "screen", the text cannot always + be kept on the same screen line when 'wrap' is enabled. + *'splitright'* *'spr'* *'nosplitright'* *'nospr'* 'splitright' 'spr' boolean (default off) global When on, splitting a window will put the new window right of the current one. |:vsplit| *'startofline'* *'sol'* *'nostartofline'* *'nosol'* 'startofline' 'sol' boolean (default on) global *** ../vim-9.0.0646/runtime/doc/quickref.txt 2022-10-02 21:29:18.412089556 +0100 --- runtime/doc/quickref.txt 2022-10-03 15:03:41.332341511 +0100 *************** *** 919,926 **** 'spelloptions' 'spo' options for spell checking '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 --- 919,926 ---- 'spelloptions' 'spo' options for spell checking 'spellsuggest' 'sps' method(s) used to suggest spelling corrections 'splitbelow' 'sb' new window from split is below the current one + 'splitkeep' 'spk' determines scroll behavior for split windows 'splitright' 'spr' new window is put right of the current one '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.0646/runtime/optwin.vim 2022-10-02 21:29:18.412089556 +0100 --- runtime/optwin.vim 2022-10-03 15:03:41.332341511 +0100 *************** *** 516,525 **** call OptionG("swb", &swb) call AddOption("splitbelow", gettext("a new window is put below the current one")) call BinOptionG("sb", &sb) call AddOption("splitright", gettext("a new window is put right of the current one")) call BinOptionG("spr", &spr) - call AddOption("splitscroll", gettext("determines scroll behavior for split windows")) - call BinOptionG("spsc", &spsc) call AddOption("scrollbind", gettext("this window scrolls together with other bound windows")) call append("$", "\t" .. s:local_to_window) call BinOptionL("scb") --- 516,525 ---- call OptionG("swb", &swb) call AddOption("splitbelow", gettext("a new window is put below the current one")) call BinOptionG("sb", &sb) + call AddOption("splitkeep", gettext("determines scroll behavior for split windows")) + call BinOptionG("spk", &spk) call AddOption("splitright", gettext("a new window is put right of the current one")) call BinOptionG("spr", &spr) call AddOption("scrollbind", gettext("this window scrolls together with other bound windows")) call append("$", "\t" .. s:local_to_window) call BinOptionL("scb") *** ../vim-9.0.0646/src/globals.h 2022-09-29 19:14:37.675876694 +0100 --- src/globals.h 2022-10-03 15:03:41.332341511 +0100 *************** *** 1975,1984 **** EXTERN optmagic_T magic_overruled INIT(= OPTION_MAGIC_NOT_SET); #ifdef FEAT_CMDWIN ! // Skip win_fix_cursor() call for 'nosplitscroll' when cmdwin is closed. EXTERN int skip_win_fix_cursor INIT(= FALSE); #endif ! // Skip win_fix_scroll() call for 'nosplitscroll' when closing tab page. EXTERN int skip_win_fix_scroll INIT(= FALSE); // Skip update_topline() call while executing win_fix_scroll(). EXTERN int skip_update_topline INIT(= FALSE); --- 1975,1984 ---- EXTERN optmagic_T magic_overruled INIT(= OPTION_MAGIC_NOT_SET); #ifdef FEAT_CMDWIN ! // Skip win_fix_cursor() call for 'splitkeep' when cmdwin is closed. EXTERN int skip_win_fix_cursor INIT(= FALSE); #endif ! // Skip win_fix_scroll() call for 'splitkeep' when closing tab page. EXTERN int skip_win_fix_scroll INIT(= FALSE); // Skip update_topline() call while executing win_fix_scroll(). EXTERN int skip_update_topline INIT(= FALSE); *** ../vim-9.0.0646/src/move.c 2022-10-03 14:05:58.706085741 +0100 --- src/move.c 2022-10-03 15:03:41.332341511 +0100 *************** *** 219,224 **** --- 219,228 ---- long *so_ptr = curwin->w_p_so >= 0 ? &curwin->w_p_so : &p_so; int save_so = *so_ptr; + // Cursor is updated instead when this is TRUE for 'splitkeep'. + if (skip_update_topline) + return; + // If there is no valid screen and when the window height is zero just use // the cursor line. if (!screen_valid(TRUE) || curwin->w_height == 0) *************** *** 1027,1034 **** /* * First make sure that w_topline is valid (after moving the cursor). */ ! if (!skip_update_topline) ! update_topline(); /* * Next make sure that w_cline_row is valid. --- 1031,1037 ---- /* * First make sure that w_topline is valid (after moving the cursor). */ ! update_topline(); /* * Next make sure that w_cline_row is valid. *** ../vim-9.0.0646/src/option.h 2022-10-02 21:46:54.603145385 +0100 --- src/option.h 2022-10-03 15:03:41.332341511 +0100 *************** *** 924,934 **** EXTERN char_u *p_sps; // 'spellsuggest' #endif EXTERN int p_spr; // 'splitright' - EXTERN int p_spsc; // 'splitscroll' EXTERN int p_sol; // 'startofline' EXTERN char_u *p_su; // 'suffixes' EXTERN char_u *p_sws; // 'swapsync' EXTERN char_u *p_swb; // 'switchbuf' EXTERN unsigned swb_flags; // Keep in sync with p_swb_values in optionstr.c #define SWB_USEOPEN 0x001 --- 924,934 ---- EXTERN char_u *p_sps; // 'spellsuggest' #endif EXTERN int p_spr; // 'splitright' EXTERN int p_sol; // 'startofline' EXTERN char_u *p_su; // 'suffixes' EXTERN char_u *p_sws; // 'swapsync' EXTERN char_u *p_swb; // 'switchbuf' + EXTERN char_u *p_spk; // 'splitkeep' EXTERN unsigned swb_flags; // Keep in sync with p_swb_values in optionstr.c #define SWB_USEOPEN 0x001 *** ../vim-9.0.0646/src/optiondefs.h 2022-10-02 21:29:18.412089556 +0100 --- src/optiondefs.h 2022-10-03 15:19:20.999902786 +0100 *************** *** 2350,2361 **** {"splitbelow", "sb", P_BOOL|P_VI_DEF, (char_u *)&p_sb, PV_NONE, {(char_u *)FALSE, (char_u *)0L} SCTX_INIT}, {"splitright", "spr", P_BOOL|P_VI_DEF, (char_u *)&p_spr, PV_NONE, {(char_u *)FALSE, (char_u *)0L} SCTX_INIT}, - {"splitscroll", "spsc", P_BOOL, - (char_u *)&p_spsc, PV_NONE, - {(char_u *)TRUE, (char_u *)TRUE} SCTX_INIT}, {"startofline", "sol", P_BOOL|P_VI_DEF|P_VIM, (char_u *)&p_sol, PV_NONE, {(char_u *)TRUE, (char_u *)0L} SCTX_INIT}, --- 2350,2361 ---- {"splitbelow", "sb", P_BOOL|P_VI_DEF, (char_u *)&p_sb, PV_NONE, {(char_u *)FALSE, (char_u *)0L} SCTX_INIT}, + {"splitkeep", "spk", P_STRING, + (char_u *)&p_spk, PV_NONE, + {(char_u *)"cursor", (char_u *)"cursor"} SCTX_INIT}, {"splitright", "spr", P_BOOL|P_VI_DEF, (char_u *)&p_spr, PV_NONE, {(char_u *)FALSE, (char_u *)0L} SCTX_INIT}, {"startofline", "sol", P_BOOL|P_VI_DEF|P_VIM, (char_u *)&p_sol, PV_NONE, {(char_u *)TRUE, (char_u *)0L} SCTX_INIT}, *** ../vim-9.0.0646/src/optionstr.c 2022-08-25 16:02:09.681816465 +0100 --- src/optionstr.c 2022-10-03 15:03:41.332341511 +0100 *************** *** 46,51 **** --- 46,52 ---- #endif // Keep in sync with SWB_ flags in option.h static char *(p_swb_values[]) = {"useopen", "usetab", "split", "newtab", "vsplit", "uselast", NULL}; + static char *(p_spk_values[]) = {"cursor", "screen", "topline", NULL}; static char *(p_tc_values[]) = {"followic", "ignore", "match", "followscs", "smart", NULL}; #if defined(FEAT_TOOLBAR) && !defined(FEAT_GUI_MSWIN) static char *(p_toolbar_values[]) = {"text", "icons", "tooltips", "horiz", NULL}; *************** *** 1683,1688 **** --- 1684,1696 ---- errmsg = e_invalid_argument; } + // 'splitkeep' + else if (varp == &p_spk) + { + if (check_opt_strings(p_spk, p_spk_values, FALSE) != OK) + errmsg = e_invalid_argument; + } + // 'debug' else if (varp == &p_debug) { *************** *** 1722,1728 **** int is_spellfile = varp == &(curwin->w_s->b_p_spf); if ((is_spellfile && !valid_spellfile(*varp)) ! || (!is_spellfile && !valid_spelllang(*varp))) errmsg = e_invalid_argument; else errmsg = did_set_spell_option(is_spellfile); --- 1730,1736 ---- int is_spellfile = varp == &(curwin->w_s->b_p_spf); if ((is_spellfile && !valid_spellfile(*varp)) ! || (!is_spellfile && !valid_spelllang(*varp))) errmsg = e_invalid_argument; else errmsg = did_set_spell_option(is_spellfile); *** ../vim-9.0.0646/src/structs.h 2022-10-02 21:29:18.412089556 +0100 --- src/structs.h 2022-10-03 15:03:41.332341511 +0100 *************** *** 3621,3628 **** int w_winrow; // first row of window in screen int w_height; // number of rows in window, excluding // status/command/winbar line(s) ! int w_prev_winrow; // previous winrow used for 'splitscroll' ! int w_prev_height; // previous height used for 'splitscroll' int w_status_height; // number of status lines (0 or 1) int w_wincol; // Leftmost column of window in screen. --- 3621,3628 ---- int w_winrow; // first row of window in screen int w_height; // number of rows in window, excluding // status/command/winbar line(s) ! int w_prev_winrow; // previous winrow used for 'splitkeep' ! int w_prev_height; // previous height used for 'splitkeep' int w_status_height; // number of status lines (0 or 1) int w_wincol; // Leftmost column of window in screen. *** ../vim-9.0.0646/src/window.c 2022-09-29 13:50:04.715222469 +0100 --- src/window.c 2022-10-03 15:21:47.731290018 +0100 *************** *** 1325,1331 **** win_equal(wp, TRUE, (flags & WSP_VERT) ? (dir == 'v' ? 'b' : 'h') : dir == 'h' ? 'b' : 'v'); ! else if (!p_spsc && wp != aucmd_win) win_fix_scroll(FALSE); // Don't change the window height/width to 'winheight' / 'winwidth' if a --- 1325,1331 ---- win_equal(wp, TRUE, (flags & WSP_VERT) ? (dir == 'v' ? 'b' : 'h') : dir == 'h' ? 'b' : 'v'); ! else if (*p_spk != 'c' && wp != aucmd_win) win_fix_scroll(FALSE); // Don't change the window height/width to 'winheight' / 'winwidth' if a *************** *** 1411,1417 **** newp->w_prevdir = (oldp->w_prevdir == NULL) ? NULL : vim_strsave(oldp->w_prevdir); ! if (!p_spsc) { newp->w_botline = oldp->w_botline; newp->w_prev_height = oldp->w_height - WINBAR_HEIGHT(oldp); --- 1411,1417 ---- newp->w_prevdir = (oldp->w_prevdir == NULL) ? NULL : vim_strsave(oldp->w_prevdir); ! if (*p_spk != 'c') { newp->w_botline = oldp->w_botline; newp->w_prev_height = oldp->w_height - WINBAR_HEIGHT(oldp); *************** *** 1925,1931 **** win_equal_rec(next_curwin == NULL ? curwin : next_curwin, current, topframe, dir, 0, tabline_height(), (int)Columns, topframe->fr_height); ! if (!p_spsc && next_curwin != aucmd_win) win_fix_scroll(TRUE); } --- 1925,1931 ---- win_equal_rec(next_curwin == NULL ? curwin : next_curwin, current, topframe, dir, 0, tabline_height(), (int)Columns, topframe->fr_height); ! if (*p_spk != 'c' && next_curwin != aucmd_win) win_fix_scroll(TRUE); } *************** *** 2733,2739 **** else { win_comp_pos(); ! if (!p_spsc) win_fix_scroll(FALSE); } if (close_curwin) --- 2733,2739 ---- else { win_comp_pos(); ! if (*p_spk != 'c') win_fix_scroll(FALSE); } if (close_curwin) *************** *** 4931,4937 **** // Might need to scroll the old window before switching, e.g., when the // cursor was moved. ! if (p_spsc) update_topline(); // may have to copy the buffer options when 'cpo' contains 'S' --- 4931,4937 ---- // Might need to scroll the old window before switching, e.g., when the // cursor was moved. ! if (*p_spk == 'c') update_topline(); // may have to copy the buffer options when 'cpo' contains 'S' *************** *** 4947,4953 **** check_cursor(); if (!virtual_active()) curwin->w_cursor.coladd = 0; ! if (p_spsc) // assume cursor position needs updating. changed_line_abv_curs(); else win_fix_cursor(TRUE); --- 4947,4953 ---- check_cursor(); if (!virtual_active()) curwin->w_cursor.coladd = 0; ! if (*p_spk == 'c') // assume cursor position needs updating changed_line_abv_curs(); else win_fix_cursor(TRUE); *************** *** 5068,5074 **** * FALSE. */ static win_T * ! win_alloc(win_T *after UNUSED, int hidden UNUSED) { win_T *new_wp; --- 5068,5074 ---- * FALSE. */ static win_T * ! win_alloc(win_T *after, int hidden) { win_T *new_wp; *************** *** 5480,5486 **** compute_cmdrow(); curtab->tp_ch_used = p_ch; ! if (!p_spsc && !skip_win_fix_scroll) win_fix_scroll(TRUE); #if 0 --- 5480,5486 ---- compute_cmdrow(); curtab->tp_ch_used = p_ch; ! if (*p_spk != 'c' && !skip_win_fix_scroll) win_fix_scroll(TRUE); #if 0 *************** *** 5687,5693 **** msg_row = row; msg_col = 0; ! if (!p_spsc) win_fix_scroll(TRUE); redraw_all_later(UPD_NOT_VALID); --- 5687,5693 ---- msg_row = row; msg_col = 0; ! if (*p_spk != 'c') win_fix_scroll(TRUE); redraw_all_later(UPD_NOT_VALID); *************** *** 6218,6224 **** p_ch = MAX(Rows - cmdline_row, 1); curtab->tp_ch_used = p_ch; ! if (!p_spsc) win_fix_scroll(TRUE); redraw_all_later(UPD_SOME_VALID); --- 6218,6224 ---- p_ch = MAX(Rows - cmdline_row, 1); curtab->tp_ch_used = p_ch; ! if (*p_spk != 'c') win_fix_scroll(TRUE); redraw_all_later(UPD_SOME_VALID); *************** *** 6348,6354 **** } /* ! * Handle scroll position for 'nosplitscroll'. Replaces scroll_to_fraction() * call from win_new_height(). Instead we iterate over all windows in a * tabpage and calculate the new scroll position. * TODO: Ensure this also works with wrapped lines. --- 6348,6354 ---- } /* ! * Handle scroll position for 'splitkeep'. Replaces scroll_to_fraction() * call from win_new_height(). Instead we iterate over all windows in a * tabpage and calculate the new scroll position. * TODO: Ensure this also works with wrapped lines. *************** *** 6362,6375 **** win_T *wp; linenr_T lnum; ! skip_update_topline = TRUE; // avoid scrolling in curs_columns() FOR_ALL_WINDOWS(wp) { // Skip when window height has not changed. if (wp->w_height != wp->w_prev_height) { // If window has moved update botline to keep the same screenlines. ! if (wp->w_winrow != wp->w_prev_winrow) { lnum = wp->w_cursor.lnum; diff = (wp->w_winrow - wp->w_prev_winrow) --- 6362,6375 ---- win_T *wp; linenr_T lnum; ! skip_update_topline = TRUE; FOR_ALL_WINDOWS(wp) { // Skip when window height has not changed. if (wp->w_height != wp->w_prev_height) { // If window has moved update botline to keep the same screenlines. ! if (*p_spk == 's' && wp->w_winrow != wp->w_prev_winrow) { lnum = wp->w_cursor.lnum; diff = (wp->w_winrow - wp->w_prev_winrow) *************** *** 6403,6409 **** } /* ! * Make sure the cursor position is valid for 'nosplitscroll'. * If it is not, put the cursor position in the jumplist and move it. * If we are not in normal mode, scroll to make valid instead. */ --- 6403,6409 ---- } /* ! * Make sure the cursor position is valid for 'splitkeep'. * If it is not, put the cursor position in the jumplist and move it. * If we are not in normal mode, scroll to make valid instead. */ *************** *** 6413,6421 **** long so = get_scrolloff_value(); win_T *wp = curwin; linenr_T nlnum = 0; ! linenr_T lnum = wp->w_cursor.lnum; ! linenr_T bot; ! linenr_T top; if (wp->w_buffer->b_ml.ml_line_count < wp->w_height) return; --- 6413,6421 ---- long so = get_scrolloff_value(); win_T *wp = curwin; linenr_T nlnum = 0; ! linenr_T lnum = wp->w_cursor.lnum; ! linenr_T bot; ! linenr_T top; if (wp->w_buffer->b_ml.ml_line_count < wp->w_height) return; *************** *** 6429,6453 **** top = cursor_down_inner(wp, so); wp->w_cursor.lnum = wp->w_botline - 1; bot = cursor_up_inner(wp, so); // Check if cursor position is above or below valid cursor range. if (lnum > bot && (wp->w_botline - wp->w_buffer->b_ml.ml_line_count) != 1) nlnum = bot; else if (lnum < top && wp->w_topline != 1) nlnum = (so == wp->w_height / 2) ? bot : top; - wp->w_cursor.lnum = lnum; - if (nlnum) // Cursor is invalid for current scroll position. { if (normal) // Save to jumplist and set cursor to avoid scrolling. { setmark('\''); wp->w_cursor.lnum = nlnum; - curs_columns(TRUE); // validate w_wrow } else // Scroll instead when not in normal mode. { ! wp->w_fraction = 0.5 * FRACTION_MULT; scroll_to_fraction(wp, wp->w_prev_height); validate_botline_win(curwin); } --- 6429,6451 ---- top = cursor_down_inner(wp, so); wp->w_cursor.lnum = wp->w_botline - 1; bot = cursor_up_inner(wp, so); + wp->w_cursor.lnum = lnum; // Check if cursor position is above or below valid cursor range. if (lnum > bot && (wp->w_botline - wp->w_buffer->b_ml.ml_line_count) != 1) nlnum = bot; else if (lnum < top && wp->w_topline != 1) nlnum = (so == wp->w_height / 2) ? bot : top; if (nlnum) // Cursor is invalid for current scroll position. { if (normal) // Save to jumplist and set cursor to avoid scrolling. { setmark('\''); wp->w_cursor.lnum = nlnum; } else // Scroll instead when not in normal mode. { ! wp->w_fraction = (nlnum == bot) ? FRACTION_MULT : 0; scroll_to_fraction(wp, wp->w_prev_height); validate_botline_win(curwin); } *************** *** 6474,6480 **** if (wp->w_height > 0) { ! if (wp == curwin && p_spsc) // w_wrow needs to be valid. When setting 'laststatus' this may // call win_new_height() recursively. validate_cursor(); --- 6472,6478 ---- if (wp->w_height > 0) { ! if (wp == curwin && *p_spk == 'c') // w_wrow needs to be valid. When setting 'laststatus' this may // call win_new_height() recursively. validate_cursor(); *************** *** 6490,6496 **** // There is no point in adjusting the scroll position when exiting. Some // values might be invalid. ! if (!exiting && p_spsc) scroll_to_fraction(wp, prev_height); } --- 6488,6494 ---- // There is no point in adjusting the scroll position when exiting. Some // values might be invalid. ! if (!exiting && *p_spk == 'c') scroll_to_fraction(wp, prev_height); } *************** *** 6604,6610 **** if (wp == curwin) { ! if (p_spsc && get_scrolloff_value()) update_topline(); curs_columns(FALSE); // validate w_wrow } --- 6602,6608 ---- if (wp == curwin) { ! if (get_scrolloff_value()) update_topline(); curs_columns(FALSE); // validate w_wrow } *************** *** 6627,6641 **** wp->w_width = width < 0 ? 0 : width; wp->w_lines_valid = 0; changed_line_abv_curs_win(wp); ! // Handled in win_fix_scroll() ! if (p_spsc) { ! invalidate_botline_win(wp); ! if (wp == curwin) ! { ! update_topline(); ! curs_columns(TRUE); // validate w_wrow ! } } redraw_win_later(wp, UPD_NOT_VALID); wp->w_redr_status = TRUE; --- 6625,6637 ---- wp->w_width = width < 0 ? 0 : width; wp->w_lines_valid = 0; changed_line_abv_curs_win(wp); ! invalidate_botline_win(wp); ! if (wp == curwin) { ! skip_update_topline = (*p_spk != 'c'); ! update_topline(); ! curs_columns(TRUE); // validate w_wrow ! skip_update_topline = FALSE; } redraw_win_later(wp, UPD_NOT_VALID); wp->w_redr_status = TRUE; *** ../vim-9.0.0646/src/testdir/gen_opt_test.vim 2022-08-31 14:46:07.915016883 +0100 --- src/testdir/gen_opt_test.vim 2022-10-03 15:03:41.336341488 +0100 *************** *** 134,139 **** --- 134,140 ---- \ 'spelllang': [['', 'xxx', 'sr@latin'], ['not&lang', "that\\\rthere"]], \ 'spelloptions': [['', 'camel'], ['xxx']], \ 'spellsuggest': [['', 'best', 'double,33'], ['xxx']], + \ 'splitkeep': [['cursor', 'screen', 'topline'], ['xxx']], \ 'switchbuf': [['', 'useopen', 'split,newtab'], ['xxx']], \ 'tagcase': [['smart', 'match'], ['', 'xxx', 'smart,match']], \ 'term': [[], []], *** ../vim-9.0.0646/src/testdir/test_window_cmd.vim 2022-09-27 12:30:53.222180148 +0100 --- src/testdir/test_window_cmd.vim 2022-10-03 15:12:47.537614377 +0100 *************** *** 1632,1662 **** set laststatus& endfunc ! " Ensure no scrolling happens with 'nosplitscroll' for a sequence of " split operations for various options: with and without a winbar, " tabline, for each possible value of 'laststatus', 'scrolloff', ! " 'equalalways', and regardless of the cursor position. ! func Test_nosplitscroll_options() ! set nowrap ! set nosplitscroll ! " disallow window resizing let save_WS = &t_WS set t_WS= let gui = has("gui_running") inoremap c "copenwincmd k" ! for run in range(0, 10) ! tabnew | tabonly! | redraw ! let tabline = (gui ? 0 : ((run % 5) ? 1 : 0)) ! let winbar_sb = (run % 2) && (run % 3) ! execute 'set scrolloff=' . (!(run % 4) ? 0 : run) ! execute 'set laststatus=' . (run % 3) ! execute 'set ' . ((run % 2) ? 'equalalways' : 'noequalalways') ! execute 'set ' . ((run % 3) ? 'splitbelow' : 'nosplitbelow') execute (run % 5) ? 'tabnew' : '' execute (run % 2) ? 'nnoremenu 1.10 WinBar.Test :echo' : '' - let pos = !(run % 3) ? 'H' : ((run % 2) ? 'M' : 'L') call setline(1, range(1, 256)) " No scroll for restore_snapshot norm G --- 1632,1660 ---- set laststatus& endfunc ! " Test "screen" and "cursor" values for 'splitkeep' with a sequence of " split operations for various options: with and without a winbar, " tabline, for each possible value of 'laststatus', 'scrolloff', ! " 'equalalways', and with the cursor at the top, middle and bottom. ! func Test_splitkeep_options() " disallow window resizing let save_WS = &t_WS set t_WS= let gui = has("gui_running") inoremap c "copenwincmd k" ! for run in range(0, 20) ! let &splitkeep = run > 10 ? 'topline' : 'screen' ! let &scrolloff = (!(run % 4) ? 0 : run) ! let &laststatus = (run % 3) ! let &splitbelow = (run % 3) ! let &equalalways = (run % 2) ! let wsb = (run % 2) && &splitbelow ! let tl = (gui ? 0 : ((run % 5) ? 1 : 0)) ! let pos = !(run % 3) ? 'H' : ((run % 2) ? 'M' : 'L') ! tabnew | tabonly! | redraw execute (run % 5) ? 'tabnew' : '' execute (run % 2) ? 'nnoremenu 1.10 WinBar.Test :echo' : '' call setline(1, range(1, 256)) " No scroll for restore_snapshot norm G *************** *** 1672,1688 **** call assert_equal(1, line("w0")) call assert_equal(&scroll, winheight(0) / 2) wincmd j ! call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0")) " No scroll when resizing windows ! wincmd k | resize +2 call assert_equal(1, line("w0")) wincmd j ! call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0")) " No scroll when dragging statusline call win_move_statusline(1, -3) ! call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0")) wincmd k call assert_equal(1, line("w0")) --- 1670,1686 ---- call assert_equal(1, line("w0")) call assert_equal(&scroll, winheight(0) / 2) wincmd j ! call assert_equal(&spk == 'topline' ? 1 : win_screenpos(0)[0] - tl - wsb, line("w0")) " No scroll when resizing windows ! wincmd k | resize +2 | redraw call assert_equal(1, line("w0")) wincmd j ! call assert_equal(&spk == 'topline' ? 1 : win_screenpos(0)[0] - tl - wsb, line("w0")) " No scroll when dragging statusline call win_move_statusline(1, -3) ! call assert_equal(&spk == 'topline' ? 1 : win_screenpos(0)[0] - tl - wsb, line("w0")) wincmd k call assert_equal(1, line("w0")) *************** *** 1690,1698 **** set lines+=2 call assert_equal(1, line("w0")) wincmd j ! call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0")) set lines-=2 ! call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0")) wincmd k call assert_equal(1, line("w0")) --- 1688,1696 ---- set lines+=2 call assert_equal(1, line("w0")) wincmd j ! call assert_equal(&spk == 'topline' ? 1 : win_screenpos(0)[0] - tl - wsb, line("w0")) set lines-=2 ! call assert_equal(&spk == 'topline' ? 1 : win_screenpos(0)[0] - tl - wsb, line("w0")) wincmd k call assert_equal(1, line("w0")) *************** *** 1700,1722 **** wincmd = call assert_equal(1, line("w0")) wincmd j ! call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0")) wincmd k call assert_equal(1, line("w0")) " No scroll in windows split multiple times vsplit | split | 4wincmd w ! call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0")) 1wincmd w | quit | wincmd l | split ! call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0")) wincmd j ! call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0")) " No scroll in small window 2wincmd w | only | 5split | wincmd k call assert_equal(1, line("w0")) wincmd j ! call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0")) " No scroll for vertical split quit | vsplit | wincmd l --- 1698,1720 ---- wincmd = call assert_equal(1, line("w0")) wincmd j ! call assert_equal(&spk == 'topline' ? 1 : win_screenpos(0)[0] - tl - wsb, line("w0")) wincmd k call assert_equal(1, line("w0")) " No scroll in windows split multiple times vsplit | split | 4wincmd w ! call assert_equal(&spk == 'topline' ? 1 : win_screenpos(0)[0] - tl - wsb, line("w0")) 1wincmd w | quit | wincmd l | split ! call assert_equal(&spk == 'topline' ? 1 : win_screenpos(0)[0] - tl - wsb, line("w0")) wincmd j ! call assert_equal(&spk == 'topline' ? 1 : win_screenpos(0)[0] - tl - wsb, line("w0")) " No scroll in small window 2wincmd w | only | 5split | wincmd k call assert_equal(1, line("w0")) wincmd j ! call assert_equal(&spk == 'topline' ? 1 : win_screenpos(0)[0] - tl - wsb, line("w0")) " No scroll for vertical split quit | vsplit | wincmd l *************** *** 1725,1732 **** call assert_equal(1, line("w0")) " No scroll in windows split and quit multiple times ! quit | redraw | split | redraw | split | redraw | quit | redraw ! call assert_equal(win_screenpos(0)[0] - tabline - winbar_sb, line("w0")) " No scroll for new buffer 1wincmd w | only | copen | wincmd k --- 1723,1730 ---- call assert_equal(1, line("w0")) " No scroll in windows split and quit multiple times ! quit | redraw | split | split | quit | redraw ! call assert_equal(&spk == 'topline' ? 1 : win_screenpos(0)[0] - tl - wsb, line("w0")) " No scroll for new buffer 1wincmd w | only | copen | wincmd k *************** *** 1734,1740 **** only call assert_equal(1, line("w0")) above copen | wincmd j ! call assert_equal(win_screenpos(0)[0] - tabline, line("w0")) " No scroll when opening cmdwin, and no cursor move when closing cmdwin. only | norm ggL --- 1732,1738 ---- only call assert_equal(1, line("w0")) above copen | wincmd j ! call assert_equal(&spk == 'topline' ? 1 : win_screenpos(0)[0] - tl, line("w0")) " No scroll when opening cmdwin, and no cursor move when closing cmdwin. only | norm ggL *************** *** 1751,1772 **** only | execute "norm gg5\" | split | wincmd k call assert_equal(6, line("w0")) wincmd j ! call assert_equal(5 + win_screenpos(0)[0] - tabline - winbar_sb, line("w0")) endfor tabnew | tabonly! | %bwipeout! iunmap c - set wrap& set scrolloff& set splitbelow& set laststatus& set equalalways& ! set splitscroll& let &t_WS = save_WS endfunc ! function Test_nosplitscroll_cmdwin_cursor_position() ! set nosplitscroll call setline(1, range(&lines)) " No scroll when cursor is at near bottom of window and cusor position --- 1749,1769 ---- only | execute "norm gg5\" | split | wincmd k call assert_equal(6, line("w0")) wincmd j ! call assert_equal(&spk == 'topline' ? 6 : 5 + win_screenpos(0)[0] - tl - wsb, line("w0")) endfor tabnew | tabonly! | %bwipeout! iunmap c set scrolloff& set splitbelow& set laststatus& set equalalways& ! set splitkeep& let &t_WS = save_WS endfunc ! function Test_splitkeep_cmdwin_cursor_position() ! set splitkeep=screen call setline(1, range(&lines)) " No scroll when cursor is at near bottom of window and cusor position *************** *** 1789,1799 **** call assert_equal(1, col('.')) %bwipeout! ! set splitscroll& endfunction ! function Test_nosplitscroll_misc() ! set nosplitscroll set splitbelow call setline(1, range(1, &lines)) --- 1786,1796 ---- call assert_equal(1, col('.')) %bwipeout! ! set splitkeep& endfunction ! function Test_splitkeep_misc() ! set splitkeep=screen set splitbelow call setline(1, range(1, &lines)) *************** *** 1815,1881 **** %bwipeout! set splitbelow& ! set splitscroll& endfunc ! function Test_nosplitscroll_callback() CheckScreendump let lines =<< trim END ! set nosplitscroll call setline(1, range(&lines)) ! function WincmdCb(a, b) split | wincmd p endfunction ! function TermCb(a, b) close | split endfunction ! nnoremap t call popup_create(term_start(&shell, { 'hidden': 1, 'exit_cb': 'TermCb' }), {}) ! nnoremap j call job_start([&shell, &shellcmdflag, "echo"], { 'exit_cb': 'WincmdCb' }) END ! call writefile(lines, 'XTestNosplitscrollCallback', 'D') ! let buf = RunVimInTerminal('-S XTestNosplitscrollCallback', #{rows: 8}) call term_sendkeys(buf, "j") ! call VerifyScreenDump(buf, 'Test_nosplitscroll_callback_1', {}) ! call term_sendkeys(buf, ":quit\Htexit\") ! call VerifyScreenDump(buf, 'Test_nosplitscroll_callback_2', {}) call term_sendkeys(buf, ":set sb\:quit\Gj") ! call VerifyScreenDump(buf, 'Test_nosplitscroll_callback_3', {}) ! call term_sendkeys(buf, ":quit\Gtexit\") ! call VerifyScreenDump(buf, 'Test_nosplitscroll_callback_4', {}) endfunc ! function Test_nosplitscroll_fold() ! CheckScreendump ! let lines =<< trim END ! set nosplitscroll ! set foldmethod=marker ! set number ! let line = 1 ! for n in range(1, &lines) ! call setline(line, ['int FuncName() {/*{{{*/', 1, 2, 3, 4, 5, '}/*}}}*/', ! \ 'after fold']) ! let line += 8 ! endfor ! END ! call writefile(lines, 'XTestNosplitscrollFold', 'D') ! let buf = RunVimInTerminal('-S XTestNosplitscrollFold', #{rows: 10}) call term_sendkeys(buf, "L:wincmd s\") ! call VerifyScreenDump(buf, 'Test_nosplitscroll_fold_1', {}) call term_sendkeys(buf, ":quit\") ! call VerifyScreenDump(buf, 'Test_nosplitscroll_fold_2', {}) call term_sendkeys(buf, "H:below split\") ! call VerifyScreenDump(buf, 'Test_nosplitscroll_fold_3', {}) call term_sendkeys(buf, ":wincmd k\:quit\") ! call VerifyScreenDump(buf, 'Test_nosplitscroll_fold_4', {}) endfunction " vim: shiftwidth=2 sts=2 expandtab --- 1812,1879 ---- %bwipeout! set splitbelow& ! set splitkeep& endfunc ! function Test_splitkeep_callback() CheckScreendump let lines =<< trim END ! set splitkeep=screen call setline(1, range(&lines)) ! function C1(a, b) split | wincmd p endfunction ! function C2(a, b) close | split endfunction ! nn j call job_start([&sh, &shcf, "true"], { 'exit_cb': 'C1' }) ! nn t call popup_create(term_start([&sh, &shcf, "true"], ! \ { 'hidden': 1, 'exit_cb': 'C2' }), {}) END ! call writefile(lines, 'XTestSplitkeepCallback', 'D') ! let buf = RunVimInTerminal('-S XTestSplitkeepCallback', #{rows: 8}) call term_sendkeys(buf, "j") ! call VerifyScreenDump(buf, 'Test_splitkeep_callback_1', {}) ! call term_sendkeys(buf, ":quit\Ht") ! call VerifyScreenDump(buf, 'Test_splitkeep_callback_2', {}) call term_sendkeys(buf, ":set sb\:quit\Gj") ! call VerifyScreenDump(buf, 'Test_splitkeep_callback_3', {}) ! call term_sendkeys(buf, ":quit\Gt") ! call VerifyScreenDump(buf, 'Test_splitkeep_callback_4', {}) endfunc ! function Test_splitkeep_fold() ! CheckScreendump ! let lines =<< trim END ! set splitkeep=screen ! set foldmethod=marker ! set number ! let line = 1 ! for n in range(1, &lines) ! call setline(line, ['int FuncName() {/*{{{*/', 1, 2, 3, 4, 5, '}/*}}}*/', ! \ 'after fold']) ! let line += 8 ! endfor ! END ! call writefile(lines, 'XTestSplitkeepFold', 'D') ! let buf = RunVimInTerminal('-S XTestSplitkeepFold', #{rows: 10}) call term_sendkeys(buf, "L:wincmd s\") ! call VerifyScreenDump(buf, 'Test_splitkeep_fold_1', {}) call term_sendkeys(buf, ":quit\") ! call VerifyScreenDump(buf, 'Test_splitkeep_fold_2', {}) call term_sendkeys(buf, "H:below split\") ! call VerifyScreenDump(buf, 'Test_splitkeep_fold_3', {}) call term_sendkeys(buf, ":wincmd k\:quit\") ! call VerifyScreenDump(buf, 'Test_splitkeep_fold_4', {}) endfunction " vim: shiftwidth=2 sts=2 expandtab *** ../vim-9.0.0646/src/testdir/dumps/Test_nosplitscroll_callback_1.dump 2022-09-23 12:56:49.305714732 +0100 --- src/testdir/dumps/Test_nosplitscroll_callback_1.dump 1970-01-01 00:00:00.000000000 +0000 *************** *** 1,8 **** - |0+0&#ffffff0| @73 - |1| @73 - |2| @73 - |[+1&&|N|o| |N|a|m|e|]| |[|+|]| @43|1|,|1| @11|T|o|p - >4+0&&| @73 - |5| @73 - |[+3&&|N|o| |N|a|m|e|]| |[|+|]| @43|5|,|1| @11|6@1|% - | +0&&@74 --- 0 ---- *** ../vim-9.0.0646/src/testdir/dumps/Test_nosplitscroll_callback_2.dump 2022-09-23 12:56:49.305714732 +0100 --- src/testdir/dumps/Test_nosplitscroll_callback_2.dump 1970-01-01 00:00:00.000000000 +0000 *************** *** 1,8 **** - >0+0&#ffffff0| @73 - |1| @73 - |2| @73 - |[+3&&|N|o| |N|a|m|e|]| |[|+|]| @43|1|,|1| @11|T|o|p - |4+0&&| @73 - |5| @73 - |[+1&&|N|o| |N|a|m|e|]| |[|+|]| @43|1|,|1| @11|6@1|% - | +0&&@74 --- 0 ---- *** ../vim-9.0.0646/src/testdir/dumps/Test_nosplitscroll_callback_3.dump 2022-09-23 12:56:49.305714732 +0100 --- src/testdir/dumps/Test_nosplitscroll_callback_3.dump 1970-01-01 00:00:00.000000000 +0000 *************** *** 1,8 **** - >1+0&#ffffff0| @73 - |2| @73 - |[+3&&|N|o| |N|a|m|e|]| |[|+|]| @43|2|,|1| @11|1|6|% - |4+0&&| @73 - |5| @73 - |6| @73 - |[+1&&|N|o| |N|a|m|e|]| |[|+|]| @43|6|,|1| @11|8|0|% - | +0&&@74 --- 0 ---- *** ../vim-9.0.0646/src/testdir/dumps/Test_nosplitscroll_callback_4.dump 2022-09-23 12:56:49.309714862 +0100 --- src/testdir/dumps/Test_nosplitscroll_callback_4.dump 1970-01-01 00:00:00.000000000 +0000 *************** *** 1,8 **** - |1+0&#ffffff0| @73 - |2| @73 - |[+1&&|N|o| |N|a|m|e|]| |[|+|]| @43|8|,|1| @11|1|6|% - |4+0&&| @73 - >5| @73 - |6| @73 - |[+3&&|N|o| |N|a|m|e|]| |[|+|]| @43|6|,|1| @11|8|0|% - | +0&&@74 --- 0 ---- *** ../vim-9.0.0646/src/testdir/dumps/Test_splitkeep_callback_1.dump 2022-10-03 15:26:32.125554913 +0100 --- src/testdir/dumps/Test_splitkeep_callback_1.dump 2022-10-03 15:03:41.332341511 +0100 *************** *** 0 **** --- 1,8 ---- + |0+0&#ffffff0| @73 + |1| @73 + |2| @73 + |[+1&&|N|o| |N|a|m|e|]| |[|+|]| @43|1|,|1| @11|T|o|p + >4+0&&| @73 + |5| @73 + |[+3&&|N|o| |N|a|m|e|]| |[|+|]| @43|5|,|1| @11|6@1|% + | +0&&@74 *** ../vim-9.0.0646/src/testdir/dumps/Test_splitkeep_callback_2.dump 2022-10-03 15:26:32.129554952 +0100 --- src/testdir/dumps/Test_splitkeep_callback_2.dump 2022-10-03 15:03:41.332341511 +0100 *************** *** 0 **** --- 1,8 ---- + >0+0&#ffffff0| @73 + |1| @73 + |2| @73 + |[+3&&|N|o| |N|a|m|e|]| |[|+|]| @43|1|,|1| @11|T|o|p + |4+0&&| @73 + |5| @73 + |[+1&&|N|o| |N|a|m|e|]| |[|+|]| @43|1|,|1| @11|6@1|% + | +0&&@74 *** ../vim-9.0.0646/src/testdir/dumps/Test_splitkeep_callback_3.dump 2022-10-03 15:26:32.133554991 +0100 --- src/testdir/dumps/Test_splitkeep_callback_3.dump 2022-10-03 15:03:41.332341511 +0100 *************** *** 0 **** --- 1,8 ---- + >1+0&#ffffff0| @73 + |2| @73 + |[+3&&|N|o| |N|a|m|e|]| |[|+|]| @43|2|,|1| @11|1|6|% + |4+0&&| @73 + |5| @73 + |6| @73 + |[+1&&|N|o| |N|a|m|e|]| |[|+|]| @43|6|,|1| @11|8|0|% + | +0&&@74 *** ../vim-9.0.0646/src/testdir/dumps/Test_splitkeep_callback_4.dump 2022-10-03 15:26:32.137555027 +0100 --- src/testdir/dumps/Test_splitkeep_callback_4.dump 2022-10-03 15:03:41.332341511 +0100 *************** *** 0 **** --- 1,8 ---- + |1+0&#ffffff0| @73 + |2| @73 + |[+1&&|N|o| |N|a|m|e|]| |[|+|]| @43|8|,|1| @11|1|6|% + |4+0&&| @73 + >5| @73 + |6| @73 + |[+3&&|N|o| |N|a|m|e|]| |[|+|]| @43|6|,|1| @11|8|0|% + | +0&&@74 *** ../vim-9.0.0646/src/testdir/dumps/Test_nosplitscroll_fold_1.dump 2022-09-27 12:30:53.226180139 +0100 --- src/testdir/dumps/Test_nosplitscroll_fold_1.dump 1970-01-01 00:00:00.000000000 +0000 *************** *** 1,10 **** - | +0#0000e05#a8a8a8255@1|1| |+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 - | +0#af5f00255#ffffff0@1|8| >a+0#0000000&|f|t|e|r| |f|o|l|d| @60 - | +0#0000e05#a8a8a8255@1|9| |+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 - | +0#af5f00255#ffffff0|1|6| |a+0#0000000&|f|t|e|r| |f|o|l|d| @60 - |[+3&&|N|o| |N|a|m|e|]| |[|+|]| @43|8|,|1| @11|T|o|p - | +0#af5f00255&|2|4| |a+0#0000000&|f|t|e|r| |f|o|l|d| @60 - | +0#0000e05#a8a8a8255|2|5| |+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 - | +0#af5f00255#ffffff0|3|2| |a+0#0000000&|f|t|e|r| |f|o|l|d| @60 - |[+1&&|N|o| |N|a|m|e|]| |[|+|]| @43|2|3|,|1| @10|3|2|% - |:+0&&|w|i|n|c|m|d| |s| @65 --- 0 ---- *** ../vim-9.0.0646/src/testdir/dumps/Test_nosplitscroll_fold_2.dump 2022-09-27 12:30:53.226180139 +0100 --- src/testdir/dumps/Test_nosplitscroll_fold_2.dump 1970-01-01 00:00:00.000000000 +0000 *************** *** 1,10 **** - | +0#0000e05#a8a8a8255@1|1| |+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 - | +0#af5f00255#ffffff0@1|8| |a+0#0000000&|f|t|e|r| |f|o|l|d| @60 - | +0#0000e05#a8a8a8255@1|9| |+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 - | +0#af5f00255#ffffff0|1|6| |a+0#0000000&|f|t|e|r| |f|o|l|d| @60 - | +0#0000e05#a8a8a8255|1|7| >+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 - | +0#af5f00255#ffffff0|2|4| |a+0#0000000&|f|t|e|r| |f|o|l|d| @60 - | +0#0000e05#a8a8a8255|2|5| |+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 - | +0#af5f00255#ffffff0|3|2| |a+0#0000000&|f|t|e|r| |f|o|l|d| @60 - | +0#0000e05#a8a8a8255|3@1| |+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 - |:+0#0000000#ffffff0|q|u|i|t| @51|1|7|,|1| @9|T|o|p| --- 0 ---- *** ../vim-9.0.0646/src/testdir/dumps/Test_nosplitscroll_fold_3.dump 2022-09-27 12:30:53.226180139 +0100 --- src/testdir/dumps/Test_nosplitscroll_fold_3.dump 1970-01-01 00:00:00.000000000 +0000 *************** *** 1,10 **** - | +0#0000e05#a8a8a8255@1|1| |+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 - | +0#af5f00255#ffffff0@1|8| |a+0#0000000&|f|t|e|r| |f|o|l|d| @60 - | +0#0000e05#a8a8a8255@1|9| |+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 - |[+1#0000000#ffffff0|N|o| |N|a|m|e|]| |[|+|]| @43|1|,|1| @11|T|o|p - | +0#0000e05#a8a8a8255|1|7| |+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 - | +0#af5f00255#ffffff0|2|4| >a+0#0000000&|f|t|e|r| |f|o|l|d| @60 - | +0#0000e05#a8a8a8255|2|5| |+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 - | +0#af5f00255#ffffff0|3|2| |a+0#0000000&|f|t|e|r| |f|o|l|d| @60 - |[+3&&|N|o| |N|a|m|e|]| |[|+|]| @43|2|4|,|1| @10|2|5|% - |:+0&&|b|e|l|o|w| |s|p|l|i|t| @62 --- 0 ---- *** ../vim-9.0.0646/src/testdir/dumps/Test_nosplitscroll_fold_4.dump 2022-09-27 15:06:26.102486486 +0100 --- src/testdir/dumps/Test_nosplitscroll_fold_4.dump 1970-01-01 00:00:00.000000000 +0000 *************** *** 1,10 **** - | +0#0000e05#a8a8a8255@1|1| |+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 - | +0#af5f00255#ffffff0@1|8| |a+0#0000000&|f|t|e|r| |f|o|l|d| @60 - | +0#0000e05#a8a8a8255@1|9| |+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 - | +0#af5f00255#ffffff0|1|6| |a+0#0000000&|f|t|e|r| |f|o|l|d| @60 - | +0#0000e05#a8a8a8255|1|7| >+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 - | +0#af5f00255#ffffff0|2|4| |a+0#0000000&|f|t|e|r| |f|o|l|d| @60 - | +0#0000e05#a8a8a8255|2|5| |+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 - | +0#af5f00255#ffffff0|3|2| |a+0#0000000&|f|t|e|r| |f|o|l|d| @60 - | +0#0000e05#a8a8a8255|3@1| |+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 - |:+0#0000000#ffffff0|q|u|i|t| @51|1|7|,|1| @9|T|o|p| --- 0 ---- *** ../vim-9.0.0646/src/testdir/dumps/Test_splitkeep_fold_1.dump 2022-10-03 15:26:32.153555181 +0100 --- src/testdir/dumps/Test_splitkeep_fold_1.dump 2022-10-03 15:03:41.332341511 +0100 *************** *** 0 **** --- 1,10 ---- + | +0#0000e05#a8a8a8255@1|1| |+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 + | +0#af5f00255#ffffff0@1|8| >a+0#0000000&|f|t|e|r| |f|o|l|d| @60 + | +0#0000e05#a8a8a8255@1|9| |+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 + | +0#af5f00255#ffffff0|1|6| |a+0#0000000&|f|t|e|r| |f|o|l|d| @60 + |[+3&&|N|o| |N|a|m|e|]| |[|+|]| @43|8|,|1| @11|T|o|p + | +0#af5f00255&|2|4| |a+0#0000000&|f|t|e|r| |f|o|l|d| @60 + | +0#0000e05#a8a8a8255|2|5| |+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 + | +0#af5f00255#ffffff0|3|2| |a+0#0000000&|f|t|e|r| |f|o|l|d| @60 + |[+1&&|N|o| |N|a|m|e|]| |[|+|]| @43|2|3|,|1| @10|3|2|% + |:+0&&|w|i|n|c|m|d| |s| @65 *** ../vim-9.0.0646/src/testdir/dumps/Test_splitkeep_fold_2.dump 2022-10-03 15:26:32.157555220 +0100 --- src/testdir/dumps/Test_splitkeep_fold_2.dump 2022-10-03 15:03:41.336341488 +0100 *************** *** 0 **** --- 1,10 ---- + | +0#0000e05#a8a8a8255@1|1| |+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 + | +0#af5f00255#ffffff0@1|8| |a+0#0000000&|f|t|e|r| |f|o|l|d| @60 + | +0#0000e05#a8a8a8255@1|9| |+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 + | +0#af5f00255#ffffff0|1|6| |a+0#0000000&|f|t|e|r| |f|o|l|d| @60 + | +0#0000e05#a8a8a8255|1|7| >+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 + | +0#af5f00255#ffffff0|2|4| |a+0#0000000&|f|t|e|r| |f|o|l|d| @60 + | +0#0000e05#a8a8a8255|2|5| |+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 + | +0#af5f00255#ffffff0|3|2| |a+0#0000000&|f|t|e|r| |f|o|l|d| @60 + | +0#0000e05#a8a8a8255|3@1| |+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 + |:+0#0000000#ffffff0|q|u|i|t| @51|1|7|,|1| @9|T|o|p| *** ../vim-9.0.0646/src/testdir/dumps/Test_splitkeep_fold_3.dump 2022-10-03 15:26:32.161555257 +0100 --- src/testdir/dumps/Test_splitkeep_fold_3.dump 2022-10-03 15:03:41.336341488 +0100 *************** *** 0 **** --- 1,10 ---- + | +0#0000e05#a8a8a8255@1|1| |+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 + | +0#af5f00255#ffffff0@1|8| |a+0#0000000&|f|t|e|r| |f|o|l|d| @60 + | +0#0000e05#a8a8a8255@1|9| |+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 + |[+1#0000000#ffffff0|N|o| |N|a|m|e|]| |[|+|]| @43|1|,|1| @11|T|o|p + | +0#0000e05#a8a8a8255|1|7| |+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 + | +0#af5f00255#ffffff0|2|4| >a+0#0000000&|f|t|e|r| |f|o|l|d| @60 + | +0#0000e05#a8a8a8255|2|5| |+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 + | +0#af5f00255#ffffff0|3|2| |a+0#0000000&|f|t|e|r| |f|o|l|d| @60 + |[+3&&|N|o| |N|a|m|e|]| |[|+|]| @43|2|4|,|1| @10|2|5|% + |:+0&&|b|e|l|o|w| |s|p|l|i|t| @62 *** ../vim-9.0.0646/src/testdir/dumps/Test_splitkeep_fold_4.dump 2022-10-03 15:26:32.165555295 +0100 --- src/testdir/dumps/Test_splitkeep_fold_4.dump 2022-10-03 15:03:41.336341488 +0100 *************** *** 0 **** --- 1,10 ---- + | +0#0000e05#a8a8a8255@1|1| |+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 + | +0#af5f00255#ffffff0@1|8| |a+0#0000000&|f|t|e|r| |f|o|l|d| @60 + | +0#0000e05#a8a8a8255@1|9| |+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 + | +0#af5f00255#ffffff0|1|6| |a+0#0000000&|f|t|e|r| |f|o|l|d| @60 + | +0#0000e05#a8a8a8255|1|7| >+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 + | +0#af5f00255#ffffff0|2|4| |a+0#0000000&|f|t|e|r| |f|o|l|d| @60 + | +0#0000e05#a8a8a8255|2|5| |+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 + | +0#af5f00255#ffffff0|3|2| |a+0#0000000&|f|t|e|r| |f|o|l|d| @60 + | +0#0000e05#a8a8a8255|3@1| |+|-@1| @1|7| |l|i|n|e|s|:| |i|n|t| |F|u|n|c|N|a|m|e|(|)| |{|-@40 + |:+0#0000000#ffffff0|q|u|i|t| @51|1|7|,|1| @9|T|o|p| *** ../vim-9.0.0646/src/version.c 2022-10-03 14:05:58.706085741 +0100 --- src/version.c 2022-10-03 15:16:35.416608397 +0100 *************** *** 701,702 **** --- 701,704 ---- { /* Add new patch number below this line */ + /**/ + 647, /**/ -- hundred-and-one symptoms of being an internet addict: 258. When you want to see your girlfriend, you surf to her homepage. /// Bram Moolenaar -- Bram@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 ///