To: vim_dev@googlegroups.com
Subject: Patch 7.3.237
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
------------

Patch 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)
Files:      src/ex_getln.c
     

*** ../vim-7.3.236/src/ex_getln.c	2011-05-19 18:26:34.000000000 +0200
--- src/ex_getln.c	2011-06-26 19:36:36.000000000 +0200
***************
*** 110,116 ****
  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));
  # 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));
--- 110,116 ----
  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[]));
  # 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,4548 ****
  	    || 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");
      if (xp->xp_context == EXPAND_COMPILER)
! 	return ExpandRTDir(pat, num_file, file, "compiler");
      if (xp->xp_context == EXPAND_OWNSYNTAX)
! 	return ExpandRTDir(pat, num_file, file, "syntax");
      if (xp->xp_context == EXPAND_FILETYPE)
! 	return ExpandRTDir(pat, num_file, file, "{syntax,indent,ftplugin}");
  # if defined(FEAT_USR_CMDS) && defined(FEAT_EVAL)
      if (xp->xp_context == EXPAND_USER_LIST)
  	return ExpandUserList(xp, num_file, file);
--- 4536,4560 ----
  	    || xp->xp_context == EXPAND_TAGS_LISTFILES)
  	return expand_tags(xp->xp_context == EXPAND_TAGS, pat, num_file, file);
      if (xp->xp_context == EXPAND_COLORS)
!     {
! 	char *directories[] = {"colors", NULL};
! 	return ExpandRTDir(pat, num_file, file, directories);
!     }
      if (xp->xp_context == EXPAND_COMPILER)
!     {
! 	char *directories[] = {"colors", NULL};
! 	return ExpandRTDir(pat, num_file, file, directories);
!     }
      if (xp->xp_context == EXPAND_OWNSYNTAX)
!     {
! 	char *directories[] = {"syntax", NULL};
! 	return ExpandRTDir(pat, num_file, file, directories);
!     }
      if (xp->xp_context == EXPAND_FILETYPE)
!     {
! 	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,5051 ****
  /*
   * 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}").
   */
      static int
  ExpandRTDir(pat, num_file, file, dirnames)
      char_u	*pat;
      int		*num_file;
      char_u	***file;
!     char	*dirnames;
  {
!     char_u	*all;
      char_u	*s;
      char_u	*e;
      garray_T	ga;
  
      *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)
      {
! 	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 > 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;
  	}
! 	if (*e != NUL)
! 	    ++e;
      }
!     vim_free(all);
  
      /* Sort and remove duplicates which can happen when specifying multiple
!      * directories in dirnames such as "{syntax,ftplugin,indent}". */
      remove_duplicates(&ga);
  
      *file = ga.ga_data;
--- 5007,5074 ----
  /*
   * Expand color scheme, compiler or filetype names:
   * 'runtimepath'/{dirnames}/{pat}.vim
!  * "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_u	*matches;
      char_u	*s;
      char_u	*e;
      garray_T	ga;
+     int		i;
+     int		pat_len;
  
      *num_file = 0;
      *file = NULL;
!     pat_len = STRLEN(pat);
!     ga_init2(&ga, (int)sizeof(char *), 10);
  
!     for (i = 0; dirnames[i] != NULL; ++i)
      {
! 	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)
! 	{
! 	    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);
      }
!     if (ga.ga_len == 0)
!         return FAIL;
  
      /* Sort and remove duplicates which can happen when specifying multiple
!      * directories in dirnames. */
      remove_duplicates(&ga);
  
      *file = ga.ga_data;
*** ../vim-7.3.236/src/version.c	2011-06-26 19:13:33.000000000 +0200
--- src/version.c	2011-06-26 19:39:39.000000000 +0200
***************
*** 711,712 ****
--- 711,714 ----
  {   /* Add new patch number below this line */
+ /**/
+     237,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
230. You spend your Friday nights typing away at your keyboard

 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///
