diff options
author | Bram Moolenaar <Bram@vim.org> | 2021-08-10 19:53:01 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-08-10 19:53:01 +0200 |
commit | 917c46abe559f3d779ad87500e874376111ca1ef (patch) | |
tree | dfb91ceb975b8a2282937900b74172f4260637ee /src | |
parent | b6f55bb5b4d7d03cdf47d552db20d06e41354d5f (diff) |
patch 8.2.3324: Vim9: Cannot use :silent with :endwhilev8.2.3324
Problem: Vim9: Cannot use :silent with :endwhile.
Solution: Allow for using the :silent modifier. (closes #8737)
Diffstat (limited to 'src')
-rw-r--r-- | src/ex_docmd.c | 10 | ||||
-rw-r--r-- | src/ex_eval.c | 12 | ||||
-rw-r--r-- | src/proto/ex_docmd.pro | 6 | ||||
-rw-r--r-- | src/testdir/test_vim9_cmd.vim | 18 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9compile.c | 2 |
6 files changed, 34 insertions, 16 deletions
diff --git a/src/ex_docmd.c b/src/ex_docmd.c index 0f0e627d12..9640c500be 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -3061,9 +3061,11 @@ parse_command_modifiers( * Return TRUE if "cmod" has anything set. */ int -has_cmdmod(cmdmod_T *cmod) +has_cmdmod(cmdmod_T *cmod, int ignore_silent) { - return cmod->cmod_flags != 0 + return (cmod->cmod_flags != 0 && (!ignore_silent + || (cmod->cmod_flags + & ~(CMOD_SILENT | CMOD_ERRSILENT | CMOD_UNSILENT)) != 0)) || cmod->cmod_split != 0 || cmod->cmod_verbose != 0 || cmod->cmod_tab != 0 @@ -3074,9 +3076,9 @@ has_cmdmod(cmdmod_T *cmod) * If Vim9 script and "cmdmod" has anything set give an error and return TRUE. */ int -cmdmod_error(void) +cmdmod_error(int ignore_silent) { - if (in_vim9script() && has_cmdmod(&cmdmod)) + if (in_vim9script() && has_cmdmod(&cmdmod, ignore_silent)) { emsg(_(e_misplaced_command_modifier)); return TRUE; diff --git a/src/ex_eval.c b/src/ex_eval.c index 6bc7c18b84..207defa7f3 100644 --- a/src/ex_eval.c +++ b/src/ex_eval.c @@ -1026,7 +1026,7 @@ ex_endif(exarg_T *eap) { cstack_T *cstack = eap->cstack; - if (cmdmod_error()) + if (cmdmod_error(FALSE)) return; did_endif = TRUE; if (cstack->cs_idx < 0 @@ -1355,7 +1355,7 @@ ex_endwhile(exarg_T *eap) int csf; int fl; - if (cmdmod_error()) + if (cmdmod_error(TRUE)) return; if (eap->cmdidx == CMD_endwhile) @@ -1593,7 +1593,7 @@ ex_try(exarg_T *eap) int skip; cstack_T *cstack = eap->cstack; - if (cmdmod_error()) + if (cmdmod_error(FALSE)) return; if (cstack->cs_idx == CSTACK_LEN - 1) @@ -1674,7 +1674,7 @@ ex_catch(exarg_T *eap) cstack_T *cstack = eap->cstack; char_u *pat; - if (cmdmod_error()) + if (cmdmod_error(FALSE)) return; if (cstack->cs_trylevel <= 0 || cstack->cs_idx < 0) @@ -1839,7 +1839,7 @@ ex_finally(exarg_T *eap) int pending = CSTP_NONE; cstack_T *cstack = eap->cstack; - if (cmdmod_error()) + if (cmdmod_error(FALSE)) return; if (cstack->cs_trylevel <= 0 || cstack->cs_idx < 0) @@ -1971,7 +1971,7 @@ ex_endtry(exarg_T *eap) void *rettv = NULL; cstack_T *cstack = eap->cstack; - if (cmdmod_error()) + if (cmdmod_error(FALSE)) return; if (cstack->cs_trylevel <= 0 || cstack->cs_idx < 0) diff --git a/src/proto/ex_docmd.pro b/src/proto/ex_docmd.pro index f96f8cf782..53714391a7 100644 --- a/src/proto/ex_docmd.pro +++ b/src/proto/ex_docmd.pro @@ -10,8 +10,8 @@ char *ex_errmsg(char *msg, char_u *arg); int checkforcmd(char_u **pp, char *cmd, int len); int checkforcmd_noparen(char_u **pp, char *cmd, int len); int parse_command_modifiers(exarg_T *eap, char **errormsg, cmdmod_T *cmod, int skip_only); -int has_cmdmod(cmdmod_T *cmod); -int cmdmod_error(void); +int has_cmdmod(cmdmod_T *cmod, int ignore_silent); +int cmdmod_error(int ignore_silent); void apply_cmdmod(cmdmod_T *cmod); void undo_cmdmod(cmdmod_T *cmod); int parse_cmd_address(exarg_T *eap, char **errormsg, int silent); @@ -32,7 +32,7 @@ int ends_excmd(int c); int ends_excmd2(char_u *cmd_start, char_u *cmd); char_u *find_nextcmd(char_u *p); char_u *check_nextcmd(char_u *p); -void set_nextcmd(exarg_T *eap, char_u *p); +void set_nextcmd(exarg_T *eap, char_u *arg); char_u *get_command_name(expand_T *xp, int idx); void not_exiting(void); int before_quit_autocmds(win_T *wp, int quit_all, int forceit); diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim index a6241134a4..84cb6d6650 100644 --- a/src/testdir/test_vim9_cmd.vim +++ b/src/testdir/test_vim9_cmd.vim @@ -807,6 +807,17 @@ def Test_modifier_silent_unsilent() echomsg "caught" endtry assert_equal("\ncaught", execute(':1messages')) + + var lines =<< trim END + vim9script + set history=11 + silent! while 0 + set history=22 + silent! endwhile + assert_equal(11, &history) + set history& + END + CheckScriptSuccess(lines) enddef def Test_range_after_command_modifier() @@ -836,13 +847,16 @@ def Test_useless_command_modifier() for i in [0] silent endfor END - CheckDefAndScriptFailure(lines, 'E1176:', 2) + CheckDefFailure(lines, 'E1176:', 2) + CheckScriptSuccess(['vim9script'] + lines) lines =<< trim END while g:maybe silent endwhile END - CheckDefAndScriptFailure(lines, 'E1176:', 2) + CheckDefFailure(lines, 'E1176:', 2) + g:maybe = false + CheckScriptSuccess(['vim9script'] + lines) lines =<< trim END silent try diff --git a/src/version.c b/src/version.c index 88dc354e4f..0255bf65d0 100644 --- a/src/version.c +++ b/src/version.c @@ -756,6 +756,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 3324, +/**/ 3323, /**/ 3322, diff --git a/src/vim9compile.c b/src/vim9compile.c index 6bb1090693..127d5a69d4 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -2344,7 +2344,7 @@ generate_cmdmods(cctx_T *cctx, cmdmod_T *cmod) { isn_T *isn; - if (has_cmdmod(cmod)) + if (has_cmdmod(cmod, FALSE)) { cctx->ctx_has_cmdmod = TRUE; |