summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2011-06-26 19:40:23 +0200
committerBram Moolenaar <Bram@vim.org>2011-06-26 19:40:23 +0200
commit0c7437a5d2219d12d28919d16da7aad5c9a18027 (patch)
tree782b59692aa49332e236f791565c461e00fac079
parent0baa7f1cd0aad0ff011d87340e24c678853b33ca (diff)
updated for version 7.3.237v7.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)
-rw-r--r--src/ex_getln.c93
-rw-r--r--src/version.c2
2 files changed, 60 insertions, 35 deletions
diff --git a/src/ex_getln.c b/src/ex_getln.c
index d3ac8593f2..85f8cfac10 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -110,7 +110,7 @@ static int ExpandFromContext __ARGS((expand_T *xp, char_u *, int *, char_u ***,
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, file, options)
|| 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;
+ pat_len = STRLEN(pat);
+ ga_init2(&ga, (int)sizeof(char *), 10);
- ga_init2(&ga, (int)sizeof(char *), 3);
- for (s = all; *s != NUL; s = e)
+ 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)
{
- 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] =
+ 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)
+ {
+ 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
index a022ccde4c..731a46dd39 100644
--- 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,