diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/nvim/ex_cmds2.c | 26 | ||||
| -rw-r--r-- | src/nvim/globals.h | 3 | ||||
| -rw-r--r-- | src/nvim/main.c | 13 | ||||
| -rw-r--r-- | src/nvim/testdir/test_startup.vim | 32 | ||||
| -rw-r--r-- | src/nvim/version.c | 2 | 
5 files changed, 65 insertions, 11 deletions
| diff --git a/src/nvim/ex_cmds2.c b/src/nvim/ex_cmds2.c index f8c470f213..df6b575c1c 100644 --- a/src/nvim/ex_cmds2.c +++ b/src/nvim/ex_cmds2.c @@ -2623,23 +2623,31 @@ theend:    xfree(ffname);  } -static bool did_source_packages = false; +/// Add all packages in the "start" directory to 'runtimepath'. +void add_pack_start_dirs(void) +{ +  do_in_path(p_pp, (char_u *)"pack/*/start/*", DIP_ALL + DIP_DIR,  // NOLINT +             add_pack_plugin, &APP_ADD_DIR); +} + +/// Load plugins from all packages in the "start" directory. +void load_start_packages(void) +{ +  did_source_packages = true; +  do_in_path(p_pp, (char_u *)"pack/*/start/*", DIP_ALL + DIP_DIR,  // NOLINT +             add_pack_plugin, &APP_LOAD); +}  // ":packloadall"  // Find plugins in the package directories and source them. -// "eap" is NULL when invoked during startup.  void ex_packloadall(exarg_T *eap)  { -  if (!did_source_packages || (eap != NULL && eap->forceit)) { -    did_source_packages = true; - +  if (!did_source_packages || eap->forceit) {      // First do a round to add all directories to 'runtimepath', then load      // the plugins. This allows for plugins to use an autoload directory      // of another plugin. -    do_in_path(p_pp, (char_u *)"pack/*/start/*", DIP_ALL + DIP_DIR,  // NOLINT -               add_pack_plugin, &APP_ADD_DIR); -    do_in_path(p_pp, (char_u *)"pack/*/start/*", DIP_ALL + DIP_DIR,  // NOLINT -               add_pack_plugin, &APP_LOAD); +    add_pack_start_dirs(); +    load_start_packages();    }  } diff --git a/src/nvim/globals.h b/src/nvim/globals.h index 13ecafcbe3..2ee72cdb6a 100644 --- a/src/nvim/globals.h +++ b/src/nvim/globals.h @@ -407,6 +407,9 @@ EXTERN int garbage_collect_at_exit INIT(= FALSE);  /* ID of script being sourced or was sourced to define the current function. */  EXTERN scid_T current_SID INIT(= 0); + +EXTERN bool did_source_packages INIT(= false); +  // Scope information for the code that indirectly triggered the current  // provider function call  EXTERN struct caller_scope { diff --git a/src/nvim/main.c b/src/nvim/main.c index a665ad1de2..6e85fbc130 100644 --- a/src/nvim/main.c +++ b/src/nvim/main.c @@ -1291,10 +1291,21 @@ static void set_window_layout(mparm_T *paramp)  static void load_plugins(void)  {    if (p_lpl) { +    // First add all package directories to 'runtimepath', so that their +    // autoload directories can be found.  Only if not done already with a +    // :packloadall command. +    if (!did_source_packages) { +      add_pack_start_dirs(); +    } +      source_runtime((char_u *)"plugin/**/*.vim", DIP_ALL | DIP_NOAFTER);  // NOLINT      TIME_MSG("loading plugins"); -    ex_packloadall(NULL); +    // Only source "start" packages if not done already with a :packloadall +    // command. +    if (!did_source_packages) { +      load_start_packages(); +    }      TIME_MSG("loading packages");      source_runtime((char_u *)"plugin/**/*.vim", DIP_ALL | DIP_AFTER); diff --git a/src/nvim/testdir/test_startup.vim b/src/nvim/testdir/test_startup.vim index 5a38178bd5..2dce7faded 100644 --- a/src/nvim/testdir/test_startup.vim +++ b/src/nvim/testdir/test_startup.vim @@ -62,6 +62,38 @@ func Test_after_comes_later()    call delete('Xafter', 'rf')  endfunc +func Test_pack_in_rtp_when_plugins_run() +  if !has('packages') +    return +  endif +  let before = [ +	\ 'set nocp viminfo+=nviminfo', +	\ 'set guioptions+=M', +	\ 'let $HOME = "/does/not/exist"', +	\ 'set loadplugins', +	\ 'set rtp=Xhere', +	\ 'set packpath=Xhere', +	\ 'set nomore', +	\ ] +  let after = [ +	\ 'quit', +	\ ] +  call mkdir('Xhere/plugin', 'p') +  call writefile(['redir! > Xtestout', 'silent set runtimepath?', 'silent! call foo#Trigger()', 'redir END'], 'Xhere/plugin/here.vim') +  call mkdir('Xhere/pack/foo/start/foobar/autoload', 'p') +  call writefile(['function! foo#Trigger()', 'echo "autoloaded foo"', 'endfunction'], 'Xhere/pack/foo/start/foobar/autoload/foo.vim') + +  if RunVim(before, after, '') + +    let lines = filter(readfile('Xtestout'), '!empty(v:val)') +    call assert_match('Xhere[/\\]pack[/\\]foo[/\\]start[/\\]foobar', get(lines, 0)) +    call assert_match('autoloaded foo', get(lines, 1)) +  endif + +  call delete('Xtestout') +  call delete('Xhere', 'rf') +endfunc +  func Test_help_arg()    if !has('unix') && has('gui')      " this doesn't work with gvim on MS-Windows diff --git a/src/nvim/version.c b/src/nvim/version.c index d4cbf32009..3313ffdfa9 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -340,7 +340,7 @@ static const int included_patches[] = {    // 615,    614,    // 613, -  // 612, +  612,    // 611,    // 610,    // 609, | 
