summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-11-29 21:12:35 +0000
committerBram Moolenaar <Bram@vim.org>2021-11-29 21:12:35 +0000
commit6b839ac77586f69a814d2940f59f0125f55c5f81 (patch)
treea6d7a0609d95ebaabd670f03f76034b158dec34a
parent651fca85c71a4c5807f8f828f9ded30fbd754325 (diff)
downloadvim-git-6b839ac77586f69a814d2940f59f0125f55c5f81.tar.gz
patch 8.2.3700: text property highlighting continues over breakindentv8.2.3700
Problem: Text property highlighting continues over breakindent. Solution: Stop before the end column. (closes #9242)
-rw-r--r--src/drawline.c20
-rw-r--r--src/testdir/dumps/Test_prop_linebreak.dump10
-rw-r--r--src/testdir/test_textprop.vim18
-rw-r--r--src/version.c2
4 files changed, 49 insertions, 1 deletions
diff --git a/src/drawline.c b/src/drawline.c
index 5fcdc4945..109b8b35c 100644
--- 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
index 000000000..33be5b312
--- /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
index 4a12b63d6..546e2d694 100644
--- 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
index f5f13a0de..c7daabc0d 100644
--- 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,