# HG changeset patch # User Bram Moolenaar # Date 1309110023 -7200 # Node ID e3bb93df6c34da672244bce5695c1426da139614 # Parent 889e69c501d637a3607c9f102624760e7bb891c1 updated for version 7.3.237 Problem: "filetype" completion doesn't work on Windows. (Yue Wu) Solution: Don't use a glob pattern for the directories, use a list of directories. (Dominique Pelle) diff --git a/src/ex_getln.c b/src/ex_getln.c --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -110,7 +110,7 @@ static int ExpandFromContext __ARGS((exp static int expand_showtail __ARGS((expand_T *xp)); #ifdef FEAT_CMDL_COMPL static int expand_shellcmd __ARGS((char_u *filepat, int *num_file, char_u ***file, int flagsarg)); -static int ExpandRTDir __ARGS((char_u *pat, int *num_file, char_u ***file, char *dirname)); +static int ExpandRTDir __ARGS((char_u *pat, int *num_file, char_u ***file, char *dirname[])); # if defined(FEAT_USR_CMDS) && defined(FEAT_EVAL) static int ExpandUserDefined __ARGS((expand_T *xp, regmatch_T *regmatch, int *num_file, char_u ***file)); static int ExpandUserList __ARGS((expand_T *xp, int *num_file, char_u ***file)); @@ -4536,13 +4536,25 @@ ExpandFromContext(xp, pat, num_file, fil || xp->xp_context == EXPAND_TAGS_LISTFILES) return expand_tags(xp->xp_context == EXPAND_TAGS, pat, num_file, file); if (xp->xp_context == EXPAND_COLORS) - return ExpandRTDir(pat, num_file, file, "colors"); + { + char *directories[] = {"colors", NULL}; + return ExpandRTDir(pat, num_file, file, directories); + } if (xp->xp_context == EXPAND_COMPILER) - return ExpandRTDir(pat, num_file, file, "compiler"); + { + char *directories[] = {"colors", NULL}; + return ExpandRTDir(pat, num_file, file, directories); + } if (xp->xp_context == EXPAND_OWNSYNTAX) - return ExpandRTDir(pat, num_file, file, "syntax"); + { + char *directories[] = {"syntax", NULL}; + return ExpandRTDir(pat, num_file, file, directories); + } if (xp->xp_context == EXPAND_FILETYPE) - return ExpandRTDir(pat, num_file, file, "{syntax,indent,ftplugin}"); + { + char *directories[] = {"syntax", "indent", "ftplugin", NULL}; + return ExpandRTDir(pat, num_file, file, directories); + } # if defined(FEAT_USR_CMDS) && defined(FEAT_EVAL) if (xp->xp_context == EXPAND_USER_LIST) return ExpandUserList(xp, num_file, file); @@ -4995,57 +5007,68 @@ ExpandUserList(xp, num_file, file) /* * Expand color scheme, compiler or filetype names: * 'runtimepath'/{dirnames}/{pat}.vim - * dirnames may contain one directory (ex: "colorscheme") or can be a glob - * expression matching multiple directories (ex: "{syntax,ftplugin,indent}"). + * "dirnames" is an array with one or more directory names. */ static int ExpandRTDir(pat, num_file, file, dirnames) char_u *pat; int *num_file; char_u ***file; - char *dirnames; + char *dirnames[]; { - char_u *all; + char_u *matches; char_u *s; char_u *e; garray_T ga; + int i; + int pat_len; *num_file = 0; *file = NULL; - s = alloc((unsigned)(STRLEN(pat) + STRLEN(dirnames) + 7)); - if (s == NULL) - return FAIL; - sprintf((char *)s, "%s/%s*.vim", dirnames, pat); - all = globpath(p_rtp, s, 0); - vim_free(s); - if (all == NULL) - return FAIL; - - ga_init2(&ga, (int)sizeof(char *), 3); - for (s = all; *s != NUL; s = e) + pat_len = STRLEN(pat); + ga_init2(&ga, (int)sizeof(char *), 10); + + for (i = 0; dirnames[i] != NULL; ++i) { - e = vim_strchr(s, '\n'); - if (e == NULL) - e = s + STRLEN(s); - if (ga_grow(&ga, 1) == FAIL) - break; - if (e - 4 > s && STRNICMP(e - 4, ".vim", 4) == 0) + s = alloc((unsigned)(STRLEN(dirnames[i]) + pat_len + 7)); + if (s == NULL) + { + ga_clear_strings(&ga); + return FAIL; + } + sprintf((char *)s, "%s/%s*.vim", dirnames[i], pat); + matches = globpath(p_rtp, s, 0); + vim_free(s); + if (matches == NULL) + continue; + + for (s = matches; *s != NUL; s = e) { - for (s = e - 4; s > all; mb_ptr_back(all, s)) - if (*s == '\n' || vim_ispathsep(*s)) - break; - ++s; - ((char_u **)ga.ga_data)[ga.ga_len] = + e = vim_strchr(s, '\n'); + if (e == NULL) + e = s + STRLEN(s); + if (ga_grow(&ga, 1) == FAIL) + break; + if (e - 4 > s && STRNICMP(e - 4, ".vim", 4) == 0) + { + for (s = e - 4; s > matches; mb_ptr_back(matches, s)) + if (*s == '\n' || vim_ispathsep(*s)) + break; + ++s; + ((char_u **)ga.ga_data)[ga.ga_len] = vim_strnsave(s, (int)(e - s - 4)); - ++ga.ga_len; + ++ga.ga_len; + } + if (*e != NUL) + ++e; } - if (*e != NUL) - ++e; + vim_free(matches); } - vim_free(all); + if (ga.ga_len == 0) + return FAIL; /* Sort and remove duplicates which can happen when specifying multiple - * directories in dirnames such as "{syntax,ftplugin,indent}". */ + * directories in dirnames. */ remove_duplicates(&ga); *file = ga.ga_data; diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -710,6 +710,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 237, +/**/ 236, /**/ 235,