changeset 2929:e3bb93df6c34 v7.3.237

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)
author Bram Moolenaar <bram@vim.org>
date Sun, 26 Jun 2011 19:40:23 +0200
parents 889e69c501d6
children c45a38bd18a9
files src/ex_getln.c src/version.c
diffstat 2 files changed, 61 insertions(+), 36 deletions(-) [+]
line wrap: on
line diff
--- 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;
--- 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,