1
0
forked from aniani/vim

patch 8.1.1868: multi-byte chars in 'listchars' fail with 'linebreak' set

Problem:    Multibyte characters in 'listchars' don't work correctly if
            'linebreak' is also enabled. (Martin Tournoij)
Solution:   Make it work correctly. (Christian Brabandt, closes #4822,
            closes #4812)
This commit is contained in:
Bram Moolenaar
2019-08-17 14:10:56 +02:00
parent 315244d85b
commit 69cbbecf54
3 changed files with 43 additions and 15 deletions

View File

@@ -4891,7 +4891,7 @@ win_line(
if (*p_sbr != NUL && vcol == vcol_sbr && wp->w_p_wrap) if (*p_sbr != NUL && vcol == vcol_sbr && wp->w_p_wrap)
vcol_adjusted = vcol - MB_CHARLEN(p_sbr); vcol_adjusted = vcol - MB_CHARLEN(p_sbr);
#endif #endif
/* tab amount depends on current column */ // tab amount depends on current column
#ifdef FEAT_VARTABS #ifdef FEAT_VARTABS
tab_len = tabstop_padding(vcol_adjusted, tab_len = tabstop_padding(vcol_adjusted,
wp->w_buffer->b_p_ts, wp->w_buffer->b_p_ts,
@@ -4904,7 +4904,7 @@ win_line(
#ifdef FEAT_LINEBREAK #ifdef FEAT_LINEBREAK
if (!wp->w_p_lbr || !wp->w_p_list) if (!wp->w_p_lbr || !wp->w_p_list)
#endif #endif
/* tab amount depends on current column */ // tab amount depends on current column
n_extra = tab_len; n_extra = tab_len;
#ifdef FEAT_LINEBREAK #ifdef FEAT_LINEBREAK
else else
@@ -4916,18 +4916,17 @@ win_line(
#ifdef FEAT_CONCEAL #ifdef FEAT_CONCEAL
if (vcol_off > 0) if (vcol_off > 0)
/* there are characters to conceal */ // there are characters to conceal
tab_len += vcol_off; tab_len += vcol_off;
/* boguscols before FIX_FOR_BOGUSCOLS macro from above // boguscols before FIX_FOR_BOGUSCOLS macro from above
*/
if (wp->w_p_list && lcs_tab1 && old_boguscols > 0 if (wp->w_p_list && lcs_tab1 && old_boguscols > 0
&& n_extra > tab_len) && n_extra > tab_len)
tab_len += n_extra - tab_len; tab_len += n_extra - tab_len;
#endif #endif
/* if n_extra > 0, it gives the number of chars, to // if n_extra > 0, it gives the number of chars, to
* use for a tab, else we need to calculate the width // use for a tab, else we need to calculate the width
* for a tab */ // for a tab
len = (tab_len * mb_char2len(lcs_tab2)); len = (tab_len * mb_char2len(lcs_tab2));
if (n_extra > 0) if (n_extra > 0)
len += n_extra - tab_len; len += n_extra - tab_len;
@@ -4939,20 +4938,27 @@ win_line(
p_extra_free = p; p_extra_free = p;
for (i = 0; i < tab_len; i++) for (i = 0; i < tab_len; i++)
{ {
int lcs = lcs_tab2;
if (*p == NUL) if (*p == NUL)
{ {
tab_len = i; tab_len = i;
break; break;
} }
mb_char2bytes(lcs_tab2, p);
p += mb_char2len(lcs_tab2); // if lcs_tab3 is given, need to change the char
n_extra += mb_char2len(lcs_tab2) // for tab
if (lcs_tab3 && i == tab_len - 1)
lcs = lcs_tab3;
mb_char2bytes(lcs, p);
p += mb_char2len(lcs);
n_extra += mb_char2len(lcs)
- (saved_nextra > 0 ? 1 : 0); - (saved_nextra > 0 ? 1 : 0);
} }
p_extra = p_extra_free; p_extra = p_extra_free;
#ifdef FEAT_CONCEAL #ifdef FEAT_CONCEAL
/* n_extra will be increased by FIX_FOX_BOGUSCOLS // n_extra will be increased by FIX_FOX_BOGUSCOLS
* macro below, so need to adjust for that here */ // macro below, so need to adjust for that here
if (vcol_off > 0) if (vcol_off > 0)
n_extra -= vcol_off; n_extra -= vcol_off;
#endif #endif

View File

@@ -58,6 +58,26 @@ func Test_listchars()
call assert_equal([expected[i - 1]], ScreenLines(i, virtcol('$'))) call assert_equal([expected[i - 1]], ScreenLines(i, virtcol('$')))
endfor endfor
" tab with 3rd character and linebreak set
set listchars-=tab:<=>
set listchars+=tab:<·>
set linebreak
let expected = [
\ '<······>aa<····>$',
\ '..bb<··>--$',
\ '...cccc>-$',
\ 'dd........ee--<>$',
\ '-$'
\ ]
redraw!
for i in range(1, 5)
call cursor(i, 1)
call assert_equal([expected[i - 1]], ScreenLines(i, virtcol('$')))
endfor
set nolinebreak
set listchars-=tab:<·>
set listchars+=tab:<=>
set listchars-=trail:- set listchars-=trail:-
let expected = [ let expected = [
\ '<======>aa<====>$', \ '<======>aa<====>$',

View File

@@ -769,6 +769,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1868,
/**/ /**/
1867, 1867,
/**/ /**/