]> granicus.if.org Git - vim/commitdiff
patch 7.4.977 v7.4.977
authorBram Moolenaar <Bram@vim.org>
Thu, 17 Dec 2015 20:14:58 +0000 (21:14 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 17 Dec 2015 20:14:58 +0000 (21:14 +0100)
Problem:    'linebreak' does not work properly when using "space" in
            'listchars'.
Solution:   (Hirohito Higashi, Christian Brabandt)

src/screen.c
src/testdir/test_listlbr.in
src/testdir/test_listlbr.ok
src/version.c

index 581638157c6a01f6f4317b35f2979752e33e8c3f..5610d8a9637b5737e40a3fc196c1f58b28d16d57 100644 (file)
@@ -3345,14 +3345,18 @@ win_line(wp, lnum, startrow, endrow, nochange)
     }
 #endif
 
-    /* find start of trailing whitespace */
-    if (wp->w_p_list && lcs_trail)
+    if (wp->w_p_list)
     {
-       trailcol = (colnr_T)STRLEN(ptr);
-       while (trailcol > (colnr_T)0 && vim_iswhite(ptr[trailcol - 1]))
-           --trailcol;
-       trailcol += (colnr_T) (ptr - line);
-       extra_check = TRUE;
+       if (lcs_space || lcs_trail)
+           extra_check = TRUE;
+       /* find start of trailing whitespace */
+       if (lcs_trail)
+       {
+           trailcol = (colnr_T)STRLEN(ptr);
+           while (trailcol > (colnr_T)0 && vim_iswhite(ptr[trailcol - 1]))
+               --trailcol;
+           trailcol += (colnr_T) (ptr - line);
+       }
     }
 
     /*
@@ -4354,35 +4358,6 @@ win_line(wp, lnum, startrow, endrow, nochange)
 #endif
            ++ptr;
 
-           /* 'list': change char 160 to lcs_nbsp and space to lcs_space. */
-           if (wp->w_p_list
-                   && (((c == 160
-#ifdef FEAT_MBYTE
-                         || (mb_utf8 && (mb_c == 160 || mb_c == 0x202f))
-#endif
-                        ) && lcs_nbsp)
-                       || (c == ' ' && lcs_space && ptr - line <= trailcol)))
-           {
-               c = (c == ' ') ? lcs_space : lcs_nbsp;
-               if (area_attr == 0 && search_attr == 0)
-               {
-                   n_attr = 1;
-                   extra_attr = hl_attr(HLF_8);
-                   saved_attr2 = char_attr; /* save current attr */
-               }
-#ifdef FEAT_MBYTE
-               mb_c = c;
-               if (enc_utf8 && (*mb_char2len)(c) > 1)
-               {
-                   mb_utf8 = TRUE;
-                   u8cc[0] = 0;
-                   c = 0xc0;
-               }
-               else
-                   mb_utf8 = FALSE;
-#endif
-           }
-
            if (extra_check)
            {
 #ifdef FEAT_SPELL
@@ -4567,6 +4542,36 @@ win_line(wp, lnum, startrow, endrow, nochange)
                }
 #endif
 
+               /* 'list': change char 160 to lcs_nbsp and space to lcs_space.
+                */
+               if (wp->w_p_list
+                       && (((c == 160
+#ifdef FEAT_MBYTE
+                             || (mb_utf8 && (mb_c == 160 || mb_c == 0x202f))
+#endif
+                            ) && lcs_nbsp)
+                       || (c == ' ' && lcs_space && ptr - line <= trailcol)))
+               {
+                   c = (c == ' ') ? lcs_space : lcs_nbsp;
+                   if (area_attr == 0 && search_attr == 0)
+                   {
+                       n_attr = 1;
+                       extra_attr = hl_attr(HLF_8);
+                       saved_attr2 = char_attr; /* save current attr */
+                   }
+#ifdef FEAT_MBYTE
+                   mb_c = c;
+                   if (enc_utf8 && (*mb_char2len)(c) > 1)
+                   {
+                       mb_utf8 = TRUE;
+                       u8cc[0] = 0;
+                       c = 0xc0;
+                   }
+                   else
+                       mb_utf8 = FALSE;
+#endif
+               }
+
                if (trailcol != MAXCOL && ptr > line + trailcol && c == ' ')
                {
                    c = lcs_trail;
index 52cbc100cb9e06c66d051acfc03cf45f91950723..d51b2f9a5d820cd75d86ef9c25e1066e7fefb60b 100644 (file)
@@ -23,20 +23,24 @@ STARTTEST
 :      $put =g:line
 :      wincmd p
 :endfu
+:"
 :let g:test="Test 1: set linebreak"
 :redraw!
 :let line=ScreenChar(winwidth(0))
 :call DoRecordScreen()
+:"
 :let g:test="Test 2: set linebreak + set list"
 :set linebreak list listchars=
 :redraw!
 :let line=ScreenChar(winwidth(0))
 :call DoRecordScreen()
+:"
 :let g:test ="Test 3: set linebreak nolist"
 :set nolist linebreak
 :redraw!
 :let line=ScreenChar(winwidth(0))
 :call DoRecordScreen()
+:"
 :let g:test ="Test 4: set linebreak with tab and 1 line as long as screen: should break!"
 :set nolist linebreak ts=8
 :let line="1\t".repeat('a', winwidth(0)-2)
@@ -50,6 +54,7 @@ STARTTEST
 :$put =line
 :$
 :norm! zt
+:"
 :let g:test ="Test 5: set linebreak with conceal and set list and tab displayed by different char (line may not be truncated)"
 :set cpo&vim list linebreak conceallevel=2 concealcursor=nv listchars=tab:ab
 :syn match ConcealVar contained /_/ conceal
@@ -57,6 +62,7 @@ STARTTEST
 :let line=ScreenChar(winwidth(0))
 :call DoRecordScreen()
 :set cpo&vim linebreak
+:"
 :let g:test ="Test 6: set linebreak with visual block mode"
 :let line="REMOVE: this not"
 :$put =g:test
@@ -66,20 +72,24 @@ STARTTEST
 :1/^REMOVE:
 0\16jf x:$put
 :set cpo&vim linebreak
+:"
 :let g:test ="Test 7: set linebreak with visual block mode and v_b_A"
 :$put =g:test
 Golong line: \e40afoobar \eaTARGET at end\e
 :exe "norm! $3B\<C-v>eAx\<Esc>"
 :set cpo&vim linebreak sbr=
+:"
 :let g:test ="Test 8: set linebreak with visual char mode and changing block"
 :$put =g:test
 Go1111-1111-1111-11-1111-1111-1111\e0f-lv3lc2222\ebgj.
+:"
 :let g:test ="Test 9: using redo after block visual mode"
 :$put =g:test
 Go
 aaa
 aaa
 a\e2k\162j~e.
+:"
 :let g:test ="Test 10: using normal commands after block-visual"
 :$put =g:test
 :set linebreak
@@ -87,10 +97,22 @@ Go
 abcd{ef
 ghijklm
 no}pqrs\e2k0f{\16\16c%\e
+:"
 :let g:test ="Test 11: using block replace mode after wrapping"
 :$put =g:test
 :set linebreak wrap
 Go\e150aa\eyypk147|\16jr0
+:"
+:let g:test ="Test 12: set linebreak list listchars=space:_,tab:>-,tail:-,eol:$"
+:set list listchars=space:_,trail:-,tab:>-,eol:$
+:$put =g:test
+:let line="a aaaaaaaaaaaaaaaaaaaaaa\ta "
+:$put =line
+:$
+:norm! zt
+:redraw!
+:let line=ScreenChar(winwidth(0))
+:call DoRecordScreen()
 :%w! test.out
 :qa!
 ENDTEST
index ff30b46ee8454c62bf0e0ff84b452a02d0b677a5..b32a54969ebe0f270fe4633db5229781801ca9c3 100644 (file)
@@ -52,3 +52,11 @@ abcdpqrs
 Test 11: using block replace mode after wrapping
 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0aaa
 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0aaa
+Test 12: set linebreak list listchars=space:_,tab:>-,tail:-,eol:$
+a aaaaaaaaaaaaaaaaaaaaaa       a 
+
+Test 12: set linebreak list listchars=space:_,tab:>-,tail:-,eol:$
+a_                  
+aaaaaaaaaaaaaaaaaaaa
+aa>-----a-$         
+~                   
index e034d450f6eccaef04e5045a43fe1f7f39abd7ff..8289826b6260432c0816c7c61446df3f664e1861 100644 (file)
@@ -741,6 +741,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    977,
 /**/
     976,
 /**/