fix(highlight): properly deal with underline mask when listing (#22057)

This commit is contained in:
zeertzjq
2023-01-31 07:08:23 +08:00
committed by GitHub
parent 27b81af19c
commit 860fea1a3f
4 changed files with 17 additions and 12 deletions

View File

@@ -842,14 +842,14 @@ void hlattrs2dict(Dictionary *dict, HlAttrs ae, bool use_rgb)
PUT_C(hl, "underline", BOOLEAN_OBJ(true)); PUT_C(hl, "underline", BOOLEAN_OBJ(true));
break; break;
case HL_UNDERDOUBLE:
PUT_C(hl, "underdouble", BOOLEAN_OBJ(true));
break;
case HL_UNDERCURL: case HL_UNDERCURL:
PUT_C(hl, "undercurl", BOOLEAN_OBJ(true)); PUT_C(hl, "undercurl", BOOLEAN_OBJ(true));
break; break;
case HL_UNDERDOUBLE:
PUT_C(hl, "underdouble", BOOLEAN_OBJ(true));
break;
case HL_UNDERDOTTED: case HL_UNDERDOTTED:
PUT_C(hl, "underdotted", BOOLEAN_OBJ(true)); PUT_C(hl, "underdotted", BOOLEAN_OBJ(true));
break; break;
@@ -930,8 +930,8 @@ HlAttrs dict2hlattrs(Dict(highlight) *dict, bool use_rgb, int *link_id, Error *e
CHECK_FLAG(dict, mask, bold, , HL_BOLD); CHECK_FLAG(dict, mask, bold, , HL_BOLD);
CHECK_FLAG(dict, mask, italic, , HL_ITALIC); CHECK_FLAG(dict, mask, italic, , HL_ITALIC);
CHECK_FLAG(dict, mask, underline, , HL_UNDERLINE); CHECK_FLAG(dict, mask, underline, , HL_UNDERLINE);
CHECK_FLAG(dict, mask, underdouble, , HL_UNDERDOUBLE);
CHECK_FLAG(dict, mask, undercurl, , HL_UNDERCURL); CHECK_FLAG(dict, mask, undercurl, , HL_UNDERCURL);
CHECK_FLAG(dict, mask, underdouble, , HL_UNDERDOUBLE);
CHECK_FLAG(dict, mask, underdotted, , HL_UNDERDOTTED); CHECK_FLAG(dict, mask, underdotted, , HL_UNDERDOTTED);
CHECK_FLAG(dict, mask, underdashed, , HL_UNDERDASHED); CHECK_FLAG(dict, mask, underdashed, , HL_UNDERDASHED);
CHECK_FLAG(dict, mask, standout, , HL_STANDOUT); CHECK_FLAG(dict, mask, standout, , HL_STANDOUT);

View File

@@ -18,8 +18,8 @@ typedef enum {
// The next three bits are all underline styles // The next three bits are all underline styles
HL_UNDERLINE_MASK = 0x38, HL_UNDERLINE_MASK = 0x38,
HL_UNDERLINE = 0x08, HL_UNDERLINE = 0x08,
HL_UNDERDOUBLE = 0x10, HL_UNDERCURL = 0x10,
HL_UNDERCURL = 0x18, HL_UNDERDOUBLE = 0x18,
HL_UNDERDOTTED = 0x20, HL_UNDERDOTTED = 0x20,
HL_UNDERDASHED = 0x28, HL_UNDERDASHED = 0x28,
// 0x30 and 0x38 spare for underline styles // 0x30 and 0x38 spare for underline styles

View File

@@ -1553,15 +1553,20 @@ static bool highlight_list_arg(const int id, bool didh, const int type, int iarg
} else { // type == LIST_ATTR } else { // type == LIST_ATTR
buf[0] = NUL; buf[0] = NUL;
for (int i = 0; hl_attr_table[i] != 0; i++) { for (int i = 0; hl_attr_table[i] != 0; i++) {
if (iarg & hl_attr_table[i]) { if (((hl_attr_table[i] & HL_UNDERLINE_MASK)
&& ((iarg & HL_UNDERLINE_MASK) == hl_attr_table[i]))
|| (!(hl_attr_table[i] & HL_UNDERLINE_MASK)
&& (iarg & hl_attr_table[i]))) {
if (buf[0] != NUL) { if (buf[0] != NUL) {
xstrlcat(buf, ",", 100); xstrlcat(buf, ",", 100);
} }
xstrlcat(buf, hl_name_table[i], 100); xstrlcat(buf, hl_name_table[i], 100);
if (!(hl_attr_table[i] & HL_UNDERLINE_MASK)) {
iarg &= ~hl_attr_table[i]; // don't want "inverse" iarg &= ~hl_attr_table[i]; // don't want "inverse"
} }
} }
} }
}
(void)syn_list_header(didh, vim_strsize((char *)ts) + (int)strlen(name) + 1, id, false); (void)syn_list_header(didh, vim_strsize((char *)ts) + (int)strlen(name) + 1, id, false);
didh = true; didh = true;

View File

@@ -214,7 +214,7 @@ describe("API: set highlight", function()
bold = true, bold = true,
italic = true, italic = true,
reverse = true, reverse = true,
underline = true, underdashed = true,
strikethrough = true, strikethrough = true,
altfont = true, altfont = true,
cterm = { cterm = {
@@ -231,7 +231,7 @@ describe("API: set highlight", function()
bold = true, bold = true,
italic = true, italic = true,
reverse = true, reverse = true,
underline = true, underdashed = true,
strikethrough = true, strikethrough = true,
altfont = true, altfont = true,
} }
@@ -297,7 +297,7 @@ describe("API: set highlight", function()
exec_capture('highlight Test_hl')) exec_capture('highlight Test_hl'))
meths.set_hl(0, 'Test_hl2', highlight3_config) meths.set_hl(0, 'Test_hl2', highlight3_config)
eq('Test_hl2 xxx cterm=italic,reverse,strikethrough,altfont,nocombine ctermfg=8 ctermbg=15 gui=bold,underline,italic,reverse,strikethrough,altfont guifg=#ff0000 guibg=#0032aa', eq('Test_hl2 xxx cterm=italic,reverse,strikethrough,altfont,nocombine ctermfg=8 ctermbg=15 gui=bold,underdashed,italic,reverse,strikethrough,altfont guifg=#ff0000 guibg=#0032aa',
exec_capture('highlight Test_hl2')) exec_capture('highlight Test_hl2'))
-- Colors are stored with the name they are defined, but -- Colors are stored with the name they are defined, but