@@ -2901,12 +2901,38 @@ ex_compiler(exarg_T *eap)
29012901#endif
29022902
29032903/*
2904- * ":runtime {name}"
2904+ * ":runtime [what] {name}"
29052905 */
29062906 void
29072907ex_runtime (exarg_T * eap )
29082908{
2909- source_runtime (eap -> arg , eap -> forceit ? DIP_ALL : 0 );
2909+ char_u * arg = eap -> arg ;
2910+ char_u * p = skiptowhite (arg );
2911+ int len = (int )(p - arg );
2912+ int flags = eap -> forceit ? DIP_ALL : 0 ;
2913+
2914+ if (STRNCMP (arg , "START" , len ) == 0 )
2915+ {
2916+ flags += DIP_START + DIP_NORTP ;
2917+ arg = skipwhite (arg + len );
2918+ }
2919+ else if (STRNCMP (arg , "OPT" , len ) == 0 )
2920+ {
2921+ flags += DIP_OPT + DIP_NORTP ;
2922+ arg = skipwhite (arg + len );
2923+ }
2924+ else if (STRNCMP (arg , "PACK" , len ) == 0 )
2925+ {
2926+ flags += DIP_START + DIP_OPT + DIP_NORTP ;
2927+ arg = skipwhite (arg + len );
2928+ }
2929+ else if (STRNCMP (arg , "ALL" , len ) == 0 )
2930+ {
2931+ flags += DIP_START + DIP_OPT ;
2932+ arg = skipwhite (arg + len );
2933+ }
2934+
2935+ source_runtime (arg , flags );
29102936}
29112937
29122938 static void
@@ -3067,15 +3093,16 @@ do_in_runtimepath(
30673093 void (* callback )(char_u * fname , void * ck ),
30683094 void * cookie )
30693095{
3070- int done ;
3096+ int done = FAIL ;
30713097 char_u * s ;
30723098 int len ;
30733099 char * start_dir = "pack/*/start/*/%s" ;
30743100 char * opt_dir = "pack/*/opt/*/%s" ;
30753101
3076- done = do_in_path (p_rtp , name , flags , callback , cookie );
3102+ if ((flags & DIP_NORTP ) == 0 )
3103+ done = do_in_path (p_rtp , name , flags , callback , cookie );
30773104
3078- if (done == FAIL && (flags & DIP_START ))
3105+ if (( done == FAIL || ( flags & DIP_ALL )) && (flags & DIP_START ))
30793106 {
30803107 len = STRLEN (start_dir ) + STRLEN (name );
30813108 s = alloc (len );
@@ -3086,7 +3113,7 @@ do_in_runtimepath(
30863113 vim_free (s );
30873114 }
30883115
3089- if (done == FAIL && (flags & DIP_OPT ))
3116+ if (( done == FAIL || ( flags & DIP_ALL )) && (flags & DIP_OPT ))
30903117 {
30913118 len = STRLEN (opt_dir ) + STRLEN (name );
30923119 s = alloc (len );
0 commit comments