]> granicus.if.org Git - vim/commitdiff
patch 7.4.1553 v7.4.1553
authorBram Moolenaar <Bram@vim.org>
Sat, 12 Mar 2016 21:47:14 +0000 (22:47 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 12 Mar 2016 21:47:14 +0000 (22:47 +0100)
Problem:    ":runtime" does not use 'packpath'.
Solution:   Add "what" argument.

runtime/doc/repeat.txt
src/ex_cmds2.c
src/testdir/test_packadd.vim
src/version.c
src/vim.h

index 28a17ae114933bd6782cd08ba98565d0bc945fb3..9399e1f237c4e71d39856761953fac98c43d4fd1 100644 (file)
@@ -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 ~
index b99d0020ee015015c86d9224288a7eeab6009f45..d7bf60901e6832f439e2761e98178a07c699f2dd 100644 (file)
@@ -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);
index 3ca8375fc903cfee266c1856ba4b402114334bbf..52e6a33cab4e773f1738e7bf637a227407ef379a 100644 (file)
@@ -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
index d77d4805bc295ba309b2269c84d61d6baf81f8f2..ed6e4b2ead07b30cc9dbc796e8ce6fef2dacb4eb 100644 (file)
@@ -743,6 +743,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1553,
 /**/
     1552,
 /**/
index becc26a692c630c016c3cfd049d6c40dc4bfd857..9e4406afc717cbb2d85ae3a4e1039e8e86731c57 100644 (file)
--- 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 */