0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

patch 9.1.0222: missing 'below' virt text if truncation precedes after/right text

Problem:  When a line is truncated just before 'after'/'right' virtual
          text and the line also has 'below' virtual text, then the
          'below' virtual text would not be displayed, depending on the
          order these text properties were added.
Solution: In the loop to make text properties active, skip instead of
          break for 'after'/'right' virtual text properties that are
          ignored due to truncation, so following 'below' text
          properties can still be made active.
          Similarly, a loop is needed to determine if a text property
          follows at the end of the screen. (Dylan Thacker-Smith)

related: #14307

Signed-off-by: Dylan Thacker-Smith <dylan.ah.smith@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Dylan Thacker-Smith
2024-03-28 11:47:32 +01:00
committed by Christian Brabandt
parent b6fac4db36
commit fe0a76b2bc
3 changed files with 32 additions and 12 deletions

View File

@@ -2073,24 +2073,29 @@ win_line(
--bcol;
# endif
// Add any text property that starts in this column.
// With 'nowrap' and not in the first screen line only "below"
// text prop can show.
while (text_prop_next < text_prop_count
&& (text_props[text_prop_next].tp_col == MAXCOL
? ((*ptr == NUL
&& (wp->w_p_wrap
|| wlv.row == startrow
|| (text_props[text_prop_next].tp_flags
& TP_FLAG_ALIGN_BELOW)))
? (*ptr == NUL
|| (bcol == 0
&& (text_props[text_prop_next].tp_flags
& TP_FLAG_ALIGN_ABOVE)))
: bcol >= text_props[text_prop_next].tp_col - 1))
{
// With 'nowrap' and not in the first screen line only "below"
// text prop can show.
if (text_props[text_prop_next].tp_col == MAXCOL
|| bcol <= text_props[text_prop_next].tp_col - 1
? (wp->w_p_wrap
|| wlv.row == startrow
|| (text_props[text_prop_next].tp_flags
& TP_FLAG_ALIGN_BELOW)
|| (bcol == 0
&& (text_props[text_prop_next].tp_flags
& TP_FLAG_ALIGN_ABOVE)))
: bcol <= text_props[text_prop_next].tp_col - 1
+ text_props[text_prop_next].tp_len)
{
text_prop_idxs[text_props_active++] = text_prop_next;
}
++text_prop_next;
}
@@ -2321,7 +2326,6 @@ win_line(
}
}
else if (text_prop_next < text_prop_count
&& text_props[text_prop_next].tp_col == MAXCOL
&& ((*ptr != NUL && ptr[mb_ptr2len(ptr)] == NUL)
|| (!wp->w_p_wrap && wlv.col == wp->w_width - 1)))
{
@@ -2329,10 +2333,21 @@ win_line(
// follows after it, we may need to flush the line after
// displaying that character.
// Or when not wrapping and at the rightmost column.
int only_below_follows = !wp->w_p_wrap && wlv.col == wp->w_width - 1;
if (!only_below_follows
|| (text_props[text_prop_next].tp_flags & TP_FLAG_ALIGN_BELOW))
text_prop_follows = TRUE;
// TODO: Store "after"/"right"/"below" text properties in order
// in the buffer so only `text_props[text_prop_count - 1]`
// needs to be checked for following "below" virtual text
for (int i = text_prop_next; i < text_prop_count; ++i)
{
if (text_props[i].tp_col == MAXCOL
&& (!only_below_follows
|| (text_props[i].tp_flags & TP_FLAG_ALIGN_BELOW)))
{
text_prop_follows = TRUE;
break;
}
}
}
}

View File

@@ -3099,6 +3099,9 @@ func Test_props_with_text_truncated_just_before_after()
call term_sendkeys(buf, ":call AddPropBelow()\<CR>")
call VerifyScreenDump(buf, 'Test_props_with_text_truncated_just_before_after_2', {})
call term_sendkeys(buf, ":call AddPropRight()\<CR>:\<Esc>")
call VerifyScreenDump(buf, 'Test_props_with_text_truncated_just_before_after_2', {})
call StopVimInTerminal(buf)
endfunc

View File

@@ -704,6 +704,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
222,
/**/
221,
/**/