Dominique Pellé wrote:

> Please try and review the attached patch.
> It think it does what's needed and it's rather simple:
>
> :setfiletype completes using things that match
> $VIMRUNTIME/{syntax,ftplugin,indent}/*.vim and
> ~/.vim/{syntax,ftplugin,indent}/*.vim
>
> :ownsyntax behaves as before, i.e. it completes using things that
> match $VIMRUNTIME/syntax/*.vim and ~/.vim/syntax/*.vim
>
> You can verify that :ownsyntax and :setfiletype complete
> differently with this example:
>
> :setfiletype host<CTRL-D>
> hostconf     hostsaccess
>
> :ownsyntax host<CTRL-D>
> hostconf
>
> I have not done anything about the special files such as
> syntax/2html.vim. I could hard-code something to exclude
> them but it'd be ugly. Hopefully we can consider moving
> those special files.


I send this patch again with slightly more elegant way of doing it
saving 3 lines of code. Sorry for the noise.

-- 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 da067045878f src/ex_docmd.c
--- a/src/ex_docmd.c	Tue Jul 27 20:47:25 2010 +0200
+++ b/src/ex_docmd.c	Wed Jul 28 00:01:06 2010 +0200
@@ -3831,8 +3831,12 @@
 	    xp->xp_pattern = arg;
 	    break;
 
+	case CMD_ownsyntax:
+	    xp->xp_context = EXPAND_OWNSYNTAX;
+	    xp->xp_pattern = arg;
+	    break;
+
 	case CMD_setfiletype:
-	case CMD_ownsyntax:
 	    xp->xp_context = EXPAND_FILETYPE;
 	    xp->xp_pattern = arg;
 	    break;
diff -r da067045878f src/ex_getln.c
--- a/src/ex_getln.c	Tue Jul 27 20:47:25 2010 +0200
+++ b/src/ex_getln.c	Wed Jul 28 00:01:06 2010 +0200
@@ -4116,6 +4116,7 @@
 	if (context == EXPAND_HELP
 		|| context == EXPAND_COLORS
 		|| context == EXPAND_COMPILER
+		|| context == EXPAND_OWNSYNTAX
 		|| context == EXPAND_FILETYPE
 		|| (context == EXPAND_TAGS && fname[0] == '/'))
 	    retval = vim_strnsave(fname, len);
@@ -4502,8 +4503,10 @@
 	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");
+	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);
@@ -4942,28 +4945,39 @@
 }
 #endif
 
+/* Used in qsort */
+static int cmp_str(s1, s2)
+    const void *s1;
+    const void *s2;
+{
+    return STRCMP(*(char_u **)s1, *(char_u **)s2);
+}
+
 /*
  * Expand color scheme, compiler or filetype names:
- * 'runtimepath'/{dirname}/{pat}.vim
+ * '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, dirname)
+ExpandRTDir(pat, num_file, file, dirnames)
     char_u	*pat;
     int		*num_file;
     char_u	***file;
-    char	*dirname;	/* "colors", "compiler" or "syntax" */
+    char	*dirnames;	/* "colors", "compiler" or "syntax" */
 {
     char_u	*all;
     char_u	*s;
     char_u	*e;
     garray_T	ga;
+    int		i;
 
     *num_file = 0;
     *file = NULL;
-    s = alloc((unsigned)(STRLEN(pat) + STRLEN(dirname) + 7));
+    s = alloc((unsigned)(STRLEN(pat) + STRLEN(dirnames) + 7));
     if (s == NULL)
 	return FAIL;
-    sprintf((char *)s, "%s/%s*.vim", dirname, pat);
+    sprintf((char *)s, "%s/%s*.vim", dirnames, pat);
     all = globpath(p_rtp, s, 0);
     vim_free(s);
     if (all == NULL)
@@ -4993,6 +5007,26 @@
     vim_free(all);
     *file = ga.ga_data;
     *num_file = ga.ga_len;
+    
+    if (*num_file > 1)
+    {
+	/* Sort and remove dupes which can happen when specifying multiple
+	 * directories in dirnames such as "{syntax,ftplugin,indent}"
+	 */
+	qsort(*file, *num_file, sizeof(char_u *), cmp_str);
+	for (i = *num_file - 1; i > 0; i--)
+	{
+	    if (STRCMP((*file)[i - 1], (*file)[i]) == 0)
+	    {
+		/* Remove dupe (*file)[i] */
+		vim_free((*file)[i]);
+		if (*num_file - i - 1 > 0)
+		    mch_memmove(&(*file)[i], &(*file)[i + 1],
+					(*num_file - i - 1)*sizeof(char *));
+		--*num_file;
+	    }
+	}
+    }
     return OK;
 }
 
diff -r da067045878f src/vim.h
--- a/src/vim.h	Tue Jul 27 20:47:25 2010 +0200
+++ b/src/vim.h	Wed Jul 28 00:01:06 2010 +0200
@@ -774,7 +774,8 @@
 #define EXPAND_PROFILE		35
 #define EXPAND_BEHAVE		36
 #define EXPAND_FILETYPE		37
-#define EXPAND_FILES_IN_PATH    38
+#define EXPAND_FILES_IN_PATH	38
+#define EXPAND_OWNSYNTAX	39
 
 /* Values for exmode_active (0 is no exmode) */
 #define EXMODE_NORMAL		1

Reply via email to