]> granicus.if.org Git - vim/commitdiff
patch 8.2.3747: cannot remove highlight from an existing sign v8.2.3747
authorBram Moolenaar <Bram@vim.org>
Sun, 5 Dec 2021 17:45:49 +0000 (17:45 +0000)
committerBram Moolenaar <Bram@vim.org>
Sun, 5 Dec 2021 17:45:49 +0000 (17:45 +0000)
Problem:    Cannot remove highlight from an existing sign. (James McCoy)
Solution:   Only reject empty argument for a new sign.

src/sign.c
src/testdir/test_signs.vim
src/version.c

index 66a29db1d711ac61aa84789f8ab8d90512e4a266..2c102e4e5285838ffd12511e0d9296fd3c70e1b0 100644 (file)
@@ -1078,13 +1078,28 @@ sign_define_by_name(
        return FAIL;
 
     if (linehl != NULL)
-       sp->sn_line_hl = syn_check_group(linehl, (int)STRLEN(linehl));
+    {
+       if (*linehl == NUL)
+           sp->sn_line_hl = 0;
+       else
+           sp->sn_line_hl = syn_check_group(linehl, (int)STRLEN(linehl));
+    }
 
     if (texthl != NULL)
-       sp->sn_text_hl = syn_check_group(texthl, (int)STRLEN(texthl));
+    {
+       if (*texthl == NUL)
+           sp->sn_text_hl = 0;
+       else
+           sp->sn_text_hl = syn_check_group(texthl, (int)STRLEN(texthl));
+    }
 
     if (culhl != NULL)
-       sp->sn_cul_hl = syn_check_group(culhl, (int)STRLEN(culhl));
+    {
+       if (*culhl == NUL)
+           sp->sn_cul_hl = 0;
+       else
+           sp->sn_cul_hl = syn_check_group(culhl, (int)STRLEN(culhl));
+    }
 
     return OK;
 }
@@ -1319,7 +1334,11 @@ sign_define_cmd(char_u *sign_name, char_u *cmdline)
     char_u     *linehl = NULL;
     char_u     *texthl = NULL;
     char_u     *culhl = NULL;
-    int failed = FALSE;
+    int                failed = FALSE;
+    sign_T     *sp_prev;
+    int                exists;
+
+    exists = sign_find(sign_name, &sp_prev) != NULL;
 
     // set values for a defined sign.
     for (;;)
@@ -1341,7 +1360,7 @@ sign_define_cmd(char_u *sign_name, char_u *cmdline)
        else if (STRNCMP(arg, "linehl=", 7) == 0)
        {
            arg += 7;
-           if (check_empty_group(p - arg, "linehl") == FAIL)
+           if (!exists && check_empty_group(p - arg, "linehl") == FAIL)
            {
                failed = TRUE;
                break;
@@ -1351,7 +1370,7 @@ sign_define_cmd(char_u *sign_name, char_u *cmdline)
        else if (STRNCMP(arg, "texthl=", 7) == 0)
        {
            arg += 7;
-           if (check_empty_group(p - arg, "texthl") == FAIL)
+           if (!exists && check_empty_group(p - arg, "texthl") == FAIL)
            {
                failed = TRUE;
                break;
@@ -1361,7 +1380,7 @@ sign_define_cmd(char_u *sign_name, char_u *cmdline)
        else if (STRNCMP(arg, "culhl=", 6) == 0)
        {
            arg += 6;
-           if (check_empty_group(p - arg, "culhl") == FAIL)
+           if (!exists && check_empty_group(p - arg, "culhl") == FAIL)
            {
                failed = TRUE;
                break;
index 18a6edc772907f7792550438e390719ea7bfd484..8511708ace7c48f5faf58196da1f41811ef73d07 100644 (file)
@@ -126,9 +126,34 @@ func Test_sign()
   call assert_fails("sign define Sign4 text= linehl=Comment", 'E239:')
   call assert_fails("sign define Sign4 text=\\ ab  linehl=Comment", 'E239:')
 
-  call assert_fails("sign define Sign4 linehl=", 'E1249: Group name missing for linehl')
-  call assert_fails("sign define Sign4 culhl=", 'E1249: Group name missing for culhl')
-  call assert_fails("sign define Sign4 texthl=", 'E1249: Group name missing for texthl')
+  " an empty highlight argument for a new sign is an error
+  call assert_fails("sign define SignX linehl=", 'E1249: Group name missing for linehl')
+  call assert_fails("sign define SignX culhl=", 'E1249: Group name missing for culhl')
+  call assert_fails("sign define SignX texthl=", 'E1249: Group name missing for texthl')
+
+  " an empty highlight argument for an existing sign clears it
+  sign define SignY texthl=TextHl culhl=CulHl linehl=LineHl
+  let sl = sign_getdefined('SignY')[0]
+  call assert_equal('TextHl', sl.texthl)
+  call assert_equal('CulHl', sl.culhl)
+  call assert_equal('LineHl', sl.linehl)
+
+  sign define SignY texthl= culhl=CulHl linehl=LineHl
+  let sl = sign_getdefined('SignY')[0]
+  call assert_false(has_key(sl, 'texthl'))
+  call assert_equal('CulHl', sl.culhl)
+  call assert_equal('LineHl', sl.linehl)
+
+  sign define SignY linehl=
+  let sl = sign_getdefined('SignY')[0]
+  call assert_false(has_key(sl, 'linehl'))
+  call assert_equal('CulHl', sl.culhl)
+
+  sign define SignY culhl=
+  let sl = sign_getdefined('SignY')[0]
+  call assert_false(has_key(sl, 'culhl'))
+
+  sign undefine SignY
 
   " define sign with whitespace
   sign define Sign4 text=\ X linehl=Comment
index 0d00f207d172c61d1af191cd18cf70a90d51e797..e7b0b2e2d030f503f9d4e4997719ff75be924de4 100644 (file)
@@ -753,6 +753,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3747,
 /**/
     3746,
 /**/