# HG changeset patch # User Bram Moolenaar # Date 1609166703 -3600 # Node ID 3105546b941fa6cfbdbbf6da82148a6a39842859 # Parent 3cc8438a1a7a0c02b8956088d9fdc3b2bfcde024 patch 8.2.2236: 'scroll' option can change when setting the statusline Commit: https://github.com/vim/vim/commit/746670604a60cb0356b56c112ffb6d297c679099 Author: Bram Moolenaar Date: Mon Dec 28 15:41:41 2020 +0100 patch 8.2.2236: 'scroll' option can change when setting the statusline Problem: 'scroll' option can change when setting the statusline or tabline but the option context is not updated. Solution: Update the script context when the scroll option is changed as a side effect. (Christian Brabandt, closes #7533) diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -6321,7 +6321,9 @@ A jump table for the options with a shor local to window Number of lines to scroll with CTRL-U and CTRL-D commands. Will be set to half the number of lines in the window when the window size - changes. If you give a count to the CTRL-U or CTRL-D command it will + changes. This may happen when enabling the |status-line| or + 'tabline' option after setting the 'scroll' option. + If you give a count to the CTRL-U or CTRL-D command it will be used as the new value for 'scroll'. Reset to half the window height with ":set scroll=0". diff --git a/src/scriptfile.c b/src/scriptfile.c --- a/src/scriptfile.c +++ b/src/scriptfile.c @@ -1553,6 +1553,7 @@ scriptnames_slash_adjust(void) /* * Get a pointer to a script name. Used for ":verbose set". + * Message appended to "Last set from " */ char_u * get_scriptname(scid_T id) @@ -1567,6 +1568,8 @@ get_scriptname(scid_T id) return (char_u *)_("environment variable"); if (id == SID_ERROR) return (char_u *)_("error handler"); + if (id == SID_WINLAYOUT) + return (char_u *)_("changed window size"); return SCRIPT_ITEM(id)->sn_name; } diff --git a/src/testdir/test_options.vim b/src/testdir/test_options.vim --- a/src/testdir/test_options.vim +++ b/src/testdir/test_options.vim @@ -1013,4 +1013,22 @@ func Test_isfname_with_options() setlocal keywordprg& endfunc +" Test that resetting laststatus does change scroll option +func Test_opt_reset_scroll() + CheckRunVimInTerminal + let vimrc =<< trim [CODE] + set scroll=2 + set laststatus=2 + [CODE] + call writefile(vimrc, 'Xscroll') + let buf = RunVimInTerminal('-S Xscroll', {'rows': 16, 'cols': 45}) + call term_sendkeys(buf, ":verbose set scroll?\n") + call WaitForAssert({-> assert_match('Last set.*window size', term_getline(buf, 15))}) + call assert_match('^\s*scroll=7$', term_getline(buf, 14)) + call StopVimInTerminal(buf) + + " clean up + call delete('Xscroll') +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2236, +/**/ 2235, /**/ 2234, diff --git a/src/vim.h b/src/vim.h --- a/src/vim.h +++ b/src/vim.h @@ -1232,6 +1232,7 @@ extern int (*dyn_libintl_wputenv)(const #define SID_ENV -4 // for sourcing environment variable #define SID_ERROR -5 // option was reset because of an error #define SID_NONE -6 // don't set scriptID +#define SID_WINLAYOUT -7 // changing window size /* * Events for autocommands. diff --git a/src/window.c b/src/window.c --- a/src/window.c +++ b/src/window.c @@ -6325,9 +6325,21 @@ win_new_width(win_T *wp, int width) void win_comp_scroll(win_T *wp) { +#if defined(FEAT_EVAL) + int old_w_p_scr = wp->w_p_scr; +#endif + wp->w_p_scr = ((unsigned)wp->w_height >> 1); if (wp->w_p_scr == 0) wp->w_p_scr = 1; +#if defined(FEAT_EVAL) + if (wp->w_p_scr != old_w_p_scr) + { + // Used by "verbose set scroll". + wp->w_p_script_ctx[WV_SCROLL].sc_sid = SID_WINLAYOUT; + wp->w_p_script_ctx[WV_SCROLL].sc_lnum = 0; + } +#endif } /*