forked from aniani/vim
patch 8.0.1398: :packadd does not load packages from the "start" directory
Problem: :packadd does not load packages from the "start" directory. (Alejandro Hernandez) Solution: Make :packadd look in the "start" directory if those packages were not loaded on startup.
This commit is contained in:
@@ -3747,18 +3747,31 @@ ex_packloadall(exarg_T *eap)
|
|||||||
void
|
void
|
||||||
ex_packadd(exarg_T *eap)
|
ex_packadd(exarg_T *eap)
|
||||||
{
|
{
|
||||||
static char *plugpat = "pack/*/opt/%s";
|
static char *plugpat = "pack/*/%s/%s";
|
||||||
int len;
|
int len;
|
||||||
char *pat;
|
char *pat;
|
||||||
|
int round;
|
||||||
|
int res = OK;
|
||||||
|
|
||||||
len = (int)STRLEN(plugpat) + (int)STRLEN(eap->arg);
|
/* Round 1: use "start", round 2: use "opt". */
|
||||||
pat = (char *)alloc(len);
|
for (round = 1; round <= 2; ++round)
|
||||||
if (pat == NULL)
|
{
|
||||||
return;
|
/* Only look under "start" when loading packages wasn't done yet. */
|
||||||
vim_snprintf(pat, len, plugpat, eap->arg);
|
if (round == 1 && did_source_packages)
|
||||||
do_in_path(p_pp, (char_u *)pat, DIP_ALL + DIP_DIR + DIP_ERR,
|
continue;
|
||||||
add_pack_plugin, eap->forceit ? &APP_ADD_DIR : &APP_BOTH);
|
|
||||||
vim_free(pat);
|
len = (int)STRLEN(plugpat) + (int)STRLEN(eap->arg) + 5;
|
||||||
|
pat = (char *)alloc(len);
|
||||||
|
if (pat == NULL)
|
||||||
|
return;
|
||||||
|
vim_snprintf(pat, len, plugpat, round == 1 ? "start" : "opt", eap->arg);
|
||||||
|
/* The first round don't give a "not found" error, in the second round
|
||||||
|
* only when nothing was found in the first round. */
|
||||||
|
res = do_in_path(p_pp, (char_u *)pat,
|
||||||
|
DIP_ALL + DIP_DIR + (round == 2 && res == FAIL ? DIP_ERR : 0),
|
||||||
|
add_pack_plugin, eap->forceit ? &APP_ADD_DIR : &APP_BOTH);
|
||||||
|
vim_free(pat);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(FEAT_EVAL) && defined(FEAT_AUTOCMD)
|
#if defined(FEAT_EVAL) && defined(FEAT_AUTOCMD)
|
||||||
|
@@ -45,6 +45,24 @@ func Test_packadd()
|
|||||||
call assert_fails("packadd", 'E471:')
|
call assert_fails("packadd", 'E471:')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_packadd_start()
|
||||||
|
let plugdir = s:topdir . '/pack/mine/start/other'
|
||||||
|
call mkdir(plugdir . '/plugin', 'p')
|
||||||
|
set rtp&
|
||||||
|
let rtp = &rtp
|
||||||
|
filetype on
|
||||||
|
|
||||||
|
exe 'split ' . plugdir . '/plugin/test.vim'
|
||||||
|
call setline(1, 'let g:plugin_works = 24')
|
||||||
|
wq
|
||||||
|
|
||||||
|
packadd other
|
||||||
|
|
||||||
|
call assert_equal(24, g:plugin_works)
|
||||||
|
call assert_true(len(&rtp) > len(rtp))
|
||||||
|
call assert_true(&rtp =~ '/testdir/Xdir/pack/mine/start/other\($\|,\)')
|
||||||
|
endfunc
|
||||||
|
|
||||||
func Test_packadd_noload()
|
func Test_packadd_noload()
|
||||||
call mkdir(s:plugdir . '/plugin', 'p')
|
call mkdir(s:plugdir . '/plugin', 'p')
|
||||||
call mkdir(s:plugdir . '/syntax', 'p')
|
call mkdir(s:plugdir . '/syntax', 'p')
|
||||||
|
@@ -771,6 +771,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1398,
|
||||||
/**/
|
/**/
|
||||||
1397,
|
1397,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user