# HG changeset patch # User Christian Brabandt # Date 1484671504 -3600 # Node ID 5ac9d7920f11ed017d18b07f67207dec1dfc7475 # Parent 832c1a17f5b611a85741d24f72cca92933a2a746 patch 8.0.0201: completion of highlight groups includes cleared names commit https://github.com/vim/vim/commit/d61e8aaae57bd66279def479462bf11c22ec2f1c Author: Bram Moolenaar Date: Tue Jan 17 17:44:46 2017 +0100 patch 8.0.0201: completion of highlight groups includes cleared names Problem: When completing a group name for a highlight or syntax command cleared groups are included. Solution: Skip groups that have been cleared. diff --git a/src/syntax.c b/src/syntax.c --- a/src/syntax.c +++ b/src/syntax.c @@ -22,6 +22,7 @@ struct hl_group { char_u *sg_name; /* highlight group name */ char_u *sg_name_u; /* uppercase of sg_name */ + int sg_cleared; /* "hi clear" was used */ /* for normal terminals */ int sg_term; /* "term=" highlighting attributes */ char_u *sg_start; /* terminal string for start highl */ @@ -7327,6 +7328,7 @@ do_highlight( #ifdef FEAT_EVAL HL_TABLE()[from_id - 1].sg_scriptID = current_SID; #endif + HL_TABLE()[from_id - 1].sg_cleared = FALSE; redraw_all_later(SOME_VALID); } } @@ -8034,6 +8036,7 @@ do_highlight( error = TRUE; break; } + HL_TABLE()[idx].sg_cleared = FALSE; /* * When highlighting has been given for a group, don't link it. @@ -8171,6 +8174,8 @@ hl_has_settings(int idx, int check_link) static void highlight_clear(int idx) { + HL_TABLE()[idx].sg_cleared = TRUE; + HL_TABLE()[idx].sg_term = 0; vim_free(HL_TABLE()[idx].sg_start); HL_TABLE()[idx].sg_start = NULL; @@ -9958,7 +9963,13 @@ get_highlight_name(expand_T *xp UNUSED, && include_link != 0) return (char_u *)"clear"; #endif - if (idx < 0 || idx >= highlight_ga.ga_len) + if (idx < 0) + return NULL; + /* Items are never removed from the table, skip the ones that were cleared. + */ + while (idx < highlight_ga.ga_len && HL_TABLE()[idx].sg_cleared) + ++idx; + if (idx >= highlight_ga.ga_len) return NULL; return HL_TABLE()[idx].sg_name; } diff --git a/src/testdir/test_syntax.vim b/src/testdir/test_syntax.vim --- a/src/testdir/test_syntax.vim +++ b/src/testdir/test_syntax.vim @@ -156,6 +156,12 @@ func Test_syntax_completion() call feedkeys(":syn sync \\\"\", 'tx') call assert_equal('"syn sync ccomment clear fromstart linebreaks= linecont lines= match maxlines= minlines= region', @:) + " Check that clearing "Aap" avoids it showing up before Boolean. + hi Aap ctermfg=blue + call feedkeys(":syn list \\\"\", 'tx') + call assert_match('^"syn list Aap Boolean Character ', @:) + hi clear Aap + call feedkeys(":syn list \\\"\", 'tx') call assert_match('^"syn list Boolean Character ', @:) @@ -192,11 +198,11 @@ func Test_syntax_arg_skipped() call assert_match('conceal off', execute('syntax conceal')) endif - syntax region Tar start=// + syntax region Bar start=// if 0 syntax region NotTest start=// contains=@Spell endif - call assert_match('Tar', execute('syntax')) + call assert_match('Bar', execute('syntax')) call assert_notmatch('NotTest', execute('syntax')) call assert_notmatch('Spell', execute('syntax')) @@ -206,6 +212,8 @@ func Test_syntax_arg_skipped() syntax rest endif call assert_equal(a, execute('hi Foo')) + hi clear Bar + hi clear Foo set ft=tags syn off @@ -298,7 +306,9 @@ endfunc func Test_invalid_arg() call assert_fails('syntax case asdf', 'E390:') - call assert_fails('syntax conceal asdf', 'E390:') + if has('conceal') + call assert_fails('syntax conceal asdf', 'E390:') + endif call assert_fails('syntax spell asdf', 'E390:') endfunc @@ -313,13 +323,15 @@ endfunc func Test_syn_clear() syntax keyword Foo foo - syntax keyword Tar tar + syntax keyword Bar tar call assert_match('Foo', execute('syntax')) - call assert_match('Tar', execute('syntax')) + call assert_match('Bar', execute('syntax')) syn clear Foo call assert_notmatch('Foo', execute('syntax')) - call assert_match('Tar', execute('syntax')) - syn clear Foo Tar + call assert_match('Bar', execute('syntax')) + syn clear Foo Bar call assert_notmatch('Foo', execute('syntax')) - call assert_notmatch('Tar', execute('syntax')) + call assert_notmatch('Bar', execute('syntax')) + hi clear Foo + hi clear Bar endfunc diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -765,6 +765,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 201, +/**/ 200, /**/ 199,