Mercurial > vim
diff src/highlight.c @ 26145:3da380450cce v8.2.3605
patch 8.2.3605: cannot clear and unlinke a highlight group with hlset()
Commit: https://github.com/vim/vim/commit/2a16dc6613368c54d526850bcbcd03c3fec1be67
Author: Yegappan Lakshmanan <yegappan@yahoo.com>
Date: Tue Nov 16 17:19:30 2021 +0000
patch 8.2.3605: cannot clear and unlinke a highlight group with hlset()
Problem: Cannot clear and unlinke a highlight group with hlset() in a
single call.
Solution: Add the "force" option. (Yegappan Lakshmanan, closes #9117)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Tue, 16 Nov 2021 18:30:04 +0100 |
parents | bb87ce13e7d6 |
children | c83460a14407 |
line wrap: on
line diff
--- a/src/highlight.c +++ b/src/highlight.c @@ -4176,6 +4176,9 @@ highlight_get_info(int hl_idx, int resol 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); - - return TRUE; - } + if (dict_get_bool(dict, (char_u *)"force", VVAL_FALSE) == VVAL_TRUE) + forceit = 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,11 +4363,31 @@ 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; } - + } + + 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) @@ -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; }