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:
32
src/screen.c
32
src/screen.c
@@ -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
|
||||||
|
@@ -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<====>$',
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user