Mercurial > vim
changeset 34682:a36144b38683 v9.1.0222
patch 9.1.0222: missing 'below' virt text if truncation precedes after/right text
Commit: https://github.com/vim/vim/commit/fe0a76b2bca12b13982ad66bafadc0d6c1681d00
Author: Dylan Thacker-Smith <dylan.ah.smith@gmail.com>
Date: Thu Mar 28 11:47:32 2024 +0100
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>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Thu, 28 Mar 2024 12:00:04 +0100 |
parents | bfb2f74221b9 |
children | 1bfa0faf0969 |
files | src/drawline.c src/testdir/test_textprop.vim src/version.c |
diffstat | 3 files changed, 32 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/src/drawline.c +++ b/src/drawline.c @@ -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; + } + } } }
--- a/src/testdir/test_textprop.vim +++ b/src/testdir/test_textprop.vim @@ -3099,6 +3099,9 @@ func Test_props_with_text_truncated_just 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