aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKunMing Xie <qqzz014@gmail.com>2018-03-09 02:49:21 +0800
committerJustin M. Keyes <justinkz@gmail.com>2018-03-08 19:49:21 +0100
commit5ec0a6d13f3f1d50b424f46e2e1bbc2813b5086d (patch)
treeb7f3ac667edc33d80786bc67405d4196f7450c1b /src
parent1d5eec2c626bd8125940c0425cc6f33213851781 (diff)
downloadrneovim-5ec0a6d13f3f1d50b424f46e2e1bbc2813b5086d.tar.gz
rneovim-5ec0a6d13f3f1d50b424f46e2e1bbc2813b5086d.tar.bz2
rneovim-5ec0a6d13f3f1d50b424f46e2e1bbc2813b5086d.zip
vim-patch:8.0.0513: fix getting name of cleared highlight group (#8103)
Problem: Getting name of cleared highlight group is wrong. (Matt Wozniski) Solution: Only skip over cleared names for completion. (closes vim/vim#1592) Also fix that a cleared group causes duplicate completions. https://github.com/vim/vim/commit/c96272e30e2b81e5e0c8418f09d9db4e2fcd5d73
Diffstat (limited to 'src')
-rw-r--r--src/nvim/eval.c2
-rw-r--r--src/nvim/ex_cmds.c6
-rw-r--r--src/nvim/syntax.c18
-rw-r--r--src/nvim/testdir/test_cmdline.vim8
-rw-r--r--src/nvim/testdir/test_syntax.vim3
5 files changed, 28 insertions, 9 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index 923b4527c2..2e4d246f4b 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -16216,7 +16216,7 @@ static void f_synIDattr(typval_T *argvars, typval_T *rettv, FunPtr fptr)
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/nvim/ex_cmds.c b/src/nvim/ex_cmds.c
index 48d1d42e2e..5e5d3cedfc 100644
--- a/src/nvim/ex_cmds.c
+++ b/src/nvim/ex_cmds.c
@@ -5828,7 +5828,8 @@ static void sign_list_defined(sign_T *sp)
}
if (sp->sn_line_hl > 0) {
msg_puts(" linehl=");
- const char *const p = get_highlight_name(NULL, sp->sn_line_hl - 1);
+ const char *const p = get_highlight_name_ext(NULL,
+ sp->sn_line_hl - 1, false);
if (p == NULL) {
msg_puts("NONE");
} else {
@@ -5837,7 +5838,8 @@ static void sign_list_defined(sign_T *sp)
}
if (sp->sn_text_hl > 0) {
msg_puts(" texthl=");
- const char *const p = get_highlight_name(NULL, sp->sn_text_hl - 1);
+ const char *const p = get_highlight_name_ext(NULL,
+ sp->sn_text_hl - 1, false);
if (p == NULL) {
msg_puts("NONE");
} else {
diff --git a/src/nvim/syntax.c b/src/nvim/syntax.c
index 68f3329ce7..e2476f9b0b 100644
--- a/src/nvim/syntax.c
+++ b/src/nvim/syntax.c
@@ -7758,20 +7758,26 @@ static void highlight_list_two(int cnt, int attr)
}
-/*
- * Function given to ExpandGeneric() to obtain the list of group names.
- * Also used for synIDattr() function.
- */
+/// Function given to ExpandGeneric() to obtain the list of group names.
const char *get_highlight_name(expand_T *const xp, int idx)
FUNC_ATTR_WARN_UNUSED_RESULT
{
+ return get_highlight_name_ext(xp, idx, true);
+}
+
+
+/// Obtain a highlight group name.
+/// When "skip_cleared" is TRUE don't return a cleared entry.
+const char *get_highlight_name_ext(expand_T *xp, int idx, int skip_cleared)
+ FUNC_ATTR_WARN_UNUSED_RESULT
+{
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 (skip_cleared && idx < highlight_ga.ga_len && HL_TABLE()[idx].sg_cleared) {
+ return "";
}
if (idx == highlight_ga.ga_len && include_none != 0) {
diff --git a/src/nvim/testdir/test_cmdline.vim b/src/nvim/testdir/test_cmdline.vim
index 94330fe67b..673246e1fb 100644
--- a/src/nvim/testdir/test_cmdline.vim
+++ b/src/nvim/testdir/test_cmdline.vim
@@ -70,6 +70,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/nvim/testdir/test_syntax.vim b/src/nvim/testdir/test_syntax.vim
index b662279c6d..8465fe7d45 100644
--- a/src/nvim/testdir/test_syntax.vim
+++ b/src/nvim/testdir/test_syntax.vim
@@ -322,13 +322,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