summaryrefslogtreecommitdiffstats
path: root/src/highlight.c
diff options
context:
space:
mode:
authorYegappan Lakshmanan <yegappan@yahoo.com>2021-11-16 17:19:30 +0000
committerBram Moolenaar <Bram@vim.org>2021-11-16 17:19:30 +0000
commit2a16dc6613368c54d526850bcbcd03c3fec1be67 (patch)
tree10460457613bd8a165fa05e72f411ec5e7abfaf5 /src/highlight.c
parentc143fa0778fa0d8744867318bb7f7a2e63cf37d7 (diff)
patch 8.2.3605: cannot clear and unlinke a highlight group with hlset()v8.2.3605
Problem: Cannot clear and unlinke a highlight group with hlset() in a single call. Solution: Add the "force" option. (Yegappan Lakshmanan, closes #9117)
Diffstat (limited to 'src/highlight.c')
-rw-r--r--src/highlight.c52
1 files changed, 35 insertions, 17 deletions
diff --git a/src/highlight.c b/src/highlight.c
index a2935f50b0..7a32b22481 100644
--- a/src/highlight.c
+++ b/src/highlight.c
@@ -4176,6 +4176,9 @@ highlight_get_info(int hl_idx, int resolve_link)
link = HL_TABLE()[sgp->sg_link - 1].sg_name;
if (link != NULL && dict_add_string(dict, "linksto", link) == FAIL)
goto error;
+
+ if (sgp->sg_deflink)
+ dict_add_bool(dict, "default", VVAL_TRUE);
}
if (dict_len(dict) == 2)
// If only 'name' is present, then the highlight group is cleared.
@@ -4337,25 +4340,19 @@ hlg_add_or_update(dict_T *dict)
# ifdef FEAT_GUI
char_u *font;
# endif
+ int forceit = FALSE;
+ int dodefault = FALSE;
+ int done = FALSE;
name = hldict_get_string(dict, (char_u *)"name", &error);
if (name == NULL || error)
return FALSE;
- if (dict_find(dict, (char_u *)"linksto", -1) != NULL)
- {
- char_u *linksto;
-
- // link highlight groups
- linksto = hldict_get_string(dict, (char_u *)"linksto", &error);
- if (linksto == NULL || error)
- return FALSE;
-
- vim_snprintf((char *)IObuff, IOSIZE, "link %s %s", name, linksto);
- do_highlight(IObuff, FALSE, FALSE);
+ if (dict_get_bool(dict, (char_u *)"force", VVAL_FALSE) == VVAL_TRUE)
+ forceit = TRUE;
- return TRUE;
- }
+ if (dict_get_bool(dict, (char_u *)"default", VVAL_FALSE) == VVAL_TRUE)
+ dodefault = TRUE;
if (dict_find(dict, (char_u *)"cleared", -1) != NULL)
{
@@ -4366,12 +4363,32 @@ hlg_add_or_update(dict_T *dict)
if (cleared == TRUE)
{
vim_snprintf((char *)IObuff, IOSIZE, "clear %s", name);
- do_highlight(IObuff, FALSE, FALSE);
+ do_highlight(IObuff, forceit, FALSE);
+ done = TRUE;
}
+ }
- return TRUE;
+ if (dict_find(dict, (char_u *)"linksto", -1) != NULL)
+ {
+ char_u *linksto;
+
+ // link highlight groups
+ linksto = hldict_get_string(dict, (char_u *)"linksto", &error);
+ if (linksto == NULL || error)
+ return FALSE;
+
+ vim_snprintf((char *)IObuff, IOSIZE, "%slink %s %s",
+ dodefault ? "default " : "", name, linksto);
+ do_highlight(IObuff, forceit, FALSE);
+
+ done = TRUE;
}
+ // If 'cleared' or 'linksto' are specified, then don't process the other
+ // attributes.
+ if (done)
+ return TRUE;
+
start = hldict_get_string(dict, (char_u *)"start", &error);
if (error)
return FALSE;
@@ -4434,7 +4451,8 @@ hlg_add_or_update(dict_T *dict)
return TRUE;
vim_snprintf((char *)IObuff, IOSIZE,
- "%s %s%s %s%s %s%s %s%s %s%s %s%s %s%s %s%s %s%s %s%s %s%s %s%s",
+ "%s%s %s%s %s%s %s%s %s%s %s%s %s%s %s%s %s%s %s%s %s%s %s%s %s%s",
+ dodefault ? "default " : "",
name,
term_attr[0] != NUL ? "term=" : "",
term_attr[0] != NUL ? term_attr : (char_u *)"",
@@ -4466,7 +4484,7 @@ hlg_add_or_update(dict_T *dict)
guisp != NULL ? guisp : (char_u *)""
);
- do_highlight(IObuff, FALSE, FALSE);
+ do_highlight(IObuff, forceit, FALSE);
return TRUE;
}