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
--- 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,