mirror of
https://github.com/neovim/neovim.git
synced 2025-09-16 16:28:17 +00:00
fix(highlight): allow globals to be cleared
- and reduce heap allocations Fixes #17420
This commit is contained in:
@@ -904,15 +904,13 @@ HlAttrs dict2hlattrs(Dict(highlight) *dict, bool use_rgb, int *link_id, Error *e
|
|||||||
hlattrs.rgb_bg_color = bg;
|
hlattrs.rgb_bg_color = bg;
|
||||||
hlattrs.rgb_fg_color = fg;
|
hlattrs.rgb_fg_color = fg;
|
||||||
hlattrs.rgb_sp_color = sp;
|
hlattrs.rgb_sp_color = sp;
|
||||||
hlattrs.cterm_bg_color =
|
hlattrs.cterm_bg_color = ctermbg == -1 ? 0 : ctermbg + 1;
|
||||||
ctermbg == -1 ? cterm_normal_bg_color : ctermbg + 1;
|
hlattrs.cterm_fg_color = ctermfg == -1 ? 0 : ctermfg + 1;
|
||||||
hlattrs.cterm_fg_color =
|
|
||||||
ctermfg == -1 ? cterm_normal_fg_color : ctermfg + 1;
|
|
||||||
hlattrs.cterm_ae_attr = cterm_mask;
|
hlattrs.cterm_ae_attr = cterm_mask;
|
||||||
} else {
|
} else {
|
||||||
hlattrs.cterm_ae_attr = cterm_mask;
|
hlattrs.cterm_ae_attr = cterm_mask;
|
||||||
hlattrs.cterm_bg_color = bg == -1 ? cterm_normal_bg_color : bg + 1;
|
hlattrs.cterm_bg_color = bg == -1 ? 0 : bg + 1;
|
||||||
hlattrs.cterm_fg_color = fg == -1 ? cterm_normal_fg_color : fg + 1;
|
hlattrs.cterm_fg_color = fg == -1 ? 0 : fg + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return hlattrs;
|
return hlattrs;
|
||||||
|
@@ -6758,16 +6758,26 @@ void set_hl_group(int id, HlAttrs attrs, Dict(highlight) *dict, int link_id)
|
|||||||
{ NULL, -1, NIL },
|
{ NULL, -1, NIL },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
char hex_name[8];
|
||||||
|
char *name;
|
||||||
|
|
||||||
for (int j = 0; cattrs[j].dest; j++) {
|
for (int j = 0; cattrs[j].dest; j++) {
|
||||||
if (cattrs[j].val != -1) {
|
if (cattrs[j].val < 0) {
|
||||||
|
XFREE_CLEAR(*cattrs[j].dest);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cattrs[j].name.type == kObjectTypeString && cattrs[j].name.data.string.size) {
|
||||||
|
name = cattrs[j].name.data.string.data;
|
||||||
|
} else {
|
||||||
|
snprintf(hex_name, sizeof(hex_name), "#%06x", cattrs[j].val);
|
||||||
|
name = hex_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!*cattrs[j].dest
|
||||||
|
|| STRCMP(*cattrs[j].dest, name) != 0) {
|
||||||
xfree(*cattrs[j].dest);
|
xfree(*cattrs[j].dest);
|
||||||
if (cattrs[j].name.type == kObjectTypeString && cattrs[j].name.data.string.size) {
|
*cattrs[j].dest = xstrdup(name);
|
||||||
*cattrs[j].dest = xstrdup(cattrs[j].name.data.string.data);
|
|
||||||
} else {
|
|
||||||
char hex_name[8];
|
|
||||||
snprintf(hex_name, sizeof(hex_name), "#%06x", cattrs[j].val);
|
|
||||||
*cattrs[j].dest = xstrdup(hex_name);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -276,4 +276,26 @@ describe("API: set highlight", function()
|
|||||||
eq('Test_hl3 xxx guifg=bLue guibg=reD',
|
eq('Test_hl3 xxx guifg=bLue guibg=reD',
|
||||||
exec_capture('highlight Test_hl3'))
|
exec_capture('highlight Test_hl3'))
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it ("can modify a highlight in the global namespace", function()
|
||||||
|
meths.set_hl(0, 'Test_hl3', { bg = 'red', fg = 'blue'})
|
||||||
|
eq('Test_hl3 xxx guifg=blue guibg=red',
|
||||||
|
exec_capture('highlight Test_hl3'))
|
||||||
|
|
||||||
|
meths.set_hl(0, 'Test_hl3', { bg = 'red' })
|
||||||
|
eq('Test_hl3 xxx guibg=red',
|
||||||
|
exec_capture('highlight Test_hl3'))
|
||||||
|
|
||||||
|
meths.set_hl(0, 'Test_hl3', { ctermbg = 9, ctermfg = 12})
|
||||||
|
eq('Test_hl3 xxx ctermfg=12 ctermbg=9',
|
||||||
|
exec_capture('highlight Test_hl3'))
|
||||||
|
|
||||||
|
meths.set_hl(0, 'Test_hl3', { ctermbg = 9 })
|
||||||
|
eq('Test_hl3 xxx ctermbg=9',
|
||||||
|
exec_capture('highlight Test_hl3'))
|
||||||
|
|
||||||
|
meths.set_hl(0, 'Test_hl3', {})
|
||||||
|
eq('Test_hl3 xxx cleared',
|
||||||
|
exec_capture('highlight Test_hl3'))
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
Reference in New Issue
Block a user