changeset 29890:80929331a836 v9.0.0283

patch 9.0.0283: cannot complete "syn list @cluster" Commit: https://github.com/vim/vim/commit/af9a6002e0761012cb7108cbfa179a880d3cb49b Author: bfredl <bjorn.linse@gmail.com> Date: Fri Aug 26 21:58:31 2022 +0100 patch 9.0.0283: cannot complete "syn list @cluster" Problem: Cannot complete "syn list @cluster". Solution: Recognize and handle "list @". (Bj?rn Linse, closes https://github.com/vim/vim/issues/10990)
author Bram Moolenaar <Bram@vim.org>
date Fri, 26 Aug 2022 23:00:03 +0200
parents 2cdac217edbd
children 6c571257924c
files src/syntax.c src/testdir/test_syntax.vim src/version.c
diffstat 3 files changed, 32 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -6341,7 +6341,8 @@ static enum
     EXP_SUBCMD,	    // expand ":syn" sub-commands
     EXP_CASE,	    // expand ":syn case" arguments
     EXP_SPELL,	    // expand ":syn spell" arguments
-    EXP_SYNC	    // expand ":syn sync" arguments
+    EXP_SYNC,	    // expand ":syn sync" arguments
+    EXP_CLUSTER	    // expand ":syn list @cluster" arguments
 } expand_what;
 
 /*
@@ -6396,10 +6397,17 @@ set_context_in_syntax_cmd(expand_T *xp, 
 		expand_what = EXP_SPELL;
 	    else if (STRNICMP(arg, "sync", p - arg) == 0)
 		expand_what = EXP_SYNC;
-	    else if (  STRNICMP(arg, "keyword", p - arg) == 0
+	    else if (STRNICMP(arg, "list", p - arg) == 0)
+	    {
+		p = skipwhite(p);
+		if (*p == '@')
+		    expand_what = EXP_CLUSTER;
+		else
+		    xp->xp_context = EXPAND_HIGHLIGHT;
+	    }
+	    else if (STRNICMP(arg, "keyword", p - arg) == 0
 		    || STRNICMP(arg, "region", p - arg) == 0
-		    || STRNICMP(arg, "match", p - arg) == 0
-		    || STRNICMP(arg, "list", p - arg) == 0)
+		    || STRNICMP(arg, "match", p - arg) == 0)
 		xp->xp_context = EXPAND_HIGHLIGHT;
 	    else
 		xp->xp_context = EXPAND_NOTHING;
@@ -6414,6 +6422,9 @@ set_context_in_syntax_cmd(expand_T *xp, 
     char_u *
 get_syntax_name(expand_T *xp UNUSED, int idx)
 {
+#define CBUFFER_LEN 256
+    static char_u	cbuffer[CBUFFER_LEN]; // TODO: better solution
+
     switch (expand_what)
     {
 	case EXP_SUBCMD:
@@ -6437,6 +6448,17 @@ get_syntax_name(expand_T *xp UNUSED, int
 		 "maxlines=", "minlines=", "region", NULL};
 	    return (char_u *)sync_args[idx];
 	}
+	case EXP_CLUSTER:
+	{
+	    if (idx < curwin->w_s->b_syn_clusters.ga_len)
+	    {
+		vim_snprintf((char *)cbuffer, CBUFFER_LEN, "@%s",
+					 SYN_CLSTR(curwin->w_s)[idx].scl_name);
+		return cbuffer;
+	    }
+	    else
+		return NULL;
+	}
     }
     return NULL;
 }
--- a/src/testdir/test_syntax.vim
+++ b/src/testdir/test_syntax.vim
@@ -201,6 +201,10 @@ func Test_syntax_completion()
 
   call feedkeys(":syn match \<C-A>\<C-B>\"\<CR>", 'tx')
   call assert_match('^"syn match Boolean Character ', @:)
+
+  syn cluster Aax contains=Aap
+  call feedkeys(":syn list @A\<C-A>\<C-B>\"\<CR>", 'tx')
+  call assert_match('^"syn list @Aax', @:)
 endfunc
 
 func Test_echohl_completion()
--- a/src/version.c
+++ b/src/version.c
@@ -708,6 +708,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    283,
+/**/
     282,
 /**/
     281,