Mercurial > vim
changeset 10624:5ac9d7920f11 v8.0.0201
patch 8.0.0201: completion of highlight groups includes cleared names
commit https://github.com/vim/vim/commit/d61e8aaae57bd66279def479462bf11c22ec2f1c
Author: Bram Moolenaar <Bram@vim.org>
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.
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Tue, 17 Jan 2017 17:45:04 +0100 |
parents | 832c1a17f5b6 |
children | 3120f15cfff7 |
files | src/syntax.c src/testdir/test_syntax.vim src/version.c |
diffstat | 3 files changed, 34 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- 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; }
--- a/src/testdir/test_syntax.vim +++ b/src/testdir/test_syntax.vim @@ -156,6 +156,12 @@ func Test_syntax_completion() call feedkeys(":syn sync \<C-A>\<C-B>\"\<CR>", '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 \<C-A>\<C-B>\"\<CR>", 'tx') + call assert_match('^"syn list Aap Boolean Character ', @:) + hi clear Aap + call feedkeys(":syn list \<C-A>\<C-B>\"\<CR>", '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=/</ end=/>/ + syntax region Bar start=/</ end=/>/ if 0 syntax region NotTest start=/</ end=/>/ 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