]> granicus.if.org Git - vim/commitdiff
patch 9.0.0193: search and match highlgith interfere with virtual text v9.0.0193
authorBram Moolenaar <Bram@vim.org>
Thu, 11 Aug 2022 16:24:50 +0000 (17:24 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 11 Aug 2022 16:24:50 +0000 (17:24 +0100)
Problem:    Search and match highlgith interfere with virtual text highlight.
            (Ben Jackson)
Solution:   Check for match highlight after text properties.  Reset and
            restore search highlight when showing virtual text.
            (closes #10892)

src/drawline.c
src/testdir/dumps/Test_prop_inserts_text_hi_1.dump [new file with mode: 0644]
src/testdir/dumps/Test_prop_inserts_text_hi_2.dump [new file with mode: 0644]
src/testdir/dumps/Test_prop_inserts_text_hi_3.dump [new file with mode: 0644]
src/testdir/dumps/Test_prop_inserts_text_hi_4.dump [new file with mode: 0644]
src/testdir/dumps/Test_prop_inserts_text_hi_5.dump [new file with mode: 0644]
src/testdir/dumps/Test_prop_inserts_text_hi_6.dump [new file with mode: 0644]
src/testdir/test_textprop.vim
src/version.c

index 2b482bb2db3428c6a009fcac070878b2d73059bf..247ed29d847909815d86d50696ff901f6b91a4f8 100644 (file)
@@ -558,6 +558,8 @@ win_line(
     int                text_prop_id = 0;       // active property ID
     int                text_prop_flags = 0;
     int                text_prop_follows = FALSE;  // another text prop to display
+    int                saved_search_attr = 0;  // search_attr to be used when n_extra
+                                       // goes to zero
 #endif
 #ifdef FEAT_SPELL
     int                has_spell = FALSE;      // this buffer has spell checking
@@ -1583,46 +1585,6 @@ win_line(
                        || (noinvcur && (colnr_T)wlv.vcol == wp->w_virtcol)))
                area_attr = 0;                  // stop highlighting
 
-#ifdef FEAT_SEARCH_EXTRA
-           if (!wlv.n_extra)
-           {
-               // Check for start/end of 'hlsearch' and other matches.
-               // After end, check for start/end of next match.
-               // When another match, have to check for start again.
-               v = (long)(ptr - line);
-               search_attr = update_search_hl(wp, lnum, (colnr_T)v, &line,
-                                     &screen_search_hl, &has_match_conc,
-                                     &match_conc, did_line_attr, lcs_eol_one,
-                                     &on_last_col);
-               ptr = line + v;  // "line" may have been changed
-               prev_ptr = ptr;
-
-               // Do not allow a conceal over EOL otherwise EOL will be missed
-               // and bad things happen.
-               if (*ptr == NUL)
-                   has_match_conc = 0;
-           }
-#endif
-
-#ifdef FEAT_DIFF
-           if (wlv.diff_hlf != (hlf_T)0)
-           {
-               if (wlv.diff_hlf == HLF_CHD && ptr - line >= change_start
-                                                          && wlv.n_extra == 0)
-                   wlv.diff_hlf = HLF_TXD;             // changed text
-               if (wlv.diff_hlf == HLF_TXD && ptr - line > change_end
-                                                          && wlv.n_extra == 0)
-                   wlv.diff_hlf = HLF_CHD;             // changed line
-               line_attr = HL_ATTR(wlv.diff_hlf);
-               if (wp->w_p_cul && lnum == wp->w_cursor.lnum
-                       && wp->w_p_culopt_flags != CULOPT_NBR
-                       && (!wlv.cul_screenline || (wlv.vcol >= left_curline_col
-                                           && wlv.vcol <= right_curline_col)))
-                   line_attr = hl_combine_attr(
-                                         line_attr, HL_ATTR(HLF_CUL));
-           }
-#endif
-
 #ifdef FEAT_PROP_POPUP
            if (text_props != NULL)
            {
@@ -1748,6 +1710,8 @@ win_line(
                            wlv.n_extra = (int)STRLEN(p);
                            extra_attr = used_attr;
                            n_attr = mb_charlen(p);
+                           saved_search_attr = search_attr;
+                           search_attr = 0;    // restore when n_extra is zero
                            text_prop_attr = 0;
                            if (*ptr == NUL)
                                // don't combine char attr after EOL
@@ -1856,6 +1820,46 @@ win_line(
            }
 #endif
 
+#ifdef FEAT_SEARCH_EXTRA
+           if (wlv.n_extra == 0)
+           {
+               // Check for start/end of 'hlsearch' and other matches.
+               // After end, check for start/end of next match.
+               // When another match, have to check for start again.
+               v = (long)(ptr - line);
+               search_attr = update_search_hl(wp, lnum, (colnr_T)v, &line,
+                                     &screen_search_hl, &has_match_conc,
+                                     &match_conc, did_line_attr, lcs_eol_one,
+                                     &on_last_col);
+               ptr = line + v;  // "line" may have been changed
+               prev_ptr = ptr;
+
+               // Do not allow a conceal over EOL otherwise EOL will be missed
+               // and bad things happen.
+               if (*ptr == NUL)
+                   has_match_conc = 0;
+           }
+#endif
+
+#ifdef FEAT_DIFF
+           if (wlv.diff_hlf != (hlf_T)0)
+           {
+               if (wlv.diff_hlf == HLF_CHD && ptr - line >= change_start
+                                                          && wlv.n_extra == 0)
+                   wlv.diff_hlf = HLF_TXD;             // changed text
+               if (wlv.diff_hlf == HLF_TXD && ptr - line > change_end
+                                                          && wlv.n_extra == 0)
+                   wlv.diff_hlf = HLF_CHD;             // changed line
+               line_attr = HL_ATTR(wlv.diff_hlf);
+               if (wp->w_p_cul && lnum == wp->w_cursor.lnum
+                       && wp->w_p_culopt_flags != CULOPT_NBR
+                       && (!wlv.cul_screenline || (wlv.vcol >= left_curline_col
+                                           && wlv.vcol <= right_curline_col)))
+                   line_attr = hl_combine_attr(
+                                         line_attr, HL_ATTR(HLF_CUL));
+           }
+#endif
+
 #ifdef FEAT_SYN_HL
            if (extra_check && wlv.n_extra == 0)
            {
@@ -2086,9 +2090,13 @@ win_line(
                ++wlv.p_extra;
            }
            --wlv.n_extra;
-#if defined(FEAT_LINEBREAK) && defined(FEAT_PROP_POPUP)
+#if defined(FEAT_PROP_POPUP)
            if (wlv.n_extra <= 0)
+           {
                in_linebreak = FALSE;
+               if (search_attr == 0)
+                   search_attr = saved_search_attr;
+           }
 #endif
        }
        else
diff --git a/src/testdir/dumps/Test_prop_inserts_text_hi_1.dump b/src/testdir/dumps/Test_prop_inserts_text_hi_1.dump
new file mode 100644 (file)
index 0000000..863ded3
--- /dev/null
@@ -0,0 +1,6 @@
+>i+0&#ffffff0|n|s|e|r|t| |s|o|m|e| |t|e|x|t| |B+0#ffffff16#e000002|E|F|O|R|E|(+0#0000000#5fd7ff255|h+0&#ffffff0|e|r|e|)| |a|n|d| |t|h|e|r|e| @20
+|~+0#4040ff13&| @58
+|~| @58
+|~| @58
+|~| @58
+| +0#0000000&@41|1|,|1| @10|A|l@1| 
diff --git a/src/testdir/dumps/Test_prop_inserts_text_hi_2.dump b/src/testdir/dumps/Test_prop_inserts_text_hi_2.dump
new file mode 100644 (file)
index 0000000..1d9d11a
--- /dev/null
@@ -0,0 +1,6 @@
+|i+0&#ffffff0|n|s|e|r|t| |s|o|m|e| >t+0&#ffff4012|e|x|t| |B+0#ffffff16#e000002|E|F|O|R|E|(+0#0000000#5fd7ff255|h+0&#ffff4012|e|r+0&#ffffff0|e|)| |a|n|d| |t|h|e|r|e| @20
+|~+0#4040ff13&| @58
+|~| @58
+|~| @58
+|~| @58
+|/+0#0000000&|t|e|x|t| |(|h|e| @32|1|,|1|3| @9|A|l@1| 
diff --git a/src/testdir/dumps/Test_prop_inserts_text_hi_3.dump b/src/testdir/dumps/Test_prop_inserts_text_hi_3.dump
new file mode 100644 (file)
index 0000000..85ad7dd
--- /dev/null
@@ -0,0 +1,6 @@
+|i+0&#ffffff0|n|s|e|r|t| |s|o|m|e| >t+0&#ffff4012|e|x|t| |B+0#ffffff16#e000002|E|F|O|R|E|(+0#0000000#ffff4012|h|e|r+0&#ffffff0|e|)| |a|n|d| |t|h|e|r|e| @20
+|~+0#4040ff13&| @58
+|~| @58
+|~| @58
+|~| @58
+|:+0#0000000&|c|a|l@1| |m|a|t|c|h|d|e|l|e|t|e|(|t|h|e|m|a|t|c|h|)| @14|1|,|1|3| @9|A|l@1| 
diff --git a/src/testdir/dumps/Test_prop_inserts_text_hi_4.dump b/src/testdir/dumps/Test_prop_inserts_text_hi_4.dump
new file mode 100644 (file)
index 0000000..a5592ac
--- /dev/null
@@ -0,0 +1,6 @@
+|i+0&#ffffff0|n|s|e|r|t| |s|o|m|e| >t|e|x|t| |(+0&#5fd7ff255|A+0#ffffff16#e000002|F|T|E|R|h+0#0000000#ffffff0|e|r|e|)| |a|n|d| |t|h|e|r|e| @21
+|~+0#4040ff13&| @58
+|~| @58
+|~| @58
+|~| @58
+|:+0#0000000&|c|a|l@1| |D|o|A|f|t|e|r|(|)| @26|1|,|1|3| @9|A|l@1| 
diff --git a/src/testdir/dumps/Test_prop_inserts_text_hi_5.dump b/src/testdir/dumps/Test_prop_inserts_text_hi_5.dump
new file mode 100644 (file)
index 0000000..0002aa8
--- /dev/null
@@ -0,0 +1,6 @@
+|i+0&#ffffff0|n|s|e|r|t| |s|o|m|e| >t+0&#ffff4012|e|x|t| |(+0&#5fd7ff255|A+0#ffffff16#e000002|F|T|E|R|h+0#0000000#ffff4012|e|r+0&#ffffff0|e|)| |a|n|d| |t|h|e|r|e| @21
+|~+0#4040ff13&| @58
+|~| @58
+|~| @58
+|~| @58
+|s+0#e000002&|e|a|r|c|h| |h|i|t| |B|O|T|.@2|t|i|n|u|i|n|g| |a|t| |T|O|P| +0#0000000&@10|1|,|1|3| @9|A|l@1| 
diff --git a/src/testdir/dumps/Test_prop_inserts_text_hi_6.dump b/src/testdir/dumps/Test_prop_inserts_text_hi_6.dump
new file mode 100644 (file)
index 0000000..631f51a
--- /dev/null
@@ -0,0 +1,6 @@
+|i+0&#ffffff0|n|s|e|r|t| |s|o|m|e| >t+0&#ffff4012|e|x|t| |(|A+0#ffffff16#e000002|F|T|E|R|h+0#0000000#ffff4012|e|r+0&#ffffff0|e|)| |a|n|d| |t|h|e|r|e| @21
+|~+0#4040ff13&| @58
+|~| @58
+|~| @58
+|~| @58
+|:+0#0000000&|c|a|l@1| |m|a|t|c|h|d|e|l|e|t|e|(|t|h|e|m|a|t|c|h|)| @14|1|,|1|3| @9|A|l@1| 
index 701e853e80800f995895905bc38efd8b4621ddeb..1e5ecc6aebca43c17f2c08634cd7b9b68c2940ee 100644 (file)
@@ -2502,6 +2502,42 @@ func Test_prop_inserts_text()
   call delete('XscriptPropsWithText')
 endfunc
 
+func Test_prop_inserts_text_highlight()
+  CheckRunVimInTerminal
+
+  " Just a basic check for now
+  let lines =<< trim END
+      call setline(1, 'insert some text (here) and there')
+      call prop_type_add('someprop', #{highlight: 'ErrorMsg'})
+      let bef_prop = prop_add(1, 18, #{type: 'someprop', text: 'BEFORE'})
+      set hlsearch
+      let thematch = matchaddpos("DiffAdd", [[1, 18]])
+      func DoAfter()
+        call prop_remove(#{id: g:bef_prop})
+        call prop_add(1, 19, #{type: 'someprop', text: 'AFTER'})
+        let g:thematch = matchaddpos("DiffAdd", [[1, 18]])
+        let @/ = ''
+      endfunc
+  END
+  call writefile(lines, 'XscriptPropsWithHighlight')
+  let buf = RunVimInTerminal('-S XscriptPropsWithHighlight', #{rows: 6, cols: 60})
+  call VerifyScreenDump(buf, 'Test_prop_inserts_text_hi_1', {})
+  call term_sendkeys(buf, "/text (he\<CR>")
+  call VerifyScreenDump(buf, 'Test_prop_inserts_text_hi_2', {})
+  call term_sendkeys(buf, ":call matchdelete(thematch)\<CR>")
+  call VerifyScreenDump(buf, 'Test_prop_inserts_text_hi_3', {})
+
+  call term_sendkeys(buf, ":call DoAfter()\<CR>")
+  call VerifyScreenDump(buf, 'Test_prop_inserts_text_hi_4', {})
+  call term_sendkeys(buf, "/text (he\<CR>")
+  call VerifyScreenDump(buf, 'Test_prop_inserts_text_hi_5', {})
+  call term_sendkeys(buf, ":call matchdelete(thematch)\<CR>")
+  call VerifyScreenDump(buf, 'Test_prop_inserts_text_hi_6', {})
+
+  call StopVimInTerminal(buf)
+  call delete('XscriptPropsWithHighlight')
+endfunc
+
 func Test_props_with_text_after()
   CheckRunVimInTerminal
 
index 0369ad2003737dc29e0c8536538f3bb04a0281c6..b163be2402d65f97623f29db2cd57b68fdb61cb2 100644 (file)
@@ -735,6 +735,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    193,
 /**/
     192,
 /**/