Bram Moolenaar wrote:

> Dominique Pelle wrote:
>
>> Peter Odding wrote:
>>
>> > Ingo Karkat wrote:
>> >>
>> >> Granted, most filetypes do define custom highlighting via a
>> >> $VIMRUNTIME/syntax/<filetype>.vim script. But shouldn't the filetype
>> >> completion
>> >> also take into account files from the ftplugin and syntax directories,
>> >> too?
>> >> If I for example have a custom filetype "bullettext" that defines custom
>> >> fold
>> >> and indent settings, but no highlighting, I would expect to have this
>> >> filetype
>> >> included in the completion.
>> >
>> > Like Ingo I have several custom file types under my ~/.vim/ directory that
>> > don't have an associated syntax script and visa versa.
>> >
>> > Bram Molenaar wrote:
>> >>
>> >> Aha, so the filetypes are found by looking in the syntax directory.
>> >> Well, the result is still a list of filetypes, although there can be a
>> >> few syntax files that are not a filetype (e.g. 2html.vim).  So do we let
>> >> the implementation details prevail?  Or stick to the intention?
>> >
>> > If sticking to the intention doesn't involve too much code that would IMHO
>> > be preferable to the current implementation because of the reason given
>> > above.
>> >
>> > Ideally file type completion would consider the base filenames of the Vim
>> > scripts in the system wide / user specific ftplugin / syntax / indent
>> > directories (and also their /after/ variants) but this might be too 
>> > complex?
>>
>> I can try to change the behavior.   But just to make sure I understand
>> the problems:
>>
>> :setfiletype and :ownsyntax commands currently both perform
>> completion by looking at syntax/*.vim from both $VIMRUNTIME
>> and ~/.vim/.
>>
>> That's almost fine, but it not ideal for 2 reasons:
>>
>> 1/ :setfiletype should actually complete by looking at files matching
>>   {syntax,ftplugin,indent}/*.vim from both $VIMRUNTIME/ and ~/.vim/
>>   :ownsyntax completion should only look at syntax/*.vim (as it does now).
>>
>> 2/ there are a few files matching syntax/*.vim which are not syntax
>>    files such as 2html.vim, syntax.vim, colortest.vim... They can thus
>>    show up as a spurious completion results.  These special files are
>>    listed in syntax/README.txt. Any reasons for them to be in the
>>    syntax/ directory?
>
> Historic reasons.  I think it's not much of a problem, one would simply
> not select these as the desired filetype.  Moving them elsewhere will
> break scripts.
>
>> In practice, current implementation is almost fine since almost
>> all files matching $VIMRUNTIME/{ftplugin,indent}/*.vim have a
>> corresponding file matching $VIMRUNTIME/syntax/*.vim.  Using
>> the following commands...
>>
>> $ cd /usr/local/share/vim/vim73c
>> $ vim -d <(cd syntax/; ls *.vim) <(cd ftplugin/; ls *.vim)
>> $ vim -d <(cd syntax/; ls *.vim) <(cd indent/; ls *.vim)
>>
>> ... I see only 3 files matching ftplugin/*.vim which do not correspond
>> to any file syntax/*.vim
>>
>> - ftplugin/hostaccess.vim
>> - ftplugin/quickfix.vim
>> - ftplugin/AppendMatchGroup.vim:   this file does not look
>>   like a file type plugin anyway. It appears to contain a helper
>>   function. Should it really be there?
>
> That should be an autoload script.  I don't think that was possible when
> it was written.  I'll ping the author, but it's been a long time.
>
>> And 1 file matching index/*.vim which has no corresponding files
>> matching syntax/*.vim:
>>
>> - indent/GenericIndent.vim: this file is not an indent file but
>>   contains helper functions. Should it be stored somewhere else?
>
> It's from the same author.
>
>> I don't think this is a blocker for the release but Bram can decide :-)
>
> I think that users will be disappointed when the filetype they were
> looking for does not show up in completion.  It's not so bad if a few
> more choices pop up, a user can simply skip over them.
>
> We need to keep performance in mind, completion is being done
> interactive.  But the syntax directory is the biggest one, adding indent
> and ftplugin can't make it more than twice as slow.  Hopefully.
>
> Following these arguments we should add the indent and ftplugin
> directories.  And make sure duplicates are removed.


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.

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 da067045878f src/ex_docmd.c
--- a/src/ex_docmd.c	Tue Jul 27 20:47:25 2010 +0200
+++ b/src/ex_docmd.c	Tue Jul 27 23:22:01 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	Tue Jul 27 23:22:01 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,40 @@
 }
 #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
  */
     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) + 9));
     if (s == NULL)
 	return FAIL;
-    sprintf((char *)s, "%s/%s*.vim", dirname, pat);
+    if (vim_strchr((char_u *)dirnames, ',') == NULL)
+        sprintf((char *)s, "%s/%s*.vim", dirnames, pat);
+    else
+        sprintf((char *)s, "{%s}/%s*.vim", dirnames, pat);
     all = globpath(p_rtp, s, 0);
     vim_free(s);
     if (all == NULL)
@@ -4993,6 +5008,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	Tue Jul 27 23:22:01 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

Raspunde prin e-mail lui