]> granicus.if.org Git - vim/commitdiff
patch 8.2.3700: text property highlighting continues over breakindent v8.2.3700
authorBram Moolenaar <Bram@vim.org>
Mon, 29 Nov 2021 21:12:35 +0000 (21:12 +0000)
committerBram Moolenaar <Bram@vim.org>
Mon, 29 Nov 2021 21:12:35 +0000 (21:12 +0000)
Problem:    Text property highlighting continues over breakindent.
Solution:   Stop before the end column. (closes #9242)

src/drawline.c
src/testdir/dumps/Test_prop_linebreak.dump [new file with mode: 0644]
src/testdir/test_textprop.vim
src/version.c

index 5fcdc4945712a6bccc45436b21a5421ffdf17780..109b8b35ca8d546ca5b0049f30dc470d6b2d4788 100644 (file)
@@ -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 (file)
index 0000000..33be5b3
--- /dev/null
@@ -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| 
index 4a12b63d69586cf47b3e3793fa695a7dd1c13daa..546e2d6943248ebb63a0479dad0b42980ae4a6d8 100644 (file)
@@ -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
index f5f13a0dec4316b5022e07f4ed4e7bafd94c4f63..c7daabc0d7515ddc742999574572ec4584e4f662 100644 (file)
@@ -753,6 +753,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3700,
 /**/
     3699,
 /**/