diff src/ex_cmds2.c @ 8526:981cc3bef9f3 v7.4.1553

commit https://github.com/vim/vim/commit/8dcf259d904cfb965d31841dc74a5cfaf5a351d9 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Mar 12 22:47:14 2016 +0100 patch 7.4.1553 Problem: ":runtime" does not use 'packpath'. Solution: Add "what" argument.
author Christian Brabandt <cb@256bit.org>
date Sat, 12 Mar 2016 23:00:04 +0100
parents 2f57bbe870ea
children 63dc856bd13d
line wrap: on
line diff
--- 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 (done == FAIL && (flags & DIP_START))
+    if ((flags & DIP_NORTP) == 0)
+	done = do_in_path(p_rtp, name, flags, callback, cookie);
+
+    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);