From 2676555b229feae462df32bf6dfce7f234b7be53 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Sat, 27 Aug 2022 06:44:13 +0800 Subject: vim-patch:9.0.0283: cannot complete "syn list @cluster" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problem: Cannot complete "syn list @cluster". Solution: Recognize and handle "list @". (Björn Linse, closes vim/vim#10990) https://github.com/vim/vim/commit/af9a6002e0761012cb7108cbfa179a880d3cb49b --- src/nvim/syntax.c | 24 +++++++++++++++++++++--- src/nvim/testdir/test_syntax.vim | 4 ++++ 2 files changed, 25 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/nvim/syntax.c b/src/nvim/syntax.c index fe37a79a5b..de8d5ef638 100644 --- a/src/nvim/syntax.c +++ b/src/nvim/syntax.c @@ -5664,7 +5664,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; /* @@ -5712,10 +5713,16 @@ void set_context_in_syntax_cmd(expand_T *xp, const char *arg) expand_what = EXP_SPELL; } else if (STRNICMP(arg, "sync", p - arg) == 0) { expand_what = EXP_SYNC; + } 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; @@ -5730,6 +5737,9 @@ void set_context_in_syntax_cmd(expand_T *xp, const char *arg) */ char *get_syntax_name(expand_T *xp, int idx) { +#define CBUFFER_LEN 256 + static char cbuffer[CBUFFER_LEN]; // TODO: better solution + switch (expand_what) { case EXP_SUBCMD: return subcommands[idx].name; @@ -5749,6 +5759,14 @@ char *get_syntax_name(expand_T *xp, int idx) "maxlines=", "minlines=", "region", NULL }; return sync_args[idx]; } + case EXP_CLUSTER: + if (idx < curwin->w_s->b_syn_clusters.ga_len) { + vim_snprintf(cbuffer, CBUFFER_LEN, "@%s", + SYN_CLSTR(curwin->w_s)[idx].scl_name); + return cbuffer; + } else { + return NULL; + } } return NULL; } diff --git a/src/nvim/testdir/test_syntax.vim b/src/nvim/testdir/test_syntax.vim index 85f27dd043..ccff01486e 100644 --- a/src/nvim/testdir/test_syntax.vim +++ b/src/nvim/testdir/test_syntax.vim @@ -198,6 +198,10 @@ func Test_syntax_completion() call feedkeys(":syn match \\\"\", 'tx') call assert_match('^"syn match @boolean @character ', @:) + + syn cluster Aax contains=Aap + call feedkeys(":syn list @A\\\"\", 'tx') + call assert_match('^"syn list @Aax', @:) endfunc func Test_echohl_completion() -- cgit