patch 8.1.1276: cannot combine text properties with syntax highlighting
Problem: Cannot combine text properties with syntax highlighting.
Solution: Add the "combine" field to prop_type_add(). (closes #4343)
diff --git a/src/screen.c b/src/screen.c
index 862a635..eb81bee 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -3059,6 +3059,7 @@
int text_props_active = 0;
proptype_T *text_prop_type = NULL;
int text_prop_attr = 0;
+ int text_prop_combine = FALSE;
#endif
#ifdef FEAT_SPELL
int has_spell = FALSE; /* this buffer has spell checking */
@@ -4261,6 +4262,7 @@
text_prop_idxs[text_props_active++] = text_prop_next++;
text_prop_attr = 0;
+ text_prop_combine = FALSE;
if (text_props_active > 0)
{
// Sort the properties on priority and/or starting last.
@@ -4273,17 +4275,17 @@
for (pi = 0; pi < text_props_active; ++pi)
{
int tpi = text_prop_idxs[pi];
- proptype_T *pt = text_prop_type_by_id(wp->w_buffer, text_props[tpi].tp_type);
+ proptype_T *pt = text_prop_type_by_id(
+ wp->w_buffer, text_props[tpi].tp_type);
if (pt != NULL)
{
int pt_attr = syn_id2attr(pt->pt_hl_id);
text_prop_type = pt;
- if (text_prop_attr == 0)
- text_prop_attr = pt_attr;
- else
- text_prop_attr = hl_combine_attr(text_prop_attr, pt_attr);
+ text_prop_attr =
+ hl_combine_attr(text_prop_attr, pt_attr);
+ text_prop_combine = pt->pt_flags & PT_FLAG_COMBINE;
}
}
}
@@ -4314,7 +4316,13 @@
attr_pri = FALSE;
#ifdef FEAT_TEXT_PROP
if (text_prop_type != NULL)
- char_attr = text_prop_attr;
+ {
+ if (text_prop_combine)
+ char_attr = hl_combine_attr(
+ syntax_attr, text_prop_attr);
+ else
+ char_attr = text_prop_attr;
+ }
else
#endif
#ifdef FEAT_SYN_HL
@@ -4664,14 +4672,18 @@
ptr = line + v;
# ifdef FEAT_TEXT_PROP
- // Text properties overrule syntax highlighting.
- if (text_prop_attr == 0)
-#endif
+ // Text properties overrule syntax highlighting or combine.
+ if (text_prop_attr == 0 || text_prop_combine)
+# endif
{
+ int comb_attr = syntax_attr;
+# ifdef FEAT_TEXT_PROP
+ comb_attr = hl_combine_attr(text_prop_attr, comb_attr);
+# endif
if (!attr_pri)
- char_attr = syntax_attr;
+ char_attr = comb_attr;
else
- char_attr = hl_combine_attr(syntax_attr, char_attr);
+ char_attr = hl_combine_attr(comb_attr, char_attr);
}
# ifdef FEAT_CONCEAL
/* no concealing past the end of the line, it interferes