mirror of
https://github.com/vim/vim.git
synced 2025-09-24 03:44:06 -04:00
patch 8.1.0638: text property highlighting is off by one column
Problem: Text property highlighting is off by one column. (Bjorn Linse) Solution: Update text property highlighting earlier. Let it overrule syntax highlighting.
This commit is contained in:
138
src/screen.c
138
src/screen.c
@@ -4294,6 +4294,66 @@ win_line(
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef FEAT_TEXT_PROP
|
||||||
|
if (text_props != NULL)
|
||||||
|
{
|
||||||
|
int pi;
|
||||||
|
|
||||||
|
// Check if any active property ends.
|
||||||
|
for (pi = 0; pi < text_props_active; ++pi)
|
||||||
|
{
|
||||||
|
int tpi = text_prop_idxs[pi];
|
||||||
|
|
||||||
|
if (col >= text_props[tpi].tp_col - 1
|
||||||
|
+ text_props[tpi].tp_len)
|
||||||
|
{
|
||||||
|
if (pi + 1 < text_props_active)
|
||||||
|
mch_memmove(text_prop_idxs + pi,
|
||||||
|
text_prop_idxs + pi + 1,
|
||||||
|
sizeof(int)
|
||||||
|
* (text_props_active - (pi + 1)));
|
||||||
|
--text_props_active;
|
||||||
|
--pi;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add any text property that starts in this column.
|
||||||
|
while (text_prop_next < text_prop_count
|
||||||
|
&& col >= text_props[text_prop_next].tp_col - 1)
|
||||||
|
text_prop_idxs[text_props_active++] = text_prop_next++;
|
||||||
|
|
||||||
|
text_prop_type = NULL;
|
||||||
|
if (text_props_active > 0)
|
||||||
|
{
|
||||||
|
int max_priority = INT_MIN;
|
||||||
|
int max_col = 0;
|
||||||
|
|
||||||
|
// Get the property type with the highest priority
|
||||||
|
// and/or starting last.
|
||||||
|
for (pi = 0; pi < text_props_active; ++pi)
|
||||||
|
{
|
||||||
|
int tpi = text_prop_idxs[pi];
|
||||||
|
proptype_T *pt;
|
||||||
|
|
||||||
|
pt = text_prop_type_by_id(
|
||||||
|
curwin->w_buffer, text_props[tpi].tp_type);
|
||||||
|
if (pt != NULL
|
||||||
|
&& (pt->pt_priority > max_priority
|
||||||
|
|| (pt->pt_priority == max_priority
|
||||||
|
&& text_props[tpi].tp_col >= max_col)))
|
||||||
|
{
|
||||||
|
text_prop_type = pt;
|
||||||
|
max_priority = pt->pt_priority;
|
||||||
|
max_col = text_props[tpi].tp_col;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (text_prop_type != NULL)
|
||||||
|
text_prop_attr =
|
||||||
|
syn_id2attr(text_prop_type->pt_hl_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Decide which of the highlight attributes to use. */
|
/* Decide which of the highlight attributes to use. */
|
||||||
attr_pri = TRUE;
|
attr_pri = TRUE;
|
||||||
#ifdef LINE_ATTR
|
#ifdef LINE_ATTR
|
||||||
@@ -4653,8 +4713,8 @@ win_line(
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef FEAT_SYN_HL
|
#ifdef FEAT_SYN_HL
|
||||||
/* Get syntax attribute, unless still at the start of the line
|
// Get syntax attribute, unless still at the start of the line
|
||||||
* (double-wide char that doesn't fit). */
|
// (double-wide char that doesn't fit).
|
||||||
v = (long)(ptr - line);
|
v = (long)(ptr - line);
|
||||||
if (has_syntax && v > 0)
|
if (has_syntax && v > 0)
|
||||||
{
|
{
|
||||||
@@ -4686,10 +4746,16 @@ win_line(
|
|||||||
line = ml_get_buf(wp->w_buffer, lnum, FALSE);
|
line = ml_get_buf(wp->w_buffer, lnum, FALSE);
|
||||||
ptr = line + v;
|
ptr = line + v;
|
||||||
|
|
||||||
if (!attr_pri)
|
# ifdef FEAT_TEXT_PROP
|
||||||
char_attr = syntax_attr;
|
// Text properties overrule syntax highlighting.
|
||||||
else
|
if (text_prop_attr == 0)
|
||||||
char_attr = hl_combine_attr(syntax_attr, char_attr);
|
#endif
|
||||||
|
{
|
||||||
|
if (!attr_pri)
|
||||||
|
char_attr = syntax_attr;
|
||||||
|
else
|
||||||
|
char_attr = hl_combine_attr(syntax_attr, char_attr);
|
||||||
|
}
|
||||||
# ifdef FEAT_CONCEAL
|
# ifdef FEAT_CONCEAL
|
||||||
/* no concealing past the end of the line, it interferes
|
/* no concealing past the end of the line, it interferes
|
||||||
* with line highlighting */
|
* with line highlighting */
|
||||||
@@ -4701,66 +4767,6 @@ win_line(
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef FEAT_TEXT_PROP
|
|
||||||
if (text_props != NULL)
|
|
||||||
{
|
|
||||||
int pi;
|
|
||||||
|
|
||||||
// Check if any active property ends.
|
|
||||||
for (pi = 0; pi < text_props_active; ++pi)
|
|
||||||
{
|
|
||||||
int tpi = text_prop_idxs[pi];
|
|
||||||
|
|
||||||
if (col >= text_props[tpi].tp_col - 1
|
|
||||||
+ text_props[tpi].tp_len)
|
|
||||||
{
|
|
||||||
if (pi + 1 < text_props_active)
|
|
||||||
mch_memmove(text_prop_idxs + pi,
|
|
||||||
text_prop_idxs + pi + 1,
|
|
||||||
sizeof(int)
|
|
||||||
* (text_props_active - (pi + 1)));
|
|
||||||
--text_props_active;
|
|
||||||
--pi;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add any text property that starts in this column.
|
|
||||||
while (text_prop_next < text_prop_count
|
|
||||||
&& col >= text_props[text_prop_next].tp_col - 1)
|
|
||||||
text_prop_idxs[text_props_active++] = text_prop_next++;
|
|
||||||
|
|
||||||
text_prop_type = NULL;
|
|
||||||
if (text_props_active > 0)
|
|
||||||
{
|
|
||||||
int max_priority = INT_MIN;
|
|
||||||
int max_col = 0;
|
|
||||||
|
|
||||||
// Get the property type with the highest priority
|
|
||||||
// and/or starting last.
|
|
||||||
for (pi = 0; pi < text_props_active; ++pi)
|
|
||||||
{
|
|
||||||
int tpi = text_prop_idxs[pi];
|
|
||||||
proptype_T *pt;
|
|
||||||
|
|
||||||
pt = text_prop_type_by_id(
|
|
||||||
curwin->w_buffer, text_props[tpi].tp_type);
|
|
||||||
if (pt != NULL
|
|
||||||
&& (pt->pt_priority > max_priority
|
|
||||||
|| (pt->pt_priority == max_priority
|
|
||||||
&& text_props[tpi].tp_col >= max_col)))
|
|
||||||
{
|
|
||||||
text_prop_type = pt;
|
|
||||||
max_priority = pt->pt_priority;
|
|
||||||
max_col = text_props[tpi].tp_col;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (text_prop_type != NULL)
|
|
||||||
text_prop_attr =
|
|
||||||
syn_id2attr(text_prop_type->pt_hl_id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef FEAT_SPELL
|
#ifdef FEAT_SPELL
|
||||||
/* Check spelling (unless at the end of the line).
|
/* Check spelling (unless at the end of the line).
|
||||||
* Only do this when there is no syntax highlighting, the
|
* Only do this when there is no syntax highlighting, the
|
||||||
|
@@ -705,7 +705,7 @@ typedef struct memline
|
|||||||
*/
|
*/
|
||||||
typedef struct textprop_S
|
typedef struct textprop_S
|
||||||
{
|
{
|
||||||
colnr_T tp_col; // start column
|
colnr_T tp_col; // start column (one based)
|
||||||
colnr_T tp_len; // length in bytes
|
colnr_T tp_len; // length in bytes
|
||||||
int tp_id; // identifier
|
int tp_id; // identifier
|
||||||
int tp_type; // property type
|
int tp_type; // property type
|
||||||
|
@@ -799,6 +799,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
638,
|
||||||
/**/
|
/**/
|
||||||
637,
|
637,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user