diff src/screen.c @ 16211:5fb0f15fafea v8.1.1110

patch 8.1.1110: composing chars on space wrong when 'listchars' is set commit https://github.com/vim/vim/commit/e5e4e22c1c15c8c22b14935affe969569acc8df9 Author: Bram Moolenaar <Bram@vim.org> Date: Thu Apr 4 13:28:45 2019 +0200 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 #4197)
author Bram Moolenaar <Bram@vim.org>
date Thu, 04 Apr 2019 13:30:05 +0200
parents cd5c83115ec6
children 57e0f6b4a87d
line wrap: on
line diff
--- a/src/screen.c
+++ b/src/screen.c
@@ -4808,34 +4808,36 @@ win_line(
 		}
 #endif
 
-		// '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)
+		// 'list': Change char 160 to lcs_nbsp and space to lcs_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))))
+			     && lcs_nbsp)
+			    || (c == ' '
+				&& mb_l == 1
+				&& lcs_space
+				&& ptr - line <= trailcol)))
+		{
+		    c = (c == ' ') ? lcs_space : lcs_nbsp;
+		    if (area_attr == 0 && search_attr == 0)
 		    {
-			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;
+			n_attr = 1;
+			extra_attr = HL_ATTR(HLF_8);
+			saved_attr2 = char_attr; /* save current attr */
 		    }
-		    else if (c == ' ' && lcs_space && ptr - line <= trailcol)
+		    mb_c = c;
+		    if (enc_utf8 && utf_char2len(c) > 1)
 		    {
-			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
-			}
+			mb_utf8 = TRUE;
+			u8cc[0] = 0;
+			c = 0xc0;
 		    }
+		    else
+			mb_utf8 = FALSE;
 		}
 
 		if (trailcol != MAXCOL && ptr > line + trailcol && c == ' ')