changeset 7344:68f2cac6b0db v7.4.977

commit https://github.com/vim/vim/commit/9bc01ebb957d2b30d57bd30d7aee6f1df2a336b0 Author: Bram Moolenaar <Bram@vim.org> Date: Thu Dec 17 21:14:58 2015 +0100 patch 7.4.977 Problem: 'linebreak' does not work properly when using "space" in 'listchars'. Solution: (Hirohito Higashi, Christian Brabandt)
author Christian Brabandt <cb@256bit.org>
date Thu, 17 Dec 2015 21:15:05 +0100
parents 15ed2b29c224
children e88aee1842ba
files src/screen.c src/testdir/test_listlbr.in src/testdir/test_listlbr.ok src/version.c
diffstat 4 files changed, 74 insertions(+), 37 deletions(-) [+]
line wrap: on
line diff
--- a/src/screen.c
+++ b/src/screen.c
@@ -3345,14 +3345,18 @@ win_line(wp, lnum, startrow, endrow, noc
     }
 #endif
 
-    /* find start of trailing whitespace */
-    if (wp->w_p_list && lcs_trail)
-    {
-	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 (wp->w_p_list)
+    {
+	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, noc
 #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, noc
 		}
 #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;
--- a/src/testdir/test_listlbr.in
+++ b/src/testdir/test_listlbr.in
@@ -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:
 0jf 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: 40afoobar aTARGET at end
 :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-11110f-lv3lc2222bgj.
+:"
 :let g:test ="Test 9: using redo after block visual mode"
 :$put =g:test
 Go
 aaa
 aaa
 a2k2j~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}pqrs2k0f{c%
+:"
 :let g:test ="Test 11: using block replace mode after wrapping"
 :$put =g:test
 :set linebreak wrap
 Go150aayypk147|jr0
+:"
+: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
--- a/src/testdir/test_listlbr.ok
+++ b/src/testdir/test_listlbr.ok
@@ -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-$         
+~                   
--- a/src/version.c
+++ b/src/version.c
@@ -742,6 +742,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    977,
+/**/
     976,
 /**/
     975,