summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-03-26 13:50:09 +0200
committerBram Moolenaar <Bram@vim.org>2017-03-26 13:50:09 +0200
commitc96272e30e2b81e5e0c8418f09d9db4e2fcd5d73 (patch)
treef8434ca5d83eabd03868e5e2ddfff45c976067f1
parent1572e30607e9a3bee9750242bf37168f7d2b6e66 (diff)
downloadvim-git-c96272e30e2b81e5e0c8418f09d9db4e2fcd5d73.tar.gz
patch 8.0.0513: getting name of cleared highlight group is wrongv8.0.0513
Problem: Getting name of cleared highlight group is wrong. (Matt Wozniski) Solution: Only skip over cleared names for completion. (closes #1592) Also fix that a cleared group causes duplicate completions.
-rw-r--r--src/evalfunc.c2
-rw-r--r--src/ex_cmds.c4
-rw-r--r--src/proto/syntax.pro1
-rw-r--r--src/syntax.c20
-rw-r--r--src/testdir/test_cmdline.vim8
-rw-r--r--src/testdir/test_syntax.vim3
-rw-r--r--src/version.c2
7 files changed, 32 insertions, 8 deletions
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 8869810df..42773e1b8 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -11746,7 +11746,7 @@ f_synIDattr(typval_T *argvars UNUSED, typval_T *rettv)
break;
case 'n': /* name */
- p = get_highlight_name(NULL, id - 1);
+ p = get_highlight_name_ext(NULL, id - 1, FALSE);
break;
case 'r': /* reverse */
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index 0c4dffbc6..6940e5527 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -7962,7 +7962,7 @@ sign_list_defined(sign_T *sp)
if (sp->sn_line_hl > 0)
{
MSG_PUTS(" linehl=");
- p = get_highlight_name(NULL, sp->sn_line_hl - 1);
+ p = get_highlight_name_ext(NULL, sp->sn_line_hl - 1, FALSE);
if (p == NULL)
MSG_PUTS("NONE");
else
@@ -7971,7 +7971,7 @@ sign_list_defined(sign_T *sp)
if (sp->sn_text_hl > 0)
{
MSG_PUTS(" texthl=");
- p = get_highlight_name(NULL, sp->sn_text_hl - 1);
+ p = get_highlight_name_ext(NULL, sp->sn_text_hl - 1, FALSE);
if (p == NULL)
MSG_PUTS("NONE");
else
diff --git a/src/proto/syntax.pro b/src/proto/syntax.pro
index 64235b00b..aae187fe6 100644
--- a/src/proto/syntax.pro
+++ b/src/proto/syntax.pro
@@ -52,5 +52,6 @@ void highlight_gui_started(void);
int highlight_changed(void);
void set_context_in_highlight_cmd(expand_T *xp, char_u *arg);
char_u *get_highlight_name(expand_T *xp, int idx);
+char_u *get_highlight_name_ext(expand_T *xp, int idx, int skip_cleared);
void free_highlight_fonts(void);
/* vim: set ft=c : */
diff --git a/src/syntax.c b/src/syntax.c
index a8942e797..42a0bdc3f 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -9949,17 +9949,27 @@ highlight_list_two(int cnt, int attr)
|| defined(FEAT_SIGNS) || defined(PROTO)
/*
* Function given to ExpandGeneric() to obtain the list of group names.
- * Also used for synIDattr() function.
*/
char_u *
get_highlight_name(expand_T *xp UNUSED, int idx)
{
+ return get_highlight_name_ext(xp, idx, TRUE);
+}
+
+/*
+ * Obtain a highlight group name.
+ * When "skip_cleared" is TRUE don't return a cleared entry.
+ */
+ char_u *
+get_highlight_name_ext(expand_T *xp UNUSED, int idx, int skip_cleared)
+{
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;
+
+ /* Items are never removed from the table, skip the ones that were
+ * cleared. */
+ if (skip_cleared && idx < highlight_ga.ga_len && HL_TABLE()[idx].sg_cleared)
+ return (char_u *)"";
#ifdef FEAT_CMDL_COMPL
if (idx == highlight_ga.ga_len && include_none != 0)
diff --git a/src/testdir/test_cmdline.vim b/src/testdir/test_cmdline.vim
index 98a433778..77c917049 100644
--- a/src/testdir/test_cmdline.vim
+++ b/src/testdir/test_cmdline.vim
@@ -71,6 +71,14 @@ func Test_highlight_completion()
call assert_equal('"hi default', getreg(':'))
call feedkeys(":hi c\<S-Tab>\<Home>\"\<CR>", 'xt')
call assert_equal('"hi clear', getreg(':'))
+
+ " A cleared group does not show up in completions.
+ hi Anders ctermfg=green
+ call assert_equal(['Aardig', 'Anders'], getcompletion('A', 'highlight'))
+ hi clear Aardig
+ call assert_equal(['Anders'], getcompletion('A', 'highlight'))
+ hi clear Anders
+ call assert_equal([], getcompletion('A', 'highlight'))
endfunc
func Test_expr_completion()
diff --git a/src/testdir/test_syntax.vim b/src/testdir/test_syntax.vim
index 8a00f992f..9ebe3f13e 100644
--- a/src/testdir/test_syntax.vim
+++ b/src/testdir/test_syntax.vim
@@ -326,13 +326,16 @@ func Test_syn_clear()
syntax keyword Bar tar
call assert_match('Foo', execute('syntax'))
call assert_match('Bar', execute('syntax'))
+ call assert_equal('Foo', synIDattr(hlID("Foo"), "name"))
syn clear Foo
call assert_notmatch('Foo', execute('syntax'))
call assert_match('Bar', execute('syntax'))
+ call assert_equal('Foo', synIDattr(hlID("Foo"), "name"))
syn clear Foo Bar
call assert_notmatch('Foo', execute('syntax'))
call assert_notmatch('Bar', execute('syntax'))
hi clear Foo
+ call assert_equal('Foo', synIDattr(hlID("Foo"), "name"))
hi clear Bar
endfunc
diff --git a/src/version.c b/src/version.c
index 3ebe8a6f9..28f3c59d1 100644
--- 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 */
/**/
+ 513,
+/**/
512,
/**/
511,