]> granicus.if.org Git - vim/commitdiff
patch 8.1.0729: there is a SourcePre autocommand event but not a SourcePost v8.1.0729
authorBram Moolenaar <Bram@vim.org>
Sat, 12 Jan 2019 12:26:03 +0000 (13:26 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 12 Jan 2019 12:26:03 +0000 (13:26 +0100)
Problem:    There is a SourcePre autocommand event but not a SourcePost.
Solution:   Add the SourcePost autocommand event. (closes #3739)

runtime/doc/autocmd.txt
src/ex_cmds2.c
src/fileio.c
src/testdir/Make_all.mak
src/testdir/test_source.vim [new file with mode: 0644]
src/version.c
src/vim.h

index 89238d9f730650e0d13edcd4742eb4e234c226bf..b3790d5d5b81f44b5c0e7866177373520e85c0f3 100644 (file)
@@ -925,6 +925,12 @@ ShellFilterPost                    After executing a shell command with
                                                        *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.
index 74d56427cd2a8e324ac40bedaa869e9f063b3c39..4d48c1beb571d4259fb5b39af02aea5515452669 100644 (file)
@@ -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;
index fd8fd243fd5ab02123e0662ed5a86c8c4e20a77a..929cc15300ec76ffe130095fc243f80cd1568670 100644 (file)
@@ -7795,8 +7795,9 @@ static struct event_name
     {"SessionLoadPost",        EVENT_SESSIONLOADPOST},
     {"ShellCmdPost",   EVENT_SHELLCMDPOST},
     {"ShellFilterPost",        EVENT_SHELLFILTERPOST},
-    {"SourcePre",      EVENT_SOURCEPRE},
     {"SourceCmd",      EVENT_SOURCECMD},
+    {"SourcePre",      EVENT_SOURCEPRE},
+    {"SourcePost",     EVENT_SOURCEPOST},
     {"SpellFileMissing",EVENT_SPELLFILEMISSING},
     {"StdinReadPost",  EVENT_STDINREADPOST},
     {"StdinReadPre",   EVENT_STDINREADPRE},
index 8db2995721982842f185a6c82099e507497dbeb5..8d8351643fe210d8ab475de3449634ed2bdc4cfa 100644 (file)
@@ -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 \
diff --git a/src/testdir/test_source.vim b/src/testdir/test_source.vim
new file mode 100644 (file)
index 0000000..a33d286
--- /dev/null
@@ -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
index 8ef666056c74c8015e6b977f46c4537fcd08eb1f..118a867e563aab2f54759277704bbb2a603c574b 100644 (file)
@@ -795,6 +795,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    729,
 /**/
     728,
 /**/
index be86c6b10f941a40cf2d6d39ea34ffbfa2e5f0a1..150f39ce681f96c5ffd45b4ea0ea0b1e9b4f7d94 100644 (file)
--- 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