@@ -258,7 +258,7 @@ static int au_need_clean = FALSE; // need to delete marked patterns
258258
259259static char_u * event_nr2name (event_T event );
260260static int au_get_grouparg (char_u * * argp );
261- static int do_autocmd_event (event_T event , char_u * pat , int once , int nested , char_u * cmd , int forceit , int group );
261+ static int do_autocmd_event (event_T event , char_u * pat , int once , int nested , char_u * cmd , int forceit , int group , int flags );
262262static int apply_autocmds_group (event_T event , char_u * fname , char_u * fname_io , int force , int group , buf_T * buf , exarg_T * eap );
263263static void auto_next_pat (AutoPatCmd * apc , int stop_at_last );
264264static int au_find_group (char_u * name );
@@ -615,7 +615,7 @@ free_all_autocmds(void)
615615
616616 for (current_augroup = -1 ; current_augroup < augroups .ga_len ;
617617 ++ current_augroup )
618- do_autocmd ((char_u * )"" , TRUE);
618+ do_autocmd (NULL , (char_u * )"" , TRUE);
619619
620620 for (i = 0 ; i < augroups .ga_len ; ++ i )
621621 {
@@ -823,20 +823,23 @@ au_event_restore(char_u *old_ei)
823823 * :autocmd * *.c show all autocommands for *.c files.
824824 *
825825 * Mostly a {group} argument can optionally appear before <event>.
826+ * "eap" can be NULL.
826827 */
827828 void
828- do_autocmd (char_u * arg_in , int forceit )
829+ do_autocmd (exarg_T * eap , char_u * arg_in , int forceit )
829830{
830831 char_u * arg = arg_in ;
831832 char_u * pat ;
832833 char_u * envpat = NULL ;
833834 char_u * cmd ;
835+ int cmd_need_free = FALSE;
834836 event_T event ;
835- int need_free = FALSE ;
837+ char_u * tofree = NULL ;
836838 int nested = FALSE;
837839 int once = FALSE;
838840 int group ;
839841 int i ;
842+ int flags = 0 ;
840843
841844 if (* arg == '|' )
842845 {
@@ -935,10 +938,14 @@ do_autocmd(char_u *arg_in, int forceit)
935938 */
936939 if (* cmd != NUL )
937940 {
941+ if (eap != NULL )
942+ // Read a {} block if it follows.
943+ cmd = may_get_cmd_block (eap , cmd , & tofree , & flags );
944+
938945 cmd = expand_sfile (cmd );
939946 if (cmd == NULL ) // some error
940947 return ;
941- need_free = TRUE;
948+ cmd_need_free = TRUE;
942949 }
943950 }
944951
@@ -962,19 +969,20 @@ do_autocmd(char_u *arg_in, int forceit)
962969 for (event = (event_T )0 ; (int )event < (int )NUM_EVENTS ;
963970 event = (event_T )((int )event + 1 ))
964971 if (do_autocmd_event (event , pat ,
965- once , nested , cmd , forceit , group ) == FAIL )
972+ once , nested , cmd , forceit , group , flags ) == FAIL )
966973 break ;
967974 }
968975 else
969976 {
970977 while (* arg && * arg != '|' && !VIM_ISWHITE (* arg ))
971978 if (do_autocmd_event (event_name2nr (arg , & arg ), pat ,
972- once , nested , cmd , forceit , group ) == FAIL )
979+ once , nested , cmd , forceit , group , flags ) == FAIL )
973980 break ;
974981 }
975982
976- if (need_free )
983+ if (cmd_need_free )
977984 vim_free (cmd );
985+ vim_free (tofree );
978986 vim_free (envpat );
979987}
980988
@@ -1024,7 +1032,8 @@ do_autocmd_event(
10241032 int nested ,
10251033 char_u * cmd ,
10261034 int forceit ,
1027- int group )
1035+ int group ,
1036+ int flags )
10281037{
10291038 AutoPat * ap ;
10301039 AutoPat * * prev_ap ;
@@ -1251,6 +1260,8 @@ do_autocmd_event(
12511260 return FAIL ;
12521261 ac -> cmd = vim_strsave (cmd );
12531262 ac -> script_ctx = current_sctx ;
1263+ if (flags & UC_VIM9 )
1264+ ac -> script_ctx .sc_version = SCRIPT_VERSION_VIM9 ;
12541265#ifdef FEAT_EVAL
12551266 ac -> script_ctx .sc_lnum += SOURCING_LNUM ;
12561267#endif
0 commit comments