]> granicus.if.org Git - vim/commitdiff
patch 8.1.1078: when 'listchars' is set a composing char on a space is wrong v8.1.1078
authorBram Moolenaar <Bram@vim.org>
Sat, 30 Mar 2019 14:34:47 +0000 (15:34 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 30 Mar 2019 14:34:47 +0000 (15:34 +0100)
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)

src/screen.c
src/testdir/test_listchars.vim
src/version.c

index 7706b6c586744addd28299464dbeb5d14a91cb7a..c3cc8cdfa2c309b950e3ddfbac9cd7a65d154519 100644 (file)
@@ -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 == ' ')
index 2870f2d4ef0aa2305856ffceb85d512929e1b5d0..1e90856a216cbe4e90678e761c321e97170fa4a7 100644 (file)
@@ -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
index e84b5db8d590b8f7a7b86f8bbf27102b7107fa08..6bca45d57e608d5094c8d19ec6743c73f105d17c 100644 (file)
@@ -775,6 +775,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1078,
 /**/
     1077,
 /**/