changeset 15442:3e2e1608efa4 v8.1.0729

patch 8.1.0729: there is a SourcePre autocommand event but not a SourcePost commit https://github.com/vim/vim/commit/2b6185287adf53343ed5f49e967ae402c64063e4 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Jan 12 13:26:03 2019 +0100 patch 8.1.0729: there is a SourcePre autocommand event but not a SourcePost Problem: There is a SourcePre autocommand event but not a SourcePost. Solution: Add the SourcePost autocommand event. (closes https://github.com/vim/vim/issues/3739)
author Bram Moolenaar <Bram@vim.org>
date Sat, 12 Jan 2019 13:30:07 +0100
parents a221a96aaa05
children c36361e6f206
files runtime/doc/autocmd.txt src/ex_cmds2.c src/fileio.c src/testdir/Make_all.mak src/testdir/test_source.vim src/version.c src/vim.h
diffstat 7 files changed, 63 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/autocmd.txt
+++ b/runtime/doc/autocmd.txt
@@ -925,6 +925,12 @@ ShellFilterPost			After executing a shel
 							*SourcePre*
 SourcePre			Before sourcing a Vim script. |:source|
 				<afile> is the name of the file being sourced.
+							*SourcePost*
+SourcePost			After sourcing a Vim script. |:source|
+				<afile> is the name of the file being sourced.
+				Not triggered when sourcing was interrupted.
+				Also triggered after a SourceCmd autocommand
+				was triggered.
 							*SourceCmd*
 SourceCmd			When sourcing a Vim script. |:source|
 				<afile> is the name of the file being sourced.
--- a/src/ex_cmds2.c
+++ b/src/ex_cmds2.c
@@ -4360,6 +4360,7 @@ do_source(
 #ifdef FEAT_PROFILE
     proftime_T		    wait_start;
 #endif
+    int			    trigger_source_post = FALSE;
 
     p = expand_env_save(fname);
     if (p == NULL)
@@ -4384,6 +4385,10 @@ do_source(
 #else
 	retval = OK;
 #endif
+	if (retval == OK)
+	    // Apply SourcePost autocommands.
+	    apply_autocmds(EVENT_SOURCEPOST, fname_exp, fname_exp,
+								FALSE, curbuf);
 	goto theend;
     }
 
@@ -4653,6 +4658,9 @@ do_source(
     }
 #endif
 
+    if (!got_int)
+	trigger_source_post = TRUE;
+
 #ifdef FEAT_EVAL
     /*
      * After a "finish" in debug mode, need to break at first command of next
@@ -4679,6 +4687,10 @@ almosttheend:
     convert_setup(&cookie.conv, NULL, NULL);
 #endif
 
+    if (trigger_source_post)
+	apply_autocmds(EVENT_SOURCEPOST, si->sn_name, si->sn_name,
+								FALSE, curbuf);
+
 theend:
     vim_free(fname_exp);
     return retval;
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -7795,8 +7795,9 @@ static struct event_name
     {"SessionLoadPost",	EVENT_SESSIONLOADPOST},
     {"ShellCmdPost",	EVENT_SHELLCMDPOST},
     {"ShellFilterPost",	EVENT_SHELLFILTERPOST},
+    {"SourceCmd",	EVENT_SOURCECMD},
     {"SourcePre",	EVENT_SOURCEPRE},
-    {"SourceCmd",	EVENT_SOURCECMD},
+    {"SourcePost",	EVENT_SOURCEPOST},
     {"SpellFileMissing",EVENT_SPELLFILEMISSING},
     {"StdinReadPost",	EVENT_STDINREADPOST},
     {"StdinReadPre",	EVENT_STDINREADPRE},
--- a/src/testdir/Make_all.mak
+++ b/src/testdir/Make_all.mak
@@ -222,6 +222,7 @@ NEW_TESTS = \
 	test_signs \
 	test_smartindent \
 	test_sort \
+	test_source \
 	test_source_utf8 \
 	test_spell \
 	test_startup \
@@ -376,6 +377,7 @@ NEW_TESTS_RES = \
 	test_shortpathname.res \
 	test_signs.res \
 	test_smartindent.res \
+	test_source.res \
 	test_spell.res \
 	test_startup.res \
 	test_stat.res \
new file mode 100644
--- /dev/null
+++ b/src/testdir/test_source.vim
@@ -0,0 +1,38 @@
+" Tests for the :source command.
+
+func Test_source_autocmd()
+  call writefile([
+	\ 'let did_source = 1',
+	\ ], 'Xsourced')
+  au SourcePre *source* let did_source_pre = 1
+  au SourcePost *source* let did_source_post = 1
+
+  source Xsourced
+
+  call assert_equal(g:did_source, 1)
+  call assert_equal(g:did_source_pre, 1)
+  call assert_equal(g:did_source_post, 1)
+
+  call delete('Xsourced')
+  au! SourcePre
+  au! SourcePost
+  unlet g:did_source
+  unlet g:did_source_pre
+  unlet g:did_source_post
+endfunc
+
+func Test_source_cmd()
+  au SourceCmd *source* let did_source = expand('<afile>')
+  au SourcePre *source* let did_source_pre = 2
+  au SourcePost *source* let did_source_post = 2
+
+  source Xsourced
+
+  call assert_equal(g:did_source, 'Xsourced')
+  call assert_false(exists('g:did_source_pre'))
+  call assert_equal(g:did_source_post, 2)
+
+  au! SourceCmd
+  au! SourcePre
+  au! SourcePost
+endfunc
--- a/src/version.c
+++ b/src/version.c
@@ -796,6 +796,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    729,
+/**/
     728,
 /**/
     727,
--- a/src/vim.h
+++ b/src/vim.h
@@ -1324,6 +1324,7 @@ enum auto_event
     EVENT_SHELLFILTERPOST,	// after ":1,2!cmd", ":w !cmd", ":r !cmd".
     EVENT_SOURCECMD,		// sourcing a Vim script using command
     EVENT_SOURCEPRE,		// before sourcing a Vim script
+    EVENT_SOURCEPOST,		// after sourcing a Vim script
     EVENT_SPELLFILEMISSING,	// spell file missing
     EVENT_STDINREADPOST,	// after reading from stdin
     EVENT_STDINREADPRE,		// before reading from stdin