]> granicus.if.org Git - vim/commitdiff
patch 8.2.4918: conceal character from matchadd() displayed too many times v8.2.4918
authorLemonBoy <thatlemon@gmail.com>
Sun, 8 May 2022 20:25:20 +0000 (21:25 +0100)
committerBram Moolenaar <Bram@vim.org>
Sun, 8 May 2022 20:25:20 +0000 (21:25 +0100)
Problem:    Conceal character from matchadd() displayed too many times.
Solution:   Check the syntax flag. (closes #10381, closes #7268)

src/drawline.c
src/testdir/test_matchadd_conceal.vim
src/version.c

index caff9abc70abc0dfe1f165829e44a2502c78031a..a8739fe3d1a9e8be9f08f013c5fdfe96cb349d7c 100644 (file)
@@ -2477,14 +2477,16 @@ win_line(
 
 #ifdef FEAT_CONCEAL
            if (   wp->w_p_cole > 0
-               && (wp != curwin || lnum != wp->w_cursor.lnum ||
-                                                      conceal_cursor_line(wp))
+               && (wp != curwin || lnum != wp->w_cursor.lnum
+                                                   || conceal_cursor_line(wp))
                && ((syntax_flags & HL_CONCEAL) != 0 || has_match_conc > 0)
                && !(lnum_in_visual_area
                                    && vim_strchr(wp->w_p_cocu, 'v') == NULL))
            {
                char_attr = conceal_attr;
-               if ((prev_syntax_id != syntax_seqnr || has_match_conc > 1)
+               if (((prev_syntax_id != syntax_seqnr
+                                          && (syntax_flags & HL_CONCEAL) != 0)
+                           || has_match_conc > 1)
                        && (syn_get_sub_char() != NUL
                                || (has_match_conc && match_conc)
                                || wp->w_p_cole == 1)
index 3dc6bb3c884f7f3ff70a2fd872021cc464692b3b..e6a516504747a492ebb7f131035e02c8becb9458 100644 (file)
@@ -339,6 +339,27 @@ func Test_matchadd_and_syn_conceal()
   call assert_equal(screenattr(1, 11) , screenattr(1, 32))
 endfunc
 
+func Test_interaction_matchadd_syntax()
+  CheckRunVimInTerminal
+
+  new
+  " Test for issue #7268 fix.
+  " When redrawing the second column, win_line() was comparing the sequence
+  " number of the syntax-concealed region with a bogus zero value that was
+  " returned for the matchadd-concealed region. Before 8.0.0672 the sequence
+  " number was never reset, thus masking the problem.
+  call setline(1, 'aaa|bbb|ccc')
+  call matchadd('Conceal', '^..', 10, -1, #{conceal: 'X'})
+  syn match foobar '^.'
+  setl concealcursor=n conceallevel=1
+  redraw!
+
+  call assert_equal('Xa|bbb|ccc', Screenline(1))
+  call assert_notequal(screenattr(1, 1), screenattr(1, 2))
+
+  bwipe!
+endfunc
+
 func Test_cursor_column_in_concealed_line_after_window_scroll()
   CheckRunVimInTerminal
 
index 29cddd51397bae699cf962a388b4f83621249a90..f949dd6d7ed0917fb2e771eb975955bff4c5fdaa 100644 (file)
@@ -746,6 +746,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4918,
 /**/
     4917,
 /**/