To: vim_dev@googlegroups.com Subject: Patch 8.2.1056 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.1056 Problem: Wrong display when mixing match conceal and syntax conceal. Solution: Adjust how conceal flags are used. (closes #6327, closes #6303) Files: src/drawline.c, src/highlight.c, src/testdir/test_matchadd_conceal.vim *** ../vim-8.2.1055/src/drawline.c 2020-06-18 19:14:58.897637005 +0200 --- src/drawline.c 2020-06-25 20:01:35.588161723 +0200 *************** *** 967,973 **** for (;;) { #if defined(FEAT_CONCEAL) || defined(FEAT_SEARCH_EXTRA) ! int has_match_conc = 0; // match wants to conceal #endif #ifdef FEAT_CONCEAL int did_decrement_ptr = FALSE; --- 967,973 ---- for (;;) { #if defined(FEAT_CONCEAL) || defined(FEAT_SEARCH_EXTRA) ! int has_match_conc = 0; // match wants to conceal #endif #ifdef FEAT_CONCEAL int did_decrement_ptr = FALSE; *************** *** 2353,2365 **** { char_attr = conceal_attr; if ((prev_syntax_id != syntax_seqnr || has_match_conc > 1) ! && (syn_get_sub_char() != NUL || match_conc ! || wp->w_p_cole == 1) && wp->w_p_cole != 3) { // First time at this concealed item: display one // character. ! if (match_conc) c = match_conc; else if (syn_get_sub_char() != NUL) c = syn_get_sub_char(); --- 2353,2366 ---- { char_attr = conceal_attr; if ((prev_syntax_id != syntax_seqnr || has_match_conc > 1) ! && (syn_get_sub_char() != NUL ! || (has_match_conc && match_conc) ! || wp->w_p_cole == 1) && wp->w_p_cole != 3) { // First time at this concealed item: display one // character. ! if (has_match_conc && match_conc) c = match_conc; else if (syn_get_sub_char() != NUL) c = syn_get_sub_char(); *** ../vim-8.2.1055/src/highlight.c 2020-06-12 22:59:07.266097201 +0200 --- src/highlight.c 2020-06-25 20:02:10.416008360 +0200 *************** *** 4419,4427 **** while (cur != NULL || shl_flag == FALSE) { if (shl_flag == FALSE ! && ((cur != NULL ! && cur->priority > SEARCH_HL_PRIORITY) ! || cur == NULL)) { shl = search_hl; shl_flag = TRUE; --- 4419,4426 ---- while (cur != NULL || shl_flag == FALSE) { if (shl_flag == FALSE ! && (cur == NULL ! || cur->priority > SEARCH_HL_PRIORITY)) { shl = search_hl; shl_flag = TRUE; *************** *** 4453,4459 **** *match_conc = cur->conceal_char; } else ! *has_match_conc = *match_conc = 0; # endif } else if (col == shl->endcol) --- 4452,4458 ---- *match_conc = cur->conceal_char; } else ! *has_match_conc = 0; # endif } else if (col == shl->endcol) *************** *** 4503,4511 **** while (cur != NULL || shl_flag == FALSE) { if (shl_flag == FALSE ! && ((cur != NULL ! && cur->priority > SEARCH_HL_PRIORITY) ! || cur == NULL)) { shl = search_hl; shl_flag = TRUE; --- 4502,4509 ---- while (cur != NULL || shl_flag == FALSE) { if (shl_flag == FALSE ! && (cur == NULL || ! cur->priority > SEARCH_HL_PRIORITY)) { shl = search_hl; shl_flag = TRUE; *** ../vim-8.2.1055/src/testdir/test_matchadd_conceal.vim 2020-04-08 21:50:18.876619651 +0200 --- src/testdir/test_matchadd_conceal.vim 2020-06-25 19:56:16.237695788 +0200 *************** *** 63,71 **** setlocal filetype=conf syntax on ! 1put='# This is a Test' ! " 1234567890123456 ! let expect = '#ThisisaTest' call cursor(1, 1) call matchadd('Conceal', '\%2l ', 10, -1, {'conceal': 'X'}) --- 63,71 ---- setlocal filetype=conf syntax on ! 1put='# This is a Test $' ! " 1234567890123 ! let expect = '#ThisisaTest$' call cursor(1, 1) call matchadd('Conceal', '\%2l ', 10, -1, {'conceal': 'X'}) *************** *** 73,94 **** let lnum = 2 call assert_equal(expect, Screenline(lnum)) call assert_equal(screenattr(lnum, 1), screenattr(lnum, 2)) ! call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7)) ! call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10)) ! call assert_equal(screenattr(lnum, 2), screenattr(lnum, 12)) call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 16)) " more matchadd() ! " 1234567890123456 ! let expect = '#Thisisa Test' call matchadd('ErrorMsg', '\%2l Test', 20, -1, {'conceal': 'X'}) redraw! call assert_equal(expect, Screenline(lnum)) call assert_equal(screenattr(lnum, 1) , screenattr(lnum, 2)) ! call assert_equal(screenattr(lnum, 2) , screenattr(lnum, 7)) call assert_notequal(screenattr(lnum, 1) , screenattr(lnum, 10)) ! call assert_equal(screenattr(lnum, 10), screenattr(lnum, 12)) call assert_notequal(screenattr(lnum, 1) , screenattr(lnum, 16)) call assert_notequal(screenattr(lnum, 10), screenattr(lnum, 16)) --- 73,97 ---- let lnum = 2 call assert_equal(expect, Screenline(lnum)) call assert_equal(screenattr(lnum, 1), screenattr(lnum, 2)) ! call assert_equal(screenattr(lnum, 1), screenattr(lnum, 7)) ! call assert_equal(screenattr(lnum, 1), screenattr(lnum, 10)) ! call assert_equal(screenattr(lnum, 1), screenattr(lnum, 12)) ! call assert_equal(screenattr(lnum, 1), screenattr(lnum, 13)) ! call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 14)) call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 16)) " more matchadd() ! " 12345678901234 ! let expect = '#Thisisa Test$' call matchadd('ErrorMsg', '\%2l Test', 20, -1, {'conceal': 'X'}) redraw! call assert_equal(expect, Screenline(lnum)) call assert_equal(screenattr(lnum, 1) , screenattr(lnum, 2)) ! call assert_equal(screenattr(lnum, 1) , screenattr(lnum, 7)) call assert_notequal(screenattr(lnum, 1) , screenattr(lnum, 10)) ! call assert_equal(screenattr(lnum, 10), screenattr(lnum, 13)) ! call assert_equal(screenattr(lnum, 1), screenattr(lnum, 14)) call assert_notequal(screenattr(lnum, 1) , screenattr(lnum, 16)) call assert_notequal(screenattr(lnum, 10), screenattr(lnum, 16)) *************** *** 136,150 **** new setlocal concealcursor=n conceallevel=1 ! 1put='# This is a Test' ! " 1234567890123456 ! let expect = '#ZThisZisZaZTest' call cursor(1, 1) call matchadd('Conceal', '\%2l ', 10, -1, {'conceal': 'Z'}) syntax match MyConceal /\%2l / conceal containedin=ALL cchar=* redraw! ! let lnum = 2 call assert_equal(expect, Screenline(lnum)) call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7)) --- 139,167 ---- new setlocal concealcursor=n conceallevel=1 ! 1put='# This is a Test ' + let lnum = 2 call cursor(1, 1) + + " 123456789012345678 + let expect = '#ZThisZisZaZTestZZ' call matchadd('Conceal', '\%2l ', 10, -1, {'conceal': 'Z'}) + syntax match MyConceal /\%2l / conceal containedin=ALL + hi MyConceal ctermbg=4 ctermfg=2 + redraw! + + call assert_equal(expect, Screenline(lnum)) + call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2)) + call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7)) + call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10)) + call assert_equal(screenattr(lnum, 2), screenattr(lnum, 12)) + call assert_equal(screenattr(lnum, 1), screenattr(lnum, 16)) + + syntax clear MyConceal syntax match MyConceal /\%2l / conceal containedin=ALL cchar=* redraw! ! call assert_equal(expect, Screenline(lnum)) call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7)) *************** *** 152,159 **** call assert_equal(screenattr(lnum, 2), screenattr(lnum, 12)) call assert_equal(screenattr(lnum, 1), screenattr(lnum, 16)) ! " 1234567890123456 ! let expect = '#*This*is*a*Test' call clearmatches() redraw! --- 169,176 ---- call assert_equal(screenattr(lnum, 2), screenattr(lnum, 12)) call assert_equal(screenattr(lnum, 1), screenattr(lnum, 16)) ! " 123456789012345678 ! let expect = '#*This*is*a*Test**' call clearmatches() redraw! *************** *** 164,169 **** --- 181,228 ---- call assert_equal(screenattr(lnum, 2), screenattr(lnum, 12)) call assert_equal(screenattr(lnum, 1), screenattr(lnum, 16)) + " 123456789012345678 + let expect = '#*ThisXis*a*Test**' + call matchadd('Conceal', '\%2l\%7c ', 10, -1, {'conceal': 'X'}) + redraw! + + call assert_equal(expect, Screenline(lnum)) + call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2)) + call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7)) + call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10)) + call assert_equal(screenattr(lnum, 2), screenattr(lnum, 12)) + call assert_equal(screenattr(lnum, 1), screenattr(lnum, 16)) + + " 123456789012345678 + let expect = '#*ThisXis*a*Test**' + call matchadd('ErrorMsg', '\%2l Test', 20, -1) + redraw! + + call assert_equal(expect, Screenline(lnum)) + call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2)) + call assert_equal(screenattr(lnum, 2), screenattr(lnum, 12)) + call assert_notequal(screenattr(lnum, 12), screenattr(lnum, 13)) + call assert_equal(screenattr(lnum, 13), screenattr(lnum, 16)) + call assert_equal(screenattr(lnum, 2), screenattr(lnum, 17)) + call assert_equal(screenattr(lnum, 2), screenattr(lnum, 18)) + call assert_notequal(screenattr(lnum, 18), screenattr(lnum, 19)) + + " 123456789012345678 + let expect = '# ThisXis a Test' + syntax clear MyConceal + syntax match MyConceal /\%2l / conceal containedin=ALL + redraw! + + call assert_equal(expect, Screenline(lnum)) + call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2)) + call assert_equal(screenattr(lnum, 2), screenattr(lnum, 12)) + call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 12)) + call assert_notequal(screenattr(lnum, 12), screenattr(lnum, 13)) + call assert_equal(screenattr(lnum, 13), screenattr(lnum, 16)) + call assert_equal(screenattr(lnum, 2), screenattr(lnum, 17)) + call assert_equal(screenattr(lnum, 2), screenattr(lnum, 18)) + call assert_notequal(screenattr(lnum, 18), screenattr(lnum, 19)) + syntax off quit! endfunc *** ../vim-8.2.1055/src/version.c 2020-06-25 19:53:21.606571192 +0200 --- src/version.c 2020-06-25 19:58:37.968982455 +0200 *************** *** 756,757 **** --- 756,759 ---- { /* Add new patch number below this line */ + /**/ + 1056, /**/ -- It is illegal for anyone to try and stop a child from playfully jumping over puddles of water. [real standing law in California, United States of America] /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///