]> granicus.if.org Git - vim/commitdiff
patch 9.0.0283: cannot complete "syn list @cluster" v9.0.0283
authorbfredl <bjorn.linse@gmail.com>
Fri, 26 Aug 2022 20:58:31 +0000 (21:58 +0100)
committerBram Moolenaar <Bram@vim.org>
Fri, 26 Aug 2022 20:58:31 +0000 (21:58 +0100)
Problem:    Cannot complete "syn list @cluster".
Solution:   Recognize and handle "list @". (Björn Linse, closes #10990)

src/syntax.c
src/testdir/test_syntax.vim
src/version.c

index 93f5601caf76fea1d97a14a2a9cd1c733229d342..1fc205414e00f9c69ca87fe4f2ba4cee1e2b4042 100644 (file)
@@ -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, char_u *arg)
                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 *arg)
     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 idx)
                 "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;
 }
index 93e56d7985b74a45542aad7774ea8c99e5375910..7f1e5f0e00efed017d30d5f22660a658428360ea 100644 (file)
@@ -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()
index 2eb817cf9d2e73d602522722bf1a5694eb9b125d..c3fbe5f591099b34dc1c0d943206aa315aadc586 100644 (file)
@@ -707,6 +707,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    283,
 /**/
     282,
 /**/