changeset 8520:b4350a4d1e01 v7.4.1550

commit https://github.com/vim/vim/commit/2d8f56acb32428d0f965d42dd13b27100b46fa15 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Mar 12 20:34:27 2016 +0100 patch 7.4.1550 Problem: Cannot load packages early. Solution: Add the ":packloadall" command.
author Christian Brabandt <cb@256bit.org>
date Sat, 12 Mar 2016 20:45:04 +0100
parents 5652fbdda911
children 2f5f0cb87906
files src/ex_cmds.h src/ex_cmds2.c src/main.c src/proto/ex_cmds2.pro src/testdir/test_packadd.vim src/version.c
diffstat 6 files changed, 33 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/ex_cmds.h
+++ b/src/ex_cmds.h
@@ -1014,6 +1014,9 @@ EX(CMD_print,		"print",	ex_print,
 EX(CMD_packadd,		"packadd",	ex_packadd,
 			BANG|FILE1|NEEDARG|TRLBAR|SBOXOK|CMDWIN,
 			ADDR_LINES),
+EX(CMD_packloadall,	"packloadall",	ex_packloadall,
+			BANG|TRLBAR|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_pclose,		"pclose",	ex_pclose,
 			BANG|TRLBAR,
 			ADDR_LINES),
--- a/src/ex_cmds2.c
+++ b/src/ex_cmds2.c
@@ -3189,14 +3189,21 @@ theend:
     vim_free(ffname);
 }
 
+static int did_source_packages = FALSE;
+
 /*
+ * ":packloadall"
  * Find plugins in the package directories and source them.
  */
     void
-source_packages()
+ex_packloadall(exarg_T *eap)
 {
-    do_in_path(p_pp, (char_u *)"pack/*/start/*", DIP_ALL + DIP_DIR,
+    if (!did_source_packages || (eap != NULL && eap->forceit))
+    {
+	did_source_packages = TRUE;
+	do_in_path(p_pp, (char_u *)"pack/*/start/*", DIP_ALL + DIP_DIR,
 							add_pack_plugin, p_pp);
+    }
 }
 
 /*
--- a/src/main.c
+++ b/src/main.c
@@ -634,7 +634,7 @@ vim_main2(int argc UNUSED, char **argv U
 # endif
 	TIME_MSG("loading plugins");
 
-	source_packages();
+	ex_packloadall(NULL);
 	TIME_MSG("loading packages");
     }
 #endif
--- a/src/proto/ex_cmds2.pro
+++ b/src/proto/ex_cmds2.pro
@@ -62,8 +62,7 @@ void ex_compiler(exarg_T *eap);
 void ex_runtime(exarg_T *eap);
 int source_runtime(char_u *name, int all);
 int do_in_runtimepath(char_u *name, int all, void (*callback)(char_u *fname, void *ck), void *cookie);
-void source_packages(void);
-void ex_loadplugin(exarg_T *eap);
+void ex_packloadall(exarg_T *eap);
 void ex_packadd(exarg_T *eap);
 void ex_options(exarg_T *eap);
 void ex_source(exarg_T *eap);
--- a/src/testdir/test_packadd.vim
+++ b/src/testdir/test_packadd.vim
@@ -80,3 +80,20 @@ func Test_packadd_completion()
   call assert_equal("packadd pluginC", li[2])
   call assert_equal("packadd ", li[3])
 endfunc
+
+func Test_packloadall()
+  let plugindir = &packpath . '/pack/mine/start/foo/plugin'
+  call mkdir(plugindir, 'p')
+  call writefile(['let g:plugin_foo_number = 1234'], plugindir . '/bar.vim')
+  packloadall
+  call assert_equal(1234, g:plugin_foo_number)
+
+  " only works once
+  call writefile(['let g:plugin_bar_number = 4321'], plugindir . '/bar2.vim')
+  packloadall
+  call assert_false(exists('g:plugin_bar_number'))
+
+  " works when ! used
+  packloadall!
+  call assert_equal(4321, g:plugin_bar_number)
+endfunc
--- a/src/version.c
+++ b/src/version.c
@@ -744,6 +744,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1550,
+/**/
     1549,
 /**/
     1548,