Commit: patch 9.2.0028: matchadd() conceal may use unrelated syntax cchar

1 view
Skip to first unread message

Christian Brabandt

unread,
11:46 AM (4 hours ago) 11:46 AM
to vim...@googlegroups.com
patch 9.2.0028: matchadd() conceal may use unrelated syntax cchar

Commit: https://github.com/vim/vim/commit/d01f234ec1d04cc09bfd0c3db1e53cab7acb0d65
Author: zeertzjq <zeer...@outlook.com>
Date: Thu Feb 19 16:42:09 2026 +0000

patch 9.2.0028: matchadd() conceal may use unrelated syntax cchar

Problem: matchadd() conceal may use unrelated syntax cchar.
Solution: Only use syntax cchar when syntax_flags has HL_CONCEAL
(zeertzjq).

closes: #19459

Signed-off-by: zeertzjq <zeer...@outlook.com>
Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/src/drawline.c b/src/drawline.c
index ef776dc20..e259e15e3 100644
--- a/src/drawline.c
+++ b/src/drawline.c
@@ -3626,11 +3626,11 @@ win_line(
&& !(lnum_in_visual_area
&& vim_strchr(wp->w_p_cocu, 'v') == NULL))
{
+ int syntax_conceal = (syntax_flags & HL_CONCEAL) != 0;
wlv.char_attr = conceal_attr;
- if (((prev_syntax_id != syntax_seqnr
- && (syntax_flags & HL_CONCEAL) != 0)
+ if (((prev_syntax_id != syntax_seqnr && syntax_conceal)
|| has_match_conc > 1)
- && (syn_get_sub_char() != NUL
+ && ((syntax_conceal && syn_get_sub_char() != NUL)
|| (has_match_conc && match_conc)
|| wp->w_p_cole == 1)
&& wp->w_p_cole != 3)
@@ -3639,7 +3639,7 @@ win_line(
// character.
if (has_match_conc && match_conc)
c = match_conc;
- else if (syn_get_sub_char() != NUL)
+ else if (syntax_conceal && syn_get_sub_char() != NUL)
c = syn_get_sub_char();
else if (wp->w_lcs_chars.conceal != NUL)
c = wp->w_lcs_chars.conceal;
diff --git a/src/testdir/test_matchadd_conceal.vim b/src/testdir/test_matchadd_conceal.vim
index 764e8c6e3..b6917113b 100644
--- a/src/testdir/test_matchadd_conceal.vim
+++ b/src/testdir/test_matchadd_conceal.vim
@@ -202,6 +202,29 @@ func Test_syn_and_match_conceal()
call assert_equal(screenattr(lnum, 2), screenattr(lnum, 18))
call assert_notequal(screenattr(lnum, 18), screenattr(lnum, 19))

+ 5new | setlocal conceallevel=2 concealcursor=n
+ redraw!
+ call assert_equal(expect, Screenline(6 + lnum))
+
+ " Syntax conceal shouldn't interfere with matchadd() in another buffer.
+ call setline(1, 'foo bar baz')
+ call matchadd('Conceal', 'bar')
+ redraw!
+ call assert_equal('foo baz', Screenline(1))
+ call assert_equal(expect, Screenline(6 + lnum))
+
+ " Syntax conceal shouldn't interfere with matchadd() in the same buffer.
+ syntax match MyOtherConceal /foo/ conceal cchar=!
+ redraw!
+ call assert_equal('! baz', Screenline(1))
+ call assert_equal(expect, Screenline(6 + lnum))
+
+ syntax clear
+ redraw!
+ call assert_equal('foo baz', Screenline(1))
+ call assert_equal(expect, Screenline(6 + lnum))
+ bwipe!
+
" 123456789012345678
let expect = '# ThisXis a Test'
syntax clear MyConceal
diff --git a/src/version.c b/src/version.c
index 4744ccf22..84a2a8e69 100644
--- a/src/version.c
+++ b/src/version.c
@@ -734,6 +734,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 28,
/**/
27,
/**/
Reply all
Reply to author
Forward
0 new messages