diff options
author | Bram Moolenaar <Bram@vim.org> | 2019-08-17 14:10:56 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2019-08-17 14:10:56 +0200 |
commit | 69cbbecf548f390197259ca30cfe147c3e59ce5a (patch) | |
tree | 85d93e5c0dc8578860e1511fc80cc6f8d9a74a9e /src/screen.c | |
parent | 315244d85b9b8faae549b1700e8cc2e45eaa68ea (diff) | |
download | vim-git-69cbbecf548f390197259ca30cfe147c3e59ce5a.tar.gz |
patch 8.1.1868: multi-byte chars in 'listchars' fail with 'linebreak' setv8.1.1868
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)
Diffstat (limited to 'src/screen.c')
-rw-r--r-- | src/screen.c | 36 |
1 files changed, 21 insertions, 15 deletions
diff --git a/src/screen.c b/src/screen.c index 72b346d96..760cd2c1f 100644 --- a/src/screen.c +++ b/src/screen.c @@ -4891,7 +4891,7 @@ win_line( if (*p_sbr != NUL && vcol == vcol_sbr && wp->w_p_wrap) vcol_adjusted = vcol - MB_CHARLEN(p_sbr); #endif - /* tab amount depends on current column */ + // tab amount depends on current column #ifdef FEAT_VARTABS tab_len = tabstop_padding(vcol_adjusted, wp->w_buffer->b_p_ts, @@ -4904,30 +4904,29 @@ win_line( #ifdef FEAT_LINEBREAK if (!wp->w_p_lbr || !wp->w_p_list) #endif - /* tab amount depends on current column */ + // tab amount depends on current column n_extra = tab_len; #ifdef FEAT_LINEBREAK else { - char_u *p; + char_u *p; int len; int i; int saved_nextra = n_extra; #ifdef FEAT_CONCEAL if (vcol_off > 0) - /* there are characters to conceal */ + // there are characters to conceal 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 && n_extra > tab_len) tab_len += n_extra - tab_len; #endif - /* if n_extra > 0, it gives the number of chars, to - * use for a tab, else we need to calculate the width - * for a tab */ + // if n_extra > 0, it gives the number of chars, to + // use for a tab, else we need to calculate the width + // for a tab len = (tab_len * mb_char2len(lcs_tab2)); if (n_extra > 0) len += n_extra - tab_len; @@ -4939,20 +4938,27 @@ win_line( p_extra_free = p; for (i = 0; i < tab_len; i++) { + int lcs = lcs_tab2; + if (*p == NUL) { tab_len = i; break; } - mb_char2bytes(lcs_tab2, p); - p += mb_char2len(lcs_tab2); - n_extra += mb_char2len(lcs_tab2) - - (saved_nextra > 0 ? 1 : 0); + + // if lcs_tab3 is given, need to change the char + // 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); } p_extra = p_extra_free; #ifdef FEAT_CONCEAL - /* n_extra will be increased by FIX_FOX_BOGUSCOLS - * macro below, so need to adjust for that here */ + // n_extra will be increased by FIX_FOX_BOGUSCOLS + // macro below, so need to adjust for that here if (vcol_off > 0) n_extra -= vcol_off; #endif |