# HG changeset patch # User Bram Moolenaar # Date 1628189104 -7200 # Node ID 2063b858cad97f4e9bbbdcbc5b31b359fee05b54 # Parent 619be3af2a4e7d49c8669aefab3b4d54aa53218b patch 8.2.3297: cannot use all commands inside a {} block Commit: https://github.com/vim/vim/commit/63b9173693015b135aad8e3657bef5e7f776787e Author: Bram Moolenaar Date: Thu Aug 5 20:40:03 2021 +0200 patch 8.2.3297: cannot use all commands inside a {} block Problem: Cannot use all commands inside a {} block after :command and :autocmd. Solution: Do consider \n to separate commands. (closes #8620) diff --git a/runtime/doc/map.txt b/runtime/doc/map.txt --- a/runtime/doc/map.txt +++ b/runtime/doc/map.txt @@ -1580,8 +1580,11 @@ Example: > echo 'hello' g:calledMyCommand = true } -No nesting is supported, inline functions cannot be used. Using `:normal` -directly does not work, you can use it indirectly with `:execute`. +< *E1231* +There must be white space before the "{". No nesting is supported, inline +functions cannot be used. Commands where a "|" may appear in the argument, +such as commands with an expression argument, cannot be followed by a "|" and +another command. The replacement text {repl} for a user defined command is scanned for special escape sequences, using <...> notation. Escape sequences are replaced with diff --git a/src/errors.h b/src/errors.h --- a/src/errors.h +++ b/src/errors.h @@ -643,4 +643,6 @@ EXTERN char e_list_dict_or_blob_required EXTERN char e_expected_dictionary_for_using_key_str_but_got_str[] INIT(= N_("E1229: Expected dictionary for using key \"%s\", but got %s")); EXTERN char e_encryption_sodium_mlock_failed[] - INIT(= N_("E1230: encryption: sodium_mlock() failed")); + INIT(= N_("E1230: Encryption: sodium_mlock() failed")); +EXTERN char e_cannot_use_bar_to_separate_commands_here_str[] + INIT(= N_("E1231: Cannot use a bar to separate commands here: %s")); diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -2314,7 +2314,7 @@ eval0( } if (eap != NULL) - eap->nextcmd = check_nextcmd(p); + set_nextcmd(eap, p); return ret; } @@ -6173,7 +6173,7 @@ ex_echo(exarg_T *eap) clear_tv(&rettv); arg = skipwhite(arg); } - eap->nextcmd = check_nextcmd(arg); + set_nextcmd(eap, arg); clear_evalarg(&evalarg, eap); if (eap->skip) @@ -6317,7 +6317,7 @@ ex_execute(exarg_T *eap) if (eap->skip) --emsg_skip; - eap->nextcmd = check_nextcmd(arg); + set_nextcmd(eap, arg); } /* diff --git a/src/evalvars.c b/src/evalvars.c --- a/src/evalvars.c +++ b/src/evalvars.c @@ -812,7 +812,7 @@ ex_let(exarg_T *eap) list_func_vars(&first); list_vim_vars(&first); } - eap->nextcmd = check_nextcmd(arg); + set_nextcmd(eap, arg); } else if (expr[0] == '=' && expr[1] == '<' && expr[2] == '<') { @@ -1629,7 +1629,7 @@ ex_unletlock( arg = skipwhite(name_end); } while (!ends_excmd2(name_end, arg)); - eap->nextcmd = check_nextcmd(arg); + set_nextcmd(eap, arg); } static int diff --git a/src/ex_cmds.c b/src/ex_cmds.c --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -450,7 +450,7 @@ ex_sort(exarg_T *eap) unique = TRUE; else if (*p == '"') // comment start break; - else if (check_nextcmd(p) != NULL) + else if (eap->nextcmd == NULL && check_nextcmd(p) != NULL) { eap->nextcmd = check_nextcmd(p); break; @@ -3930,7 +3930,7 @@ ex_substitute(exarg_T *eap) cmd = skipwhite(cmd); if (*cmd && *cmd != '"') // if not end-of-line or comment { - eap->nextcmd = check_nextcmd(cmd); + set_nextcmd(eap, cmd); if (eap->nextcmd == NULL) { semsg(_(e_trailing_arg), cmd); diff --git a/src/ex_docmd.c b/src/ex_docmd.c --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -2314,22 +2314,24 @@ do_one_cmd( ea.do_ecmd_cmd = getargcmd(&ea.arg); /* - * Check for '|' to separate commands and '"' or '#' to start comments. - * Don't do this for ":read !cmd" and ":write !cmd". + * For commands that do not use '|' inside their argument: Check for '|' to + * separate commands and '"' or '#' to start comments. + * + * Otherwise: Check for to end a shell command. + * Also do this for ":read !cmd", ":write !cmd" and ":global". + * Also do this inside a { - } block after :command and :autocmd. + * Any others? */ if ((ea.argt & EX_TRLBAR) && !ea.usefilter) + { separate_nextcmd(&ea); - - /* - * Check for to end a shell command. - * Also do this for ":read !cmd", ":write !cmd" and ":global". - * Any others? - */ + } else if (ea.cmdidx == CMD_bang || ea.cmdidx == CMD_terminal || ea.cmdidx == CMD_global || ea.cmdidx == CMD_vglobal - || ea.usefilter) + || ea.usefilter + || inside_block(&ea)) { for (p = ea.arg; *p; ++p) { @@ -5410,6 +5412,21 @@ check_nextcmd(char_u *p) } /* + * If "eap->nextcmd" is not set, check for a next command at "p". + */ + void +set_nextcmd(exarg_T *eap, char_u *arg) +{ + char_u *p = check_nextcmd(arg); + + if (eap->nextcmd == NULL) + eap->nextcmd = p; + else if (p != NULL) + // cannot use "| command" inside a {} block + semsg(_(e_cannot_use_bar_to_separate_commands_here_str), arg); +} + +/* * - if there are more files to edit * - and this is the last window * - and forceit not used @@ -7546,7 +7563,7 @@ ex_wincmd(exarg_T *eap) else p = eap->arg + 1; - eap->nextcmd = check_nextcmd(p); + set_nextcmd(eap, p); p = skipwhite(p); if (*p != NUL && *p != ( #ifdef FEAT_EVAL @@ -8580,7 +8597,7 @@ ex_findpat(exarg_T *eap) if (!ends_excmd2(eap->arg, p)) eap->errmsg = ex_errmsg(e_trailing_arg, p); else - eap->nextcmd = check_nextcmd(p); + set_nextcmd(eap, p); } } if (!eap->skip) diff --git a/src/ex_eval.c b/src/ex_eval.c --- a/src/ex_eval.c +++ b/src/ex_eval.c @@ -1461,6 +1461,18 @@ ex_endblock(exarg_T *eap) leave_block(cstack); } + int +inside_block(exarg_T *eap) +{ + cstack_T *cstack = eap->cstack; + int i; + + for (i = 0; i <= cstack->cs_idx; ++i) + if (cstack->cs_flags[cstack->cs_idx] & CSF_BLOCK) + return TRUE; + return FALSE; +} + /* * ":throw expr" */ diff --git a/src/proto/ex_docmd.pro b/src/proto/ex_docmd.pro --- a/src/proto/ex_docmd.pro +++ b/src/proto/ex_docmd.pro @@ -33,6 +33,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); 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/proto/ex_eval.pro b/src/proto/ex_eval.pro --- a/src/proto/ex_eval.pro +++ b/src/proto/ex_eval.pro @@ -22,6 +22,7 @@ void ex_break(exarg_T *eap); void ex_endwhile(exarg_T *eap); void ex_block(exarg_T *eap); void ex_endblock(exarg_T *eap); +int inside_block(exarg_T *eap); void ex_throw(exarg_T *eap); void do_throw(cstack_T *cstack); void ex_try(exarg_T *eap); diff --git a/src/syntax.c b/src/syntax.c --- a/src/syntax.c +++ b/src/syntax.c @@ -3789,7 +3789,7 @@ syn_cmd_enable(exarg_T *eap, int syncing static void syn_cmd_reset(exarg_T *eap, int syncing UNUSED) { - eap->nextcmd = check_nextcmd(eap->arg); + set_nextcmd(eap, eap->arg); if (!eap->skip) { set_internal_string_var((char_u *)"syntax_cmd", (char_u *)"reset"); @@ -3821,7 +3821,7 @@ syn_cmd_onoff(exarg_T *eap, char *name) { char_u buf[100]; - eap->nextcmd = check_nextcmd(eap->arg); + set_nextcmd(eap, eap->arg); if (!eap->skip) { STRCPY(buf, "so "); @@ -3928,7 +3928,7 @@ syn_cmd_list( arg = skipwhite(arg_end); } } - eap->nextcmd = check_nextcmd(arg); + set_nextcmd(eap, arg); } static void @@ -4921,7 +4921,7 @@ error: } if (rest != NULL) - eap->nextcmd = check_nextcmd(rest); + set_nextcmd(eap, rest); else semsg(_(e_invarg2), arg); @@ -4978,7 +4978,7 @@ syn_cmd_match( /* * Check for trailing command and illegal trailing arguments. */ - eap->nextcmd = check_nextcmd(rest); + set_nextcmd(eap, rest); if (!ends_excmd2(eap->cmd, rest) || eap->skip) rest = NULL; else if (ga_grow(&curwin->w_s->b_syn_patterns, 1) != FAIL @@ -5218,7 +5218,7 @@ syn_cmd_region( * Check for trailing garbage or command. * If OK, add the item. */ - eap->nextcmd = check_nextcmd(rest); + set_nextcmd(eap, rest); if (!ends_excmd(*rest) || eap->skip) rest = NULL; else if (ga_grow(&(curwin->w_s->b_syn_patterns), pat_count) != FAIL @@ -5896,7 +5896,7 @@ syn_cmd_sync(exarg_T *eap, int syncing U semsg(_("E404: Illegal arguments: %s"), arg_start); else if (!finished) { - eap->nextcmd = check_nextcmd(arg_start); + set_nextcmd(eap, arg_start); redraw_curbuf_later(SOME_VALID); syn_stack_free_all(curwin->w_s); // Need to recompute all syntax. } diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim index 4a7dd60f6d8be52764a635a738a022c59a6036f5..b2e4952be089ea34c1baacd1b0b721a226741bf3 GIT binary patch literal 84304 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 F`+ve+LrVYv diff --git a/src/testdir/test_usercommands.vim b/src/testdir/test_usercommands.vim --- a/src/testdir/test_usercommands.vim +++ b/src/testdir/test_usercommands.vim @@ -645,6 +645,14 @@ func Test_usercmd_with_block() echo 'hello' END call CheckScriptFailure(lines, 'E1026:') + + let lines =<< trim END + command BarCommand { + echo 'hello' | echo 'there' + } + BarCommand + END + call CheckScriptFailure(lines, 'E1231:') endfunc " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/userfunc.c b/src/userfunc.c --- a/src/userfunc.c +++ b/src/userfunc.c @@ -3842,7 +3842,7 @@ define_function(exarg_T *eap, char_u *na { if (!eap->skip) list_functions(NULL); - eap->nextcmd = check_nextcmd(eap->arg); + set_nextcmd(eap, eap->arg); return NULL; } @@ -3869,7 +3869,7 @@ define_function(exarg_T *eap, char_u *na } if (*p == '/') ++p; - eap->nextcmd = check_nextcmd(p); + set_nextcmd(eap, p); return NULL; } @@ -3947,7 +3947,7 @@ define_function(exarg_T *eap, char_u *na semsg(_(e_trailing_arg), p); goto ret_free; } - eap->nextcmd = check_nextcmd(p); + set_nextcmd(eap, p); if (eap->nextcmd != NULL) *p = NUL; if (!eap->skip && !got_int) @@ -4655,7 +4655,7 @@ ex_delfunction(exarg_T *eap) semsg(_(e_trailing_arg), p); return; } - eap->nextcmd = check_nextcmd(p); + set_nextcmd(eap, p); if (eap->nextcmd != NULL) *p = NUL; @@ -4844,7 +4844,7 @@ ex_return(exarg_T *eap) if (returning) eap->nextcmd = NULL; else if (eap->nextcmd == NULL) // no argument - eap->nextcmd = check_nextcmd(arg); + set_nextcmd(eap, arg); if (eap->skip) --emsg_skip; @@ -5004,7 +5004,7 @@ ex_call(exarg_T *eap) } } else - eap->nextcmd = check_nextcmd(arg); + set_nextcmd(eap, arg); } end: diff --git a/src/version.c b/src/version.c --- 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 */ /**/ + 3297, +/**/ 3296, /**/ 3295, diff --git a/src/vim9compile.c b/src/vim9compile.c --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -5691,7 +5691,7 @@ compile_nested_function(exarg_T *eap, cc name_end = skip_regexp(name_start + 1, '/', TRUE); if (*name_end == '/') ++name_end; - eap->nextcmd = check_nextcmd(name_end); + set_nextcmd(eap, name_end); } if (name_end == name_start || *skipwhite(name_end) != '(') { diff --git a/src/vim9script.c b/src/vim9script.c --- a/src/vim9script.c +++ b/src/vim9script.c @@ -311,7 +311,7 @@ ex_import(exarg_T *eap) cmd_end = handle_import(eap->arg, NULL, current_sctx.sc_sid, &evalarg, NULL); if (cmd_end != NULL) - eap->nextcmd = check_nextcmd(cmd_end); + set_nextcmd(eap, cmd_end); clear_evalarg(&evalarg, eap); }