# HG changeset patch # User Christian Brabandt # Date 1498162504 -7200 # Node ID cbceef33af7a1b1981e7f17dd2020fba7ca897aa # Parent d41c3729fd96706c35c1d9bce51c40c6c2111ae5 patch 8.0.0659: no test for conceal mode commit https://github.com/vim/vim/commit/4d785895d1f8b54cdd3fabd87446ca692f49e94e Author: Bram Moolenaar Date: Thu Jun 22 22:00:50 2017 +0200 patch 8.0.0659: no test for conceal mode Problem: No test for conceal mode. Solution: Add a conceal mode test. (Dominique Pelle, closes https://github.com/vim/vim/issues/1783) diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -7655,17 +7655,20 @@ synIDtrans({synID}) *synIDtrans()* ":highlight link" are followed. synconcealed({lnum}, {col}) *synconcealed()* - The result is a List. The first item in the list is 0 if the - character at the position {lnum} and {col} is not part of a - concealable region, 1 if it is. The second item in the list is - a string. If the first item is 1, the second item contains the - text which will be displayed in place of the concealed text, - depending on the current setting of 'conceallevel'. The third - and final item in the list is a unique number representing the - specific syntax region matched. This allows detection of the - beginning of a new concealable region if there are two - consecutive regions with the same replacement character. - For an example use see $VIMRUNTIME/syntax/2html.vim . + The result is a List with currently three items: + 1. The first item in the list is 0 if the character at the + position {lnum} and {col} is not part of a concealable + region, 1 if it is. + 2. The second item in the list is a string. If the first item + is 1, the second item contains the text which will be + displayed in place of the concealed text, depending on the + current setting of 'conceallevel' and 'listchars'. + 3. The third and final item in the list is a unique number + representing the specific syntax region matched. This + allows detection of the beginning of a new concealable + region if there are two consecutive regions with the same + replacement character. For an example use see + $VIMRUNTIME/syntax/2html.vim . synstack({lnum}, {col}) *synstack()* diff --git a/src/evalfunc.c b/src/evalfunc.c --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -11841,8 +11841,8 @@ f_synconcealed(typval_T *argvars UNUSED, if ((syntax_flags & HL_CONCEAL) && curwin->w_p_cole < 3) { cchar = syn_get_sub_char(); - if (cchar == NUL && curwin->w_p_cole == 1 && lcs_conceal != NUL) - cchar = lcs_conceal; + if (cchar == NUL && curwin->w_p_cole == 1) + cchar = (lcs_conceal == NUL) ? ' ' : lcs_conceal; if (cchar != NUL) { # ifdef FEAT_MBYTE diff --git a/src/testdir/test_syntax.vim b/src/testdir/test_syntax.vim --- a/src/testdir/test_syntax.vim +++ b/src/testdir/test_syntax.vim @@ -4,6 +4,8 @@ if !has("syntax") finish endif +source view_util.vim + func GetSyntaxItem(pat) let c = '' let a = ['a', getreg('a'), getregtype('a')] @@ -458,3 +460,46 @@ func Test_syntax_hangs() set redrawtime& bwipe! endfunc + + +func Test_conceal() + if !has('conceal') + return + endif + + new + call setline(1, ['', '123456']) + syn match test23 "23" conceal cchar=X + syn match test45 "45" conceal + + set conceallevel=0 + call assert_equal('123456 ', ScreenLines(2, 7)[0]) + call assert_equal([[0, ''], [0, ''], [0, ''], [0, ''], [0, ''], [0, '']], map(range(1, 6), 'synconcealed(2, v:val)[0:1]')) + + set conceallevel=1 + call assert_equal('1X 6 ', ScreenLines(2, 7)[0]) + " FIXME: with conceallevel=1, I would expect that the portion "45" of + " the line to be replaced with a space since ":help 'conceallevel' + " states that if listchars is not set, then the default replacement + " should be a space. But synconcealed() gives an empty string in + " the 2nd value of the returned list. Bug? + " So for now, the following line is commented out: + call assert_equal([[0, ''], [1, 'X'], [1, 'X'], [1, ' '], [1, ' '], [0, '']], map(range(1, 6), 'synconcealed(2, v:val)[0:1]')) + + set conceallevel=1 + set listchars=conceal:Y + call assert_equal([[0, ''], [1, 'X'], [1, 'X'], [1, 'Y'], [1, 'Y'], [0, '']], map(range(1, 6), 'synconcealed(2, v:val)[0:1]')) + call assert_equal('1XY6 ', ScreenLines(2, 7)[0]) + + set conceallevel=2 + call assert_match('1X6 ', ScreenLines(2, 7)[0]) + call assert_equal([[0, ''], [1, 'X'], [1, 'X'], [1, ''], [1, ''], [0, '']], map(range(1, 6), 'synconcealed(2, v:val)[0:1]')) + + set conceallevel=3 + call assert_match('16 ', ScreenLines(2, 7)[0]) + call assert_equal([[0, ''], [1, ''], [1, ''], [1, ''], [1, ''], [0, '']], map(range(1, 6), 'synconcealed(2, v:val)[0:1]')) + + syn clear + set conceallevel& + bw! +endfunc diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -765,6 +765,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 659, +/**/ 658, /**/ 657,