# HG changeset patch # User Bram Moolenaar # Date 1627822805 -7200 # Node ID 05f9e8f2016c599b1ad0ab2ad5ef604d44c10fe2 # Parent 66d8f0116a766fb19e2ec085502ef256ae3a6a0d patch 8.2.3268: cannot use a block with :autocmd like with :command Commit: https://github.com/vim/vim/commit/73b8b0ae3acac220e823076f8ca1c14524ed96dd Author: Bram Moolenaar Date: Sun Aug 1 14:52:32 2021 +0200 patch 8.2.3268: cannot use a block with :autocmd like with :command Problem: Cannot use a block with :autocmd like with :command. Solution: Add support for a {} block after :autocmd. (closes https://github.com/vim/vim/issues/8620) diff --git a/runtime/doc/autocmd.txt b/runtime/doc/autocmd.txt --- a/runtime/doc/autocmd.txt +++ b/runtime/doc/autocmd.txt @@ -76,6 +76,12 @@ and in a `:def` function) then {cmd} wil script. Thus this depends on where the autocmd is defined, not where it is triggered. +{cmd} can use a block, like with `:command`, see |:command-repl|. Example: > + au BufReadPost *.xml { + setlocal matchpairs+=<:> + / :augroup mine | au! BufRead | augroup END diff --git a/runtime/doc/map.txt b/runtime/doc/map.txt --- a/runtime/doc/map.txt +++ b/runtime/doc/map.txt @@ -1,4 +1,4 @@ -*map.txt* For Vim version 8.2. Last change: 2021 Jul 28 +*map.txt* For Vim version 8.2. Last change: 2021 Aug 01 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1571,7 +1571,7 @@ feature. Use the full name for new scri Replacement text ~ - + *:command-repl* The {repl} argument is normally one long string, possibly with "|" separated commands. A special case is when the argument is "{", then the following lines, up to a line starting with "}" are used and |Vim9| syntax applies. @@ -1580,8 +1580,8 @@ Example: > echo 'hello' g:calledMyCommand = true } -No nesting is supported. Using `:normal` directly does not work, you can use -it indirectly with `:execute`. +No nesting is supported, inline functions cannot be used. Using `:normal` +directly does not work, you can use it indirectly with `:execute`. 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/autocmd.c b/src/autocmd.c --- a/src/autocmd.c +++ b/src/autocmd.c @@ -258,7 +258,7 @@ static int au_need_clean = FALSE; // n static char_u *event_nr2name(event_T event); static int au_get_grouparg(char_u **argp); -static int do_autocmd_event(event_T event, char_u *pat, int once, int nested, char_u *cmd, int forceit, int group); +static int do_autocmd_event(event_T event, char_u *pat, int once, int nested, char_u *cmd, int forceit, int group, int flags); static int apply_autocmds_group(event_T event, char_u *fname, char_u *fname_io, int force, int group, buf_T *buf, exarg_T *eap); static void auto_next_pat(AutoPatCmd *apc, int stop_at_last); static int au_find_group(char_u *name); @@ -615,7 +615,7 @@ free_all_autocmds(void) for (current_augroup = -1; current_augroup < augroups.ga_len; ++current_augroup) - do_autocmd((char_u *)"", TRUE); + do_autocmd(NULL, (char_u *)"", TRUE); for (i = 0; i < augroups.ga_len; ++i) { @@ -823,20 +823,23 @@ au_event_restore(char_u *old_ei) * :autocmd * *.c show all autocommands for *.c files. * * Mostly a {group} argument can optionally appear before . + * "eap" can be NULL. */ void -do_autocmd(char_u *arg_in, int forceit) +do_autocmd(exarg_T *eap, char_u *arg_in, int forceit) { char_u *arg = arg_in; char_u *pat; char_u *envpat = NULL; char_u *cmd; + int cmd_need_free = FALSE; event_T event; - int need_free = FALSE; + char_u *tofree = NULL; int nested = FALSE; int once = FALSE; int group; int i; + int flags = 0; if (*arg == '|') { @@ -935,10 +938,14 @@ do_autocmd(char_u *arg_in, int forceit) */ if (*cmd != NUL) { + if (eap != NULL) + // Read a {} block if it follows. + cmd = may_get_cmd_block(eap, cmd, &tofree, &flags); + cmd = expand_sfile(cmd); if (cmd == NULL) // some error return; - need_free = TRUE; + cmd_need_free = TRUE; } } @@ -962,19 +969,20 @@ do_autocmd(char_u *arg_in, int forceit) for (event = (event_T)0; (int)event < (int)NUM_EVENTS; event = (event_T)((int)event + 1)) if (do_autocmd_event(event, pat, - once, nested, cmd, forceit, group) == FAIL) + once, nested, cmd, forceit, group, flags) == FAIL) break; } else { while (*arg && *arg != '|' && !VIM_ISWHITE(*arg)) if (do_autocmd_event(event_name2nr(arg, &arg), pat, - once, nested, cmd, forceit, group) == FAIL) + once, nested, cmd, forceit, group, flags) == FAIL) break; } - if (need_free) + if (cmd_need_free) vim_free(cmd); + vim_free(tofree); vim_free(envpat); } @@ -1024,7 +1032,8 @@ do_autocmd_event( int nested, char_u *cmd, int forceit, - int group) + int group, + int flags) { AutoPat *ap; AutoPat **prev_ap; @@ -1251,6 +1260,8 @@ do_autocmd_event( return FAIL; ac->cmd = vim_strsave(cmd); ac->script_ctx = current_sctx; + if (flags & UC_VIM9) + ac->script_ctx.sc_version = SCRIPT_VERSION_VIM9; #ifdef FEAT_EVAL ac->script_ctx.sc_lnum += SOURCING_LNUM; #endif diff --git a/src/ex_docmd.c b/src/ex_docmd.c --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -5203,7 +5203,7 @@ ex_autocmd(exarg_T *eap) _(e_command_not_allowed_from_vimrc_in_current_dir_or_tag_search); } else if (eap->cmdidx == CMD_autocmd) - do_autocmd(eap->arg, eap->forceit); + do_autocmd(eap, eap->arg, eap->forceit); else do_augroup(eap->arg, eap->forceit); } diff --git a/src/proto/autocmd.pro b/src/proto/autocmd.pro --- a/src/proto/autocmd.pro +++ b/src/proto/autocmd.pro @@ -6,7 +6,7 @@ void free_all_autocmds(void); int check_ei(void); char_u *au_event_disable(char *what); void au_event_restore(char_u *old_ei); -void do_autocmd(char_u *arg_in, int forceit); +void do_autocmd(exarg_T *eap, char_u *arg_in, int forceit); int do_doautocmd(char_u *arg, int do_msg, int *did_something); void ex_doautoall(exarg_T *eap); int check_nomodeline(char_u **argp); diff --git a/src/proto/usercmd.pro b/src/proto/usercmd.pro --- a/src/proto/usercmd.pro +++ b/src/proto/usercmd.pro @@ -10,6 +10,7 @@ char_u *get_user_cmd_complete(expand_T * int cmdcomplete_str_to_type(char_u *complete_str); char *uc_fun_cmd(void); int parse_compl_arg(char_u *value, int vallen, int *complp, long *argt, char_u **compl_arg); +char_u *may_get_cmd_block(exarg_T *eap, char_u *p, char_u **tofree, int *flags); void ex_command(exarg_T *eap); void ex_comclear(exarg_T *eap); void uc_clear(garray_T *gap); diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim index 8abf911fa8cb7f0bfb4e3ff7a70455d901cf232a..4a7dd60f6d8be52764a635a738a022c59a6036f5 GIT binary patch literal 84099 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". * Return cmdidx in "eap->cmdidx", flags in "eap->argt", idx in "eap->useridx". @@ -975,6 +972,49 @@ fail: } /* + * If "p" starts with "{" then read a block of commands until "}". + * Used for ":command" and ":autocmd". + */ + char_u * +may_get_cmd_block(exarg_T *eap, char_u *p, char_u **tofree, int *flags) +{ + char_u *retp = p; + + if (*p == '{' && ends_excmd2(eap->arg, skipwhite(p + 1)) + && eap->getline != NULL) + { + garray_T ga; + char_u *line = NULL; + + ga_init2(&ga, sizeof(char_u *), 10); + if (ga_add_string(&ga, p) == FAIL) + return retp; + + // Read lines between '{' and '}'. Does not support nesting or + // here-doc constructs. + for (;;) + { + vim_free(line); + if ((line = eap->getline(':', eap->cookie, + 0, GETLINE_CONCAT_CONTBAR)) == NULL) + { + emsg(_(e_missing_rcurly)); + break; + } + if (ga_add_string(&ga, line) == FAIL) + break; + if (*skipwhite(line) == '}') + break; + } + vim_free(line); + retp = *tofree = ga_concat_strings(&ga, "\n"); + ga_clear_strings(&ga); + *flags |= UC_VIM9; + } + return retp; +} + +/* * ":command ..." implementation */ void @@ -1043,38 +1083,7 @@ ex_command(exarg_T *eap) { char_u *tofree = NULL; - if (*p == '{' && ends_excmd2(eap->arg, skipwhite(p + 1)) - && eap->getline != NULL) - { - garray_T ga; - char_u *line = NULL; - - ga_init2(&ga, sizeof(char_u *), 10); - if (ga_add_string(&ga, p) == FAIL) - return; - - // Read lines between '{' and '}'. Does not support nesting or - // here-doc constructs. - // - for (;;) - { - vim_free(line); - if ((line = eap->getline(':', eap->cookie, - 0, GETLINE_CONCAT_CONTBAR)) == NULL) - { - emsg(_(e_missing_rcurly)); - break; - } - if (ga_add_string(&ga, line) == FAIL) - break; - if (*skipwhite(line) == '}') - break; - } - vim_free(line); - p = tofree = ga_concat_strings(&ga, "\n"); - ga_clear_strings(&ga); - flags |= UC_VIM9; - } + p = may_get_cmd_block(eap, p, &tofree, &flags); uc_add_command(name, end - name, p, argt, def, flags, compl, compl_arg, addr_type_arg, eap->forceit); 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 */ /**/ + 3268, +/**/ 3267, /**/ 3266, diff --git a/src/vim.h b/src/vim.h --- a/src/vim.h +++ b/src/vim.h @@ -2739,4 +2739,9 @@ long elapsed(DWORD start_tick); // flags for equal_type() #define ETYPE_ARG_UNKNOWN 1 +// flags used by user commands and :autocmd +#define UC_BUFFER 1 // -buffer: local to current buffer +#define UC_VIM9 2 // {} argument: Vim9 syntax. + + #endif // VIM__H