# HG changeset patch # User Bram Moolenaar # Date 1638220503 -3600 # Node ID 4cf208415483914fa7448a94b0ef7891963a80f3 # Parent ab47e2ca4673f091b75f58b1b063654d4f2896aa patch 8.2.3700: text property highlighting continues over breakindent Commit: https://github.com/vim/vim/commit/6b839ac77586f69a814d2940f59f0125f55c5f81 Author: Bram Moolenaar Date: Mon Nov 29 21:12:35 2021 +0000 patch 8.2.3700: text property highlighting continues over breakindent Problem: Text property highlighting continues over breakindent. Solution: Stop before the end column. (closes https://github.com/vim/vim/issues/9242) diff --git a/src/drawline.c b/src/drawline.c --- a/src/drawline.c +++ b/src/drawline.c @@ -265,6 +265,9 @@ win_line( int c_extra = NUL; // extra chars, all the same int c_final = NUL; // final char, mandatory if set int extra_attr = 0; // attributes when n_extra != 0 +#ifdef FEAT_LINEBREAK + int in_linebreak = FALSE; // n_extra set for showing linebreak +#endif static char_u *at_end_str = (char_u *)""; // used for p_extra when // displaying eol at end-of-line int lcs_eol_one = wp->w_lcs_chars.eol; // eol until it's been used @@ -1419,7 +1422,11 @@ win_line( int pi; int bcol = (int)(ptr - line); - if (n_extra > 0) + if (n_extra > 0 +# ifdef FEAT_LINEBREAK + && !in_linebreak +# endif + ) --bcol; // still working on the previous char, e.g. Tab // Check if any active property ends. @@ -1437,6 +1444,11 @@ win_line( * (text_props_active - (pi + 1))); --text_props_active; --pi; +# ifdef FEAT_LINEBREAK + // not exactly right but should work in most cases + if (in_linebreak && syntax_attr == text_prop_attr) + syntax_attr = 0; +# endif } } @@ -1705,6 +1717,10 @@ win_line( ++p_extra; } --n_extra; +#ifdef FEAT_LINEBREAK + if (n_extra <= 0) + in_linebreak = FALSE; +#endif } else { @@ -2030,6 +2046,8 @@ win_line( c_extra = mb_off > 0 ? MB_FILLER_CHAR : ' '; c_final = NUL; + if (n_extra > 0) + in_linebreak = TRUE; if (VIM_ISWHITE(c)) { # ifdef FEAT_CONCEAL diff --git a/src/testdir/dumps/Test_prop_linebreak.dump b/src/testdir/dumps/Test_prop_linebreak.dump new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_prop_linebreak.dump @@ -0,0 +1,10 @@ +>x+0&#ffffff0@49|]+0#ffffff16#e000002| +0#0000000#ffffff0@23 +|x@69| @4 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|1|,|1| @10|A|l@1| diff --git a/src/testdir/test_textprop.vim b/src/testdir/test_textprop.vim --- a/src/testdir/test_textprop.vim +++ b/src/testdir/test_textprop.vim @@ -1615,6 +1615,24 @@ def Test_prop_add_delete_line() bwipe! enddef +func Test_prop_in_linebreak() + CheckRunVimInTerminal + + let lines =<< trim END + set breakindent linebreak breakat+=] + call printf('%s]%s', repeat('x', 50), repeat('x', 70))->setline(1) + call prop_type_add('test', #{highlight: 'ErrorMsg'}) + call prop_add(1, 51, #{length: 1, type: 'test'}) + END + call writefile(lines, 'XscriptPropLinebreak') + let buf = RunVimInTerminal('-S XscriptPropLinebreak', #{rows: 10}) + call TermWait(buf) + call VerifyScreenDump(buf, 'Test_prop_linebreak', {}) + + call StopVimInTerminal(buf) + call delete('XscriptPropLinebreak') +endfunc + " Buffer number of 0 should be ignored, as if the parameter wasn't passed. def Test_prop_bufnr_zero() new diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -754,6 +754,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 3700, +/**/ 3699, /**/ 3698,