# HG changeset patch # User Bram Moolenaar # Date 1615380303 -3600 # Node ID a9ff8368d35f9773a9da7c65cbcae87da3452fc6 # Parent c7c23ae596ef67becfe0d6c55fb1bf89586f353b patch 8.2.2581: Vim9: sourcing Vim9 script triggers a redraw Commit: https://github.com/vim/vim/commit/37294bd6a2afbf0fc8a1c34cbe102336b0bd0a82 Author: Bram Moolenaar Date: Wed Mar 10 13:40:08 2021 +0100 patch 8.2.2581: Vim9: sourcing Vim9 script triggers a redraw Problem: Vim9: sourcing Vim9 script triggers a redraw. Solution: Do not let setting/restoring 'cpoptions' cause a redraw. (closes #7920) diff --git a/src/option.c b/src/option.c --- a/src/option.c +++ b/src/option.c @@ -3176,7 +3176,9 @@ set_bool_option( if (curwin->w_curswant != MAXCOL && (options[opt_idx].flags & (P_CURSWANT | P_RALL)) != 0) curwin->w_set_curswant = TRUE; - check_redraw(options[opt_idx].flags); + + if ((opt_flags & OPT_NO_REDRAW) == 0) + check_redraw(options[opt_idx].flags); return NULL; } @@ -3192,8 +3194,8 @@ set_num_option( long value, // new value char *errbuf, // buffer for error messages size_t errbuflen, // length of "errbuf" - int opt_flags) // OPT_LOCAL, OPT_GLOBAL and - // OPT_MODELINE + int opt_flags) // OPT_LOCAL, OPT_GLOBAL, + // OPT_MODELINE, etc. { char *errmsg = NULL; long old_value = *(long *)varp; @@ -3734,7 +3736,8 @@ set_num_option( if (curwin->w_curswant != MAXCOL && (options[opt_idx].flags & (P_CURSWANT | P_RALL)) != 0) curwin->w_set_curswant = TRUE; - check_redraw(options[opt_idx].flags); + if ((opt_flags & OPT_NO_REDRAW) == 0) + check_redraw(options[opt_idx].flags); return errmsg; } diff --git a/src/optionstr.c b/src/optionstr.c --- a/src/optionstr.c +++ b/src/optionstr.c @@ -2461,11 +2461,14 @@ ambw_end: && (get_option_flags(opt_idx) & (P_CURSWANT | P_RALL)) != 0) curwin->w_set_curswant = TRUE; + if ((opt_flags & OPT_NO_REDRAW) == 0) + { #ifdef FEAT_GUI - // check redraw when it's not a GUI option or the GUI is active. - if (!redraw_gui_only || gui.in_use) + // check redraw when it's not a GUI option or the GUI is active. + if (!redraw_gui_only || gui.in_use) #endif - check_redraw(get_option_flags(opt_idx)); + check_redraw(get_option_flags(opt_idx)); + } #if defined(FEAT_VTP) && defined(FEAT_TERMGUICOLORS) if (did_swaptcap) diff --git a/src/scriptfile.c b/src/scriptfile.c --- a/src/scriptfile.c +++ b/src/scriptfile.c @@ -1459,7 +1459,7 @@ almosttheend: si = SCRIPT_ITEM(current_sctx.sc_sid); if (si->sn_save_cpo != NULL) { - set_option_value((char_u *)"cpo", 0L, si->sn_save_cpo, 0); + set_option_value((char_u *)"cpo", 0L, si->sn_save_cpo, OPT_NO_REDRAW); VIM_CLEAR(si->sn_save_cpo); } diff --git a/src/testdir/dumps/Test_vim9_no_redraw.dump b/src/testdir/dumps/Test_vim9_no_redraw.dump new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_vim9_no_redraw.dump @@ -0,0 +1,6 @@ +|s+0&#ffffff0|o+0&#e0e0e08|m|e| |t|e|x|t| | +0&#ffffff0@64 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|:+0#0000000&|'|<|,|'|>> @68 diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim --- a/src/testdir/test_vim9_script.vim +++ b/src/testdir/test_vim9_script.vim @@ -5,6 +5,7 @@ source term_util.vim source view_util.vim source vim9.vim source shared.vim +source screendump.vim def Test_range_only() new @@ -3338,6 +3339,36 @@ def Test_restoring_cpo() set cpo&vim enddef +def Test_no_redraw_when_restoring_cpo() + CheckScreendump + + var lines =<< trim END + vim9script + def script#func() + enddef + END + mkdir('Xdir/autoload', 'p') + writefile(lines, 'Xdir/autoload/script.vim') + + lines =<< trim END + vim9script + set cpo+=M + exe 'set rtp^=' .. getcwd() .. '/Xdir' + au CmdlineEnter : ++once timer_start(0, () => script#func()) + setline(1, 'some text') + END + writefile(lines, 'XTest_redraw_cpo') + var buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6}) + term_sendkeys(buf, "V:") + VerifyScreenDump(buf, 'Test_vim9_no_redraw', {}) + + # clean up + term_sendkeys(buf, "\u") + StopVimInTerminal(buf) + delete('XTest_redraw_cpo') + delete('Xdir', 'rf') +enddef + def Test_unset_any_variable() var lines =<< trim END 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 */ /**/ + 2581, +/**/ 2580, /**/ 2579, diff --git a/src/vim.h b/src/vim.h --- a/src/vim.h +++ b/src/vim.h @@ -1200,6 +1200,7 @@ extern int (*dyn_libintl_wputenv)(const #define OPT_WINONLY 0x10 // only set window-local options #define OPT_NOWIN 0x20 // don't set window-local options #define OPT_ONECOLUMN 0x40 // list options one per line +#define OPT_NO_REDRAW 0x80 // ignore redraw flags on option // Magic chars used in confirm dialog strings #define DLG_BUTTON_SEP '\n' diff --git a/src/vim9script.c b/src/vim9script.c --- a/src/vim9script.c +++ b/src/vim9script.c @@ -75,7 +75,7 @@ ex_vim9script(exarg_T *eap UNUSED) if (STRCMP(p_cpo, CPO_VIM) != 0) { si->sn_save_cpo = vim_strsave(p_cpo); - set_option_value((char_u *)"cpo", 0L, (char_u *)CPO_VIM, 0); + set_option_value((char_u *)"cpo", 0L, (char_u *)CPO_VIM, OPT_NO_REDRAW); } #else // No check for this being the first command, it doesn't matter.