# HG changeset patch # User Christian Brabandt # Date 1457811904 -3600 # Node ID b4350a4d1e01cc8accc9352685e65120ac2b813f # Parent 5652fbdda9112cee40be4d974180f0cc5cdd628d commit https://github.com/vim/vim/commit/2d8f56acb32428d0f965d42dd13b27100b46fa15 Author: Bram Moolenaar Date: Sat Mar 12 20:34:27 2016 +0100 patch 7.4.1550 Problem: Cannot load packages early. Solution: Add the ":packloadall" command. diff --git a/src/ex_cmds.h b/src/ex_cmds.h --- 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), diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c --- 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); + } } /* diff --git a/src/main.c b/src/main.c --- 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 diff --git a/src/proto/ex_cmds2.pro b/src/proto/ex_cmds2.pro --- 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); diff --git a/src/testdir/test_packadd.vim b/src/testdir/test_packadd.vim --- 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 diff --git a/src/version.c b/src/version.c --- 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,