summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2010-07-29 20:59:59 +0200
committerBram Moolenaar <Bram@vim.org>2010-07-29 20:59:59 +0200
commit1587a1e37db85425ae77054ab681a0bbb0d1affb (patch)
tree9223f33554da18ddc125929c4345d95ec1f1ed45 /src
parent8ada2cca0a6f0135441c520cac269468928e65ef (diff)
Add completion for ":ownsyntax" and improve completion for ":filetype".
(Dominique Pelle)
Diffstat (limited to 'src')
-rw-r--r--src/ex_docmd.c6
-rw-r--r--src/ex_getln.c24
-rw-r--r--src/misc1.c48
-rw-r--r--src/proto/misc1.pro1
-rw-r--r--src/vim.h3
5 files changed, 50 insertions, 32 deletions
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 2b63c08505..c4732f7048 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -3831,8 +3831,12 @@ set_one_cmd_context(xp, buff)
xp->xp_pattern = arg;
break;
- case CMD_setfiletype:
case CMD_ownsyntax:
+ xp->xp_context = EXPAND_OWNSYNTAX;
+ xp->xp_pattern = arg;
+ break;
+
+ case CMD_setfiletype:
xp->xp_context = EXPAND_FILETYPE;
xp->xp_pattern = arg;
break;
diff --git a/src/ex_getln.c b/src/ex_getln.c
index dfd163dfe0..b292f63916 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -4116,6 +4116,7 @@ addstar(fname, len, context)
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 @@ ExpandFromContext(xp, pat, num_file, file, options)
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_FILETYPE)
+ 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);
@@ -4944,14 +4947,16 @@ ExpandUserList(xp, num_file, file)
/*
* 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;
{
char_u *all;
char_u *s;
@@ -4960,10 +4965,10 @@ ExpandRTDir(pat, num_file, file, dirname)
*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)
@@ -4991,6 +4996,13 @@ ExpandRTDir(pat, num_file, file, dirname)
++e;
}
vim_free(all);
+
+ /* Sort and remove duplicates which can happen when specifying multiple
+ * directories in dirnames such as "{syntax,ftplugin,indent}".
+ */
+ sort_strings((char_u **)ga.ga_data, ga.ga_len);
+ remove_duplicates(&ga);
+
*file = ga.ga_data;
*num_file = ga.ga_len;
return OK;
diff --git a/src/misc1.c b/src/misc1.c
index c6ac00157b..9b8bbf12d8 100644
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -9238,7 +9238,6 @@ unix_expandpath(gap, path, wildoff, flags, didstar)
#if defined(FEAT_SEARCHPATH)
static int find_previous_pathsep __ARGS((char_u *path, char_u **psep));
static int is_unique __ARGS((char_u *maybe_unique, garray_T *gap, int i));
-static void remove_duplicates __ARGS((garray_T *gap));
static void expand_path_option __ARGS((char_u *curdir, garray_T *gap));
static char_u *get_path_cutoff __ARGS((char_u *fname, garray_T *gap));
static void uniquefy_paths __ARGS((garray_T *gap, char_u *pattern));
@@ -9302,29 +9301,6 @@ is_unique(maybe_unique, gap, i)
}
/*
- * Remove adjacent duplicate entries from "gap", which is a list of file names
- * in allocated memory.
- */
- static void
-remove_duplicates(gap)
- garray_T *gap;
-{
- int i;
- int j;
- char_u **fnames = (char_u **)gap->ga_data;
-
- for (i = 1; i < gap->ga_len; ++i)
- if (fnamecmp(fnames[i - 1], fnames[i]) == 0)
- {
- vim_free(fnames[i]);
- for (j = i + 1; j < gap->ga_len; ++j)
- fnames[j - 1] = fnames[j];
- --gap->ga_len;
- --i;
- }
-}
-
-/*
* Split the 'path' option to a an array of strings as garray_T. Relative
* paths are expanded to their equivalent fullpath. This includes the "."
* (relative to current buffer directory) and empty path (relative to current
@@ -9642,6 +9618,30 @@ expand_in_path(gap, pattern, flags)
}
#endif
+#if defined(FEAT_SEARCHPATH) || defined(FEAT_CMDL_COMPL) || defined(PROTO)
+/*
+ * Remove adjacent duplicate entries from "gap", which is a list of file names
+ * in allocated memory.
+ */
+ void
+remove_duplicates(gap)
+ garray_T *gap;
+{
+ int i;
+ int j;
+ char_u **fnames = (char_u **)gap->ga_data;
+
+ for (i = gap->ga_len - 1; i > 0; --i)
+ if (fnamecmp(fnames[i - 1], fnames[i]) == 0)
+ {
+ vim_free(fnames[i]);
+ for (j = i + 1; j < gap->ga_len; ++j)
+ fnames[j - 1] = fnames[j];
+ --gap->ga_len;
+ }
+}
+#endif
+
/*
* Generic wildcard expansion code.
*
diff --git a/src/proto/misc1.pro b/src/proto/misc1.pro
index 2a7b87ee94..93bfff60d4 100644
--- a/src/proto/misc1.pro
+++ b/src/proto/misc1.pro
@@ -90,6 +90,7 @@ int expand_wildcards_eval __ARGS((char_u **pat, int *num_file, char_u ***file, i
int expand_wildcards __ARGS((int num_pat, char_u **pat, int *num_file, char_u ***file, int flags));
int match_suffix __ARGS((char_u *fname));
int unix_expandpath __ARGS((garray_T *gap, char_u *path, int wildoff, int flags, int didstar));
+void remove_duplicates __ARGS((garray_T *gap));
int gen_expand_wildcards __ARGS((int num_pat, char_u **pat, int *num_file, char_u ***file, int flags));
void addfile __ARGS((garray_T *gap, char_u *f, int flags));
char_u *get_cmd_output __ARGS((char_u *cmd, char_u *infile, int flags));
diff --git a/src/vim.h b/src/vim.h
index 38bd0eff3c..b9ce325539 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -774,7 +774,8 @@ extern char *(*dyn_libintl_textdomain)(const char *domainname);
#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