diff options
author | Bram Moolenaar <Bram@vim.org> | 2019-03-30 15:34:47 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2019-03-30 15:34:47 +0100 |
commit | 5f8069bbf5d989936a2f4d7a76ae42434017e3a2 (patch) | |
tree | ff20971d662be93693a5d0ac5a45b516563f5d0f | |
parent | 9a2c091a748b380efafe60583698c9afcaab1e46 (diff) |
patch 8.1.1078: when 'listchars' is set a composing char on a space is wrongv8.1.1078
Problem: When 'listchars' is set a composing char on a space is wrong.
Solution: Separate handling a non-breaking space and a space. (Yasuhiro
Matsumoto, closes #4046)
-rw-r--r-- | src/screen.c | 42 | ||||
-rw-r--r-- | src/testdir/test_listchars.vim | 23 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 48 insertions, 19 deletions
diff --git a/src/screen.c b/src/screen.c index 7706b6c586..c3cc8cdfa2 100644 --- a/src/screen.c +++ b/src/screen.c @@ -4808,30 +4808,34 @@ win_line( } #endif - /* 'list': change char 160 to lcs_nbsp and space to lcs_space. - */ - if (wp->w_p_list - && (((c == 160 - || (mb_utf8 && (mb_c == 160 || mb_c == 0x202f))) - && lcs_nbsp) - || (c == ' ' && lcs_space && ptr - line <= trailcol))) + // 'list': change char 160 to lcs_nbsp and space to lcs_space. + if (wp->w_p_list) { - c = (c == ' ') ? lcs_space : lcs_nbsp; - if (area_attr == 0 && search_attr == 0) + if ((c == 160 + || (mb_utf8 && (mb_c == 160 || mb_c == 0x202f))) + && lcs_nbsp) { - n_attr = 1; - extra_attr = HL_ATTR(HLF_8); - saved_attr2 = char_attr; /* save current attr */ + c = lcs_nbsp; + mb_c = c; + if (enc_utf8 && utf_char2len(c) > 1) + { + mb_utf8 = TRUE; + u8cc[0] = 0; + c = 0xc0; + } + else + mb_utf8 = FALSE; } - mb_c = c; - if (enc_utf8 && utf_char2len(c) > 1) + else if (c == ' ' && lcs_space && ptr - line <= trailcol) { - mb_utf8 = TRUE; - u8cc[0] = 0; - c = 0xc0; + c = lcs_space; + if (mb_utf8 == FALSE && area_attr == 0 && search_attr == 0) + { + n_attr = 1; + extra_attr = HL_ATTR(HLF_8); + saved_attr2 = char_attr; // save current attr + } } - else - mb_utf8 = FALSE; } if (trailcol != MAXCOL && ptr > line + trailcol && c == ' ') diff --git a/src/testdir/test_listchars.vim b/src/testdir/test_listchars.vim index 2870f2d4ef..1e90856a21 100644 --- a/src/testdir/test_listchars.vim +++ b/src/testdir/test_listchars.vim @@ -113,3 +113,26 @@ func Test_listchars() enew! set listchars& ff& endfunc + +func Test_listchars_composing() + enew! + let oldencoding=&encoding + set encoding=utf-8 + set ff=unix + set list + + set listchars=eol:$,space:_ + call append(0, [ + \ " \u3099 \u309A" + \ ]) + let expected = [ + \ "_ \u3099^I \u309A$" + \ ] + redraw! + call cursor(1, 1) + let got = ScreenLinesUtf8(1, virtcol('$')) + bw! + call assert_equal(expected, got) + let &encoding=oldencoding + set listchars& ff& +endfunction diff --git a/src/version.c b/src/version.c index e84b5db8d5..6bca45d57e 100644 --- a/src/version.c +++ b/src/version.c @@ -776,6 +776,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1078, +/**/ 1077, /**/ 1076, |