summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2016-03-12 22:47:14 +0100
committerBram Moolenaar <Bram@vim.org>2016-03-12 22:47:14 +0100
commit8dcf259d904cfb965d31841dc74a5cfaf5a351d9 (patch)
tree39bcccbdf9fed9c4976e32bda07f3e507717ee39
parent7f8989dd8a627af2185df381195351a913f3777f (diff)
downloadvim-git-8dcf259d904cfb965d31841dc74a5cfaf5a351d9.tar.gz
patch 7.4.1553v7.4.1553
Problem: ":runtime" does not use 'packpath'. Solution: Add "what" argument.
-rw-r--r--runtime/doc/repeat.txt36
-rw-r--r--src/ex_cmds2.c39
-rw-r--r--src/testdir/test_packadd.vim47
-rw-r--r--src/version.c2
-rw-r--r--src/vim.h1
5 files changed, 114 insertions, 11 deletions
diff --git a/runtime/doc/repeat.txt b/runtime/doc/repeat.txt
index 28a17ae11..9399e1f23 100644
--- a/runtime/doc/repeat.txt
+++ b/runtime/doc/repeat.txt
@@ -182,10 +182,12 @@ For writing a Vim script, see chapter 41 of the user manual |usr_41.txt|.
{not in Vi}
*:ru* *:runtime*
-:ru[ntime][!] {file} ..
+:ru[ntime][!] [where] {file} ..
Read Ex commands from {file} in each directory given
- by 'runtimepath'. There is no error for non-existing
- files. Example: >
+ by 'runtimepath' and/or 'packpath'. There is no error
+ for non-existing files.
+
+ Example: >
:runtime syntax/c.vim
< There can be multiple {file} arguments, separated by
@@ -199,6 +201,15 @@ For writing a Vim script, see chapter 41 of the user manual |usr_41.txt|.
When it is not included only the first found file is
sourced.
+ When [where] is omitted only 'runtimepath' is used.
+ Other values:
+ START search under "start" in 'packpath'
+ OPT search under "opt" in 'packpath'
+ PACK search under "start" and "opt" in
+ 'packpath'
+ ALL first use 'runtimepath', then search
+ under "start" and "opt" in 'packpath'
+
When {file} contains wildcards it is expanded to all
matching files. Example: >
:runtime! plugin/*.vim
@@ -238,6 +249,16 @@ For writing a Vim script, see chapter 41 of the user manual |usr_41.txt|.
Also see |pack-add|.
+:packloadall[!] Load all packages in the "start" directories under
+ 'packpath'. The directories found are added to
+ 'runtimepath'.
+ This normally done during startup, after loading your
+ .vimrc file. With this command it can be done
+ earlier.
+ Packages will be loaded only once. After this command
+ it won't happen again. When the optional ! is added
+ this command will load packages even when done before.
+ See |packages|.
:scripte[ncoding] [encoding] *:scripte* *:scriptencoding* *E167*
Specify the character encoding used in the script.
@@ -461,8 +482,13 @@ Note that the files under "pack/foo/opt" or not loaded automatically, only the
ones under "pack/foo/start". See |pack-add| below for how the "opt" directory
is used.
-Loading packages will not happen if loading plugins is disabled, see
-|load-plugins|.
+Loading packages automatically will not happen if loading plugins is disabled,
+see |load-plugins|.
+
+To load packages earlier, so that 'runtimepath' gets updated: >
+ :packloadall
+This also works when loading plugins is disabled. The automatic loading will
+only happen once.
Using a single plugin and loading it automatically ~
diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c
index b99d0020e..d7bf60901 100644
--- a/src/ex_cmds2.c
+++ b/src/ex_cmds2.c
@@ -2901,12 +2901,38 @@ ex_compiler(exarg_T *eap)
#endif
/*
- * ":runtime {name}"
+ * ":runtime [what] {name}"
*/
void
ex_runtime(exarg_T *eap)
{
- source_runtime(eap->arg, eap->forceit ? DIP_ALL : 0);
+ char_u *arg = eap->arg;
+ char_u *p = skiptowhite(arg);
+ int len = (int)(p - arg);
+ int flags = eap->forceit ? DIP_ALL : 0;
+
+ if (STRNCMP(arg, "START", len) == 0)
+ {
+ flags += DIP_START + DIP_NORTP;
+ arg = skipwhite(arg + len);
+ }
+ else if (STRNCMP(arg, "OPT", len) == 0)
+ {
+ flags += DIP_OPT + DIP_NORTP;
+ arg = skipwhite(arg + len);
+ }
+ else if (STRNCMP(arg, "PACK", len) == 0)
+ {
+ flags += DIP_START + DIP_OPT + DIP_NORTP;
+ arg = skipwhite(arg + len);
+ }
+ else if (STRNCMP(arg, "ALL", len) == 0)
+ {
+ flags += DIP_START + DIP_OPT;
+ arg = skipwhite(arg + len);
+ }
+
+ source_runtime(arg, flags);
}
static void
@@ -3067,15 +3093,16 @@ do_in_runtimepath(
void (*callback)(char_u *fname, void *ck),
void *cookie)
{
- int done;
+ int done = FAIL;
char_u *s;
int len;
char *start_dir = "pack/*/start/*/%s";
char *opt_dir = "pack/*/opt/*/%s";
- done = do_in_path(p_rtp, name, flags, callback, cookie);
+ if ((flags & DIP_NORTP) == 0)
+ done = do_in_path(p_rtp, name, flags, callback, cookie);
- if (done == FAIL && (flags & DIP_START))
+ if ((done == FAIL || (flags & DIP_ALL)) && (flags & DIP_START))
{
len = STRLEN(start_dir) + STRLEN(name);
s = alloc(len);
@@ -3086,7 +3113,7 @@ do_in_runtimepath(
vim_free(s);
}
- if (done == FAIL && (flags & DIP_OPT))
+ if ((done == FAIL || (flags & DIP_ALL)) && (flags & DIP_OPT))
{
len = STRLEN(opt_dir) + STRLEN(name);
s = alloc(len);
diff --git a/src/testdir/test_packadd.vim b/src/testdir/test_packadd.vim
index 3ca8375fc..52e6a33ca 100644
--- a/src/testdir/test_packadd.vim
+++ b/src/testdir/test_packadd.vim
@@ -134,3 +134,50 @@ func Test_colorscheme()
colorscheme three
call assert_equal(1, g:found_three)
endfunc
+
+func Test_runtime()
+ let rundir = &packpath . '/runtime/extra'
+ let startdir = &packpath . '/pack/mine/start/foo/extra'
+ let optdir = &packpath . '/pack/mine/opt/bar/extra'
+ call mkdir(rundir, 'p')
+ call mkdir(startdir, 'p')
+ call mkdir(optdir, 'p')
+ call writefile(['let g:sequence .= "run"'], rundir . '/bar.vim')
+ call writefile(['let g:sequence .= "start"'], startdir . '/bar.vim')
+ call writefile(['let g:sequence .= "foostart"'], startdir . '/foo.vim')
+ call writefile(['let g:sequence .= "opt"'], optdir . '/bar.vim')
+ call writefile(['let g:sequence .= "xxxopt"'], optdir . '/xxx.vim')
+ exe 'set rtp=' . &packpath . '/runtime'
+
+ let g:sequence = ''
+ runtime extra/bar.vim
+ call assert_equal('run', g:sequence)
+ let g:sequence = ''
+ runtime START extra/bar.vim
+ call assert_equal('start', g:sequence)
+ let g:sequence = ''
+ runtime OPT extra/bar.vim
+ call assert_equal('opt', g:sequence)
+ let g:sequence = ''
+ runtime PACK extra/bar.vim
+ call assert_equal('start', g:sequence)
+ let g:sequence = ''
+ runtime! PACK extra/bar.vim
+ call assert_equal('startopt', g:sequence)
+ let g:sequence = ''
+ runtime PACK extra/xxx.vim
+ call assert_equal('xxxopt', g:sequence)
+
+ let g:sequence = ''
+ runtime ALL extra/bar.vim
+ call assert_equal('run', g:sequence)
+ let g:sequence = ''
+ runtime ALL extra/foo.vim
+ call assert_equal('foostart', g:sequence)
+ let g:sequence = ''
+ runtime! ALL extra/xxx.vim
+ call assert_equal('xxxopt', g:sequence)
+ let g:sequence = ''
+ runtime! ALL extra/bar.vim
+ call assert_equal('runstartopt', g:sequence)
+endfunc
diff --git a/src/version.c b/src/version.c
index d77d4805b..ed6e4b2ea 100644
--- 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 */
/**/
+ 1553,
+/**/
1552,
/**/
1551,
diff --git a/src/vim.h b/src/vim.h
index becc26a69..9e4406afc 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -2294,5 +2294,6 @@ int vim_main2(int argc, char **argv);
#define DIP_ERR 0x04 /* give an error message when none found. */
#define DIP_START 0x08 /* also use "start" directory in 'packpath' */
#define DIP_OPT 0x10 /* also use "opt" directory in 'packpath' */
+#define DIP_NORTP 0x20 /* do not use 'runtimepath' */
#endif /* VIM__H */