# HG changeset patch # User Bram Moolenaar # Date 1424190370 -3600 # Node ID 43f444efe6a2de86f459e9dc164429a8d81c70e7 # Parent 7c5728c7f35e9026e7efbac4b3b137e11296b1e6 updated for version 7.4.639 Problem: Combination of linebreak and conceal doesn't work well. Solution: Fix the display problems. (Christian Brabandt) diff --git a/src/screen.c b/src/screen.c --- a/src/screen.c +++ b/src/screen.c @@ -4571,7 +4571,7 @@ win_line(wp, lnum, startrow, endrow, noc int saved_nextra = n_extra; #ifdef FEAT_CONCEAL - if ((is_concealing || boguscols > 0) && vcol_off > 0) + if (vcol_off > 0) /* there are characters to conceal */ tab_len += vcol_off; /* boguscols before FIX_FOR_BOGUSCOLS macro from above @@ -4609,25 +4609,30 @@ win_line(wp, lnum, startrow, endrow, noc #ifdef FEAT_CONCEAL /* n_extra will be increased by FIX_FOX_BOGUSCOLS * macro below, so need to adjust for that here */ - if ((is_concealing || boguscols > 0) && vcol_off > 0) + if (vcol_off > 0) n_extra -= vcol_off; #endif } #endif #ifdef FEAT_CONCEAL - /* Tab alignment should be identical regardless of - * 'conceallevel' value. So tab compensates of all - * previous concealed characters, and thus resets vcol_off - * and boguscols accumulated so far in the line. Note that - * the tab can be longer than 'tabstop' when there - * are concealed characters. */ - FIX_FOR_BOGUSCOLS; - /* Make sure, the highlighting for the tab char will be - * correctly set further below (effectively reverts the - * FIX_FOR_BOGSUCOLS macro */ - if (old_boguscols > 0 && n_extra > tab_len && wp->w_p_list + { + int vc_saved = vcol_off; + + /* Tab alignment should be identical regardless of + * 'conceallevel' value. So tab compensates of all + * previous concealed characters, and thus resets + * vcol_off and boguscols accumulated so far in the + * line. Note that the tab can be longer than + * 'tabstop' when there are concealed characters. */ + FIX_FOR_BOGUSCOLS; + + /* Make sure, the highlighting for the tab char will be + * correctly set further below (effectively reverts the + * FIX_FOR_BOGSUCOLS macro */ + if (n_extra == tab_len + vc_saved && wp->w_p_list && lcs_tab1) - tab_len += n_extra - tab_len; + tab_len += vc_saved; + } #endif #ifdef FEAT_MBYTE mb_utf8 = FALSE; /* don't draw as UTF-8 */ diff --git a/src/testdir/test88.in b/src/testdir/test88.in --- a/src/testdir/test88.in +++ b/src/testdir/test88.in @@ -71,6 +71,17 @@ GGk :set lbr :normal $ GGk +:set list listchars=tab:>- +:normal 0 +GGk +:normal W +GGk +:normal W +GGk +:normal W +GGk +:normal $ +GGk :" Display result. :call append('$', 'end:') :call append('$', positions) diff --git a/src/testdir/test88.ok b/src/testdir/test88.ok --- a/src/testdir/test88.ok +++ b/src/testdir/test88.ok @@ -22,3 +22,8 @@ 9:17 9:25 9:26 9:26 +9:1 +9:9 +9:17 +9:25 +9:26 diff --git a/src/testdir/test_listlbr_utf8.in b/src/testdir/test_listlbr_utf8.in --- a/src/testdir/test_listlbr_utf8.in +++ b/src/testdir/test_listlbr_utf8.in @@ -56,6 +56,41 @@ STARTTEST :redraw! :let line=ScreenChar(winwidth(0),7) :call DoRecordScreen() +:let g:test ="Test 5: set linebreak list listchars and concealing part2" +:let c_defines=['bbeeeeee ; some text'] +:call append('$', c_defines) +:$ +:norm! zt +:set nowrap ts=2 list linebreak listchars=tab:>- cole=2 concealcursor=n +:syn clear +:syn match meaning /;\s*\zs.*/ +:syn match hasword /^\x\{8}/ contains=word +:syn match word /\<\x\{8}\>/ contains=beginword,endword contained +:syn match beginword /\<\x\x/ contained conceal +:syn match endword /\x\{6}\>/ contained +:hi meaning guibg=blue +:hi beginword guibg=green +:hi endword guibg=red +:redraw! +:let line=ScreenChar(winwidth(0),1) +:call DoRecordScreen() +:let g:test ="Test 6: Screenattributes for comment" +:$put =g:test +:call append('$', ' /* and some more */') +:exe "set ft=c ts=7 linebreak list listchars=nbsp:\u2423,tab:\u2595\u2014,trail:\u02d1,eol:\ub6" +:syntax on +:hi SpecialKey term=underline ctermfg=red guifg=red +:let attr=[] +:nnoremap GG ":let attr += ['".screenattr(screenrow(),screencol())."']\n" +:$ +:norm! zt0 +GGlGGlGGlGGlGGlGGlGGlGGlGGlGGl +:call append('$', ['ScreenAttributes for test6:']) +:if attr[0] != attr[1] && attr[1] != attr[3] && attr[3] != attr[5] +: call append('$', "Attribut 0 and 1 and 3 and 5 are different!") +:else +: call append('$', "Not all attributes are different") +:endif :%w! test.out :qa! ENDTEST diff --git a/src/testdir/test_listlbr_utf8.ok b/src/testdir/test_listlbr_utf8.ok --- a/src/testdir/test_listlbr_utf8.ok +++ b/src/testdir/test_listlbr_utf8.ok @@ -36,3 +36,11 @@ Test 4: set linebreak list listchars and #define >_FILE>--------->--->---1 #define >_CONSOLE>---------->---2 #define >_FILE_AND_CONSOLE>---------3 +bbeeeeee ; some text + +Test 5: set linebreak list listchars and concealing part2 +eeeeee>--->-;>some text +Test 6: Screenattributes for comment + /* and some more */ +ScreenAttributes for test6: +Attribut 0 and 1 and 3 and 5 are different! diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -742,6 +742,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 639, +/**/ 638, /**/ 637,