changeset 16146:aaa6e9a43a60 v8.1.1078

patch 8.1.1078: when 'listchars' is set a composing char on a space is wrong commit https://github.com/vim/vim/commit/5f8069bbf5d989936a2f4d7a76ae42434017e3a2 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Mar 30 15:34:47 2019 +0100 patch 8.1.1078: when 'listchars' is set a composing char on a space is wrong 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)
author Bram Moolenaar <Bram@vim.org>
date Sat, 30 Mar 2019 15:45:05 +0100
parents 3ac2f32abf22
children bca0fcdb3586
files src/screen.c src/testdir/test_listchars.vim src/version.c
diffstat 3 files changed, 48 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- 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
+		// 'list': change char 160 to lcs_nbsp and space to lcs_space.
+		if (wp->w_p_list)
+		{
+		    if ((c == 160
 			      || (mb_utf8 && (mb_c == 160 || mb_c == 0x202f)))
-				&& lcs_nbsp)
-			|| (c == ' ' && lcs_space && ptr - line <= trailcol)))
-		{
-		    c = (c == ' ') ? lcs_space : lcs_nbsp;
-		    if (area_attr == 0 && search_attr == 0)
+			    && 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 == ' ')
--- 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
--- 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,