diff options
author | zeertzjq <zeertzjq@outlook.com> | 2021-09-19 13:13:44 +0800 |
---|---|---|
committer | zeertzjq <zeertzjq@outlook.com> | 2021-09-19 13:13:44 +0800 |
commit | 59e80c4dfcddeb9f20e175afbdb8f085ec5da985 (patch) | |
tree | 5d4e1c488d3366f52f11f2cb73e537931cff9dac /src/nvim/screen.c | |
parent | c14dc616bf4a6121e49594c8f51c1fb197b2ac7f (diff) | |
download | rneovim-59e80c4dfcddeb9f20e175afbdb8f085ec5da985.tar.gz rneovim-59e80c4dfcddeb9f20e175afbdb8f085ec5da985.tar.bz2 rneovim-59e80c4dfcddeb9f20e175afbdb8f085ec5da985.zip |
vim-patch:8.1.1110: composing chars on space wrong when 'listchars' is set
Problem: Composing chars on space wrong when 'listchars' is set.
Solution: Do not use "space" and "nbsp" entries of 'listchars' when there is
a composing character. (Yee Cheng Chin, closes vim/vim#4197)
https://github.com/vim/vim/commit/e5e4e22c1c15c8c22b14935affe969569acc8df9
Diffstat (limited to 'src/nvim/screen.c')
-rw-r--r-- | src/nvim/screen.c | 48 |
1 files changed, 25 insertions, 23 deletions
diff --git a/src/nvim/screen.c b/src/nvim/screen.c index 5ce8e0b348..1df5d6e8ef 100644 --- a/src/nvim/screen.c +++ b/src/nvim/screen.c @@ -3580,29 +3580,31 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc } } - // 'list': change char 160 to 'nbsp' and space to 'space'. - if (wp->w_p_list) { - if ((c == 160 || (mb_utf8 && (mb_c == 160 || mb_c == 0x202f))) - && wp->w_p_lcs_chars.nbsp) { - c = wp->w_p_lcs_chars.nbsp; - mb_c = c; - if (utf_char2len(c) > 1) { - mb_utf8 = true; - u8cc[0] = 0; - c = 0xc0; - } else { - mb_utf8 = false; - } - } else if (c == ' ' - && wp->w_p_lcs_chars.space - && ptr - line >= leadcol - && ptr - line <= trailcol) { - c = wp->w_p_lcs_chars.space; - if (mb_utf8 == false) { - n_attr = 1; - extra_attr = win_hl_attr(wp, HLF_0); - saved_attr2 = char_attr; // save current attr - } + // 'list': Change char 160 to 'nbsp' and space to 'space'. + // But not when the character is followed by a composing + // character (use mb_l to check that). + if (wp->w_p_list + && ((((c == 160 && mb_l == 1) + || (mb_utf8 + && ((mb_c == 160 && mb_l == 2) + || (mb_c == 0x202f && mb_l == 3)))) + && wp->w_p_lcs_chars.nbsp) + || (c == ' ' + && mb_l == 1 + && wp->w_p_lcs_chars.space + && ptr - line >= leadcol + && ptr - line <= trailcol))) { + c = (c == ' ') ? wp->w_p_lcs_chars.space : wp->w_p_lcs_chars.nbsp; + n_attr = 1; + extra_attr = win_hl_attr(wp, HLF_0); + saved_attr2 = char_attr; // save current attr + mb_c = c; + if (utf_char2len(c) > 1) { + mb_utf8 = true; + u8cc[0] = 0; + c = 0xc0; + } else { + mb_utf8 = false; } } |