John Beckett wrote:
> Dominique Pellé wrote:
>> It works for me on Linux too. I don't have Windows to test.
>> I don't see why it would not work on Windows at first sight.
>
> I have just performed some tests on Windows XP:
>
> These work (pressing Tab provides argument completion):
> :command! -nargs=* -complete=file Xfil :echo <q-args>
> :command! -nargs=* -complete=syntax Xsyn :echo <q-args>
> :command! -nargs=* -complete=environment Xenv :echo <q-args>
>
> This fails (pressing Tab for completion does nothing):
> :command! -nargs=* -complete=filetype Xft :echo <q-args>
>
> The reason filetype completion fails on Windows is that
> dos_expandpath() in misc1.c is asked to expand text like
> "C:\.../vimfiles/{syntax,indent,ftplugin}/*.vim".
>
> The "{dir1,dir2}" syntax is handled by the operating system on
> Unix based systems, but not on Windows.
>
> John
Thanks John. You're probably right about the {dir1,dir2}
glob expression not being portable.
Attached patch avoids such glob expression and should
thus be more portable. I can only test it on Linux so I would
appreciate if someone else can confirm that it fixes the bug
on Windows.
Regards
-- Dominique
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
diff -r f43c2f39001f src/ex_getln.c
--- a/src/ex_getln.c Mon Jun 20 05:02:58 2011 +0200
+++ b/src/ex_getln.c Sat Jun 25 16:08:27 2011 +0200
@@ -110,7 +110,7 @@
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 @@
|| 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 @@
/*
* 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 may contain multiple multiple directories.
*/
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 *), 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)(pat_len + 1 + STRLEN(dirnames[i]) + 6));
+ 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] =
- vim_strnsave(s, (int)(e - s - 4));
- ++ga.ga_len;
+ ga_clear_strings(&ga);
+ return FAIL;
}
- if (*e != NUL)
- ++e;
+ 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;
+ }
+ 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;