Bram,
here are 2 patches for the linebreak feature:

1) set linebreak does not break the line, if the line contains a tab
   and the line size is only as long as the screen (counting tab as 1). 
   (although because of the tab size, the screen line will be longer 
   than the screen width, thus is should be broken).
   Example:
   vim -u NONE -N -c "put =repeat('a', winwidth(0))" -c 
   's/^.\{8}\zs./\t/' -c ':set linebreak'
   Patch:  linebreak_bug.diff

2) 'linebreak' doesn't work with list option.
   Patch: list_lbr.diff (including test for problem 1)

Best,
Christian
-- 
Was man Idee nennt: Das, was immer zur Erscheinung kommt und 
daher als Gesetz aller Erscheinungen uns entgegentritt.
                -- Goethe, Maximen und Reflektionen, Nr. 1062

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.
diff --git a/src/charset.c b/src/charset.c
--- a/src/charset.c
+++ b/src/charset.c
@@ -1078,6 +1078,7 @@ win_lbr_chartabsize(wp, line, s, col, he
     int		c;
     int		size;
     colnr_T	col2;
+    colnr_T	col_adj = 0; /* col + screen size of tab */
     colnr_T	colmax;
     int		added;
 # ifdef FEAT_MBYTE
@@ -1109,6 +1110,8 @@ win_lbr_chartabsize(wp, line, s, col, he
      */
     size = win_chartabsize(wp, s, col);
     c = *s;
+    if (tab_corr)
+	col_adj = size - 1;
 
     /*
      * If 'linebreak' set check at a blank before a non-blank if the line
@@ -1129,12 +1132,13 @@ win_lbr_chartabsize(wp, line, s, col, he
 	 */
 	numberextra = win_col_off(wp);
 	col2 = col;
-	colmax = (colnr_T)(W_WIDTH(wp) - numberextra);
+	colmax = (colnr_T)(W_WIDTH(wp) - numberextra - col_adj);
 	if (col >= colmax)
 	{
-	    n = colmax + win_col_off2(wp);
+	    colmax += col_adj;
+	    n = colmax +  win_col_off2(wp);
 	    if (n > 0)
-		colmax += (((col - colmax) / n) + 1) * n;
+		colmax += (((col - colmax) / n) + 1) * n - col_adj;
 	}
 
 	for (;;)
@@ -1151,7 +1155,7 @@ win_lbr_chartabsize(wp, line, s, col, he
 	    col2 += win_chartabsize(wp, s, col2);
 	    if (col2 >= colmax)		/* doesn't fit */
 	    {
-		size = colmax - col;
+		size = colmax - col + col_adj;
 		tab_corr = FALSE;
 		break;
 	    }
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -4613,7 +4613,7 @@ A jump table for the options with a shor
 	it only affects the way the file is displayed, not its contents.
 	If 'breakindent' is set, line is visually indented. Then, the value
 	of 'showbreak' is used to put in front of wrapped lines. This option
-	is not used when the 'wrap' option is off or 'list' is on.
+	is not used when the 'wrap' option is off.
 	Note that <Tab> characters after an <EOL> are mostly not displayed
 	with the right amount of white space.
 
diff --git a/src/charset.c b/src/charset.c
--- a/src/charset.c
+++ b/src/charset.c
@@ -1117,7 +1117,6 @@ win_lbr_chartabsize(wp, line, s, col, he
     if (wp->w_p_lbr
 	    && vim_isbreak(c)
 	    && !vim_isbreak(s[1])
-	    && !wp->w_p_list
 	    && wp->w_p_wrap
 # ifdef FEAT_VERTSPLIT
 	    && wp->w_width != 0
diff --git a/src/screen.c b/src/screen.c
--- a/src/screen.c
+++ b/src/screen.c
@@ -2841,6 +2841,7 @@ win_line(wp, lnum, startrow, endrow, noc
     char_u	extra[18];		/* "%ld" and 'fdc' must fit in here */
     int		n_extra = 0;		/* number of extra chars */
     char_u	*p_extra = NULL;	/* string of extra chars, plus NUL */
+    char_u	*p_extra_free = NULL;   /* p_extra needs to be freed */
     int		c_extra = NUL;		/* extra chars, all the same */
     int		extra_attr = 0;		/* attributes when n_extra != 0 */
     static char_u *at_end_str = (char_u *)""; /* used for p_extra when
@@ -4051,6 +4052,11 @@ win_line(wp, lnum, startrow, endrow, noc
 	}
 	else
 	{
+	    if (p_extra_free != NULL)
+	    {
+		vim_free(p_extra_free);
+		p_extra_free = NULL;
+	    }
 	    /*
 	     * Get a character from the line itself.
 	     */
@@ -4422,8 +4428,7 @@ win_line(wp, lnum, startrow, endrow, noc
 		/*
 		 * Found last space before word: check for line break.
 		 */
-		if (wp->w_p_lbr && vim_isbreak(c) && !vim_isbreak(*ptr)
-							     && !wp->w_p_list)
+		if (wp->w_p_lbr && vim_isbreak(c) && !vim_isbreak(*ptr))
 		{
 		    char_u *p = ptr - (
 # ifdef FEAT_MBYTE
@@ -4431,7 +4436,7 @@ win_line(wp, lnum, startrow, endrow, noc
 # endif
 				1);
 		    /* TODO: is passing p for start of the line OK? */
-		    n_extra = win_lbr_chartabsize(wp, p, p, (colnr_T)vcol,
+		    n_extra = win_lbr_chartabsize(wp, line, p, (colnr_T)vcol,
 								    NULL) - 1;
 		    c_extra = ' ';
 		    if (vim_iswhite(c))
@@ -4441,7 +4446,8 @@ win_line(wp, lnum, startrow, endrow, noc
 			    /* See "Tab alignment" below. */
 			    FIX_FOR_BOGUSCOLS;
 #endif
-			c = ' ';
+			if (!wp->w_p_list)
+			    c = ' ';
 		    }
 		}
 #endif
@@ -4481,9 +4487,47 @@ win_line(wp, lnum, startrow, endrow, noc
 		 */
 		if (c == TAB && (!wp->w_p_list || lcs_tab1))
 		{
+		    int tab_len = 0;
 		    /* tab amount depends on current column */
-		    n_extra = (int)wp->w_buffer->b_p_ts
+		    tab_len = (int)wp->w_buffer->b_p_ts
 					- vcol % (int)wp->w_buffer->b_p_ts - 1;
+#ifdef FEAT_LINEBREAK
+		    if (!wp->w_p_lbr)
+#endif
+		    /* tab amount depends on current column */
+			n_extra = tab_len;
+#ifdef FEAT_LINEBREAK
+		    else
+		    {
+			char_u *p;
+			int len = n_extra;
+			int i;
+			int saved_nextra = n_extra;
+			/* if n_extra > 0, it gives the number of chars, to use for a tab,
+			 * else we need to calculate the width for a tab */
+#ifdef FEAT_MBYTE
+			len = (tab_len * mb_char2len(lcs_tab2));
+			if (n_extra > 0)
+			    len += n_extra - tab_len;
+#endif
+			c = lcs_tab1;
+			p = alloc((unsigned)(len + 1));
+			vim_memset(p, ' ', len);
+			p[len] = NUL;
+			p_extra_free = p;
+			for (i = 0; i < tab_len; i++)
+			{
+#ifdef FEAT_MBYTE
+			    mb_char2bytes(lcs_tab2, p);
+			    p += mb_char2len(lcs_tab2);
+			    n_extra += mb_char2len(lcs_tab2) - (saved_nextra > 0 ? 1 : 0);
+#else
+			    p[i] = lcs_tab2;
+#endif
+			}
+			p_extra = p_extra_free;
+		    }
+#endif
 #ifdef FEAT_CONCEAL
 		    /* Tab alignment should be identical regardless of
 		     * 'conceallevel' value. So tab compensates of all
@@ -4499,8 +4543,13 @@ win_line(wp, lnum, startrow, endrow, noc
 		    if (wp->w_p_list)
 		    {
 			c = lcs_tab1;
-			c_extra = lcs_tab2;
-			n_attr = n_extra + 1;
+#ifdef FEAT_LINEBREAK
+			if (wp->w_p_lbr)
+			    c_extra = NUL; /* using p_extra from above */
+			else
+#endif
+			    c_extra = lcs_tab2;
+			n_attr = tab_len + 1;
 			extra_attr = hl_attr(HLF_8);
 			saved_attr2 = char_attr; /* save current attr */
 #ifdef FEAT_MBYTE
@@ -4596,9 +4645,24 @@ win_line(wp, lnum, startrow, endrow, noc
 		    if ((dy_flags & DY_UHEX) && wp->w_p_rl)
 			rl_mirror(p_extra);	/* reverse "<12>" */
 #endif
-		    n_extra = byte2cells(c) - 1;
 		    c_extra = NUL;
-		    c = *p_extra++;
+#ifdef FEAT_LINEBREAK
+		    if (wp->w_p_lbr)
+		    {
+			char_u *p;
+			c = *p_extra;
+			p = alloc((unsigned)n_extra + 1);
+			vim_memset(p, ' ', n_extra);
+			STRNCPY(p, p_extra + 1, STRLEN(p_extra) - 1);
+			p[n_extra] = NUL;
+			p_extra_free = p_extra = p;
+		    }
+		    else
+#endif
+		    {
+			n_extra = byte2cells(c) - 1;
+			c = *p_extra++;
+		    }
 		    if (!attr_pri)
 		    {
 			n_attr = n_extra + 1;
diff --git a/src/testdir/Make_amiga.mak b/src/testdir/Make_amiga.mak
--- a/src/testdir/Make_amiga.mak
+++ b/src/testdir/Make_amiga.mak
@@ -38,6 +38,7 @@ SCRIPTS = test1.out test3.out test4.out 
 		test104.out test105.out test106.out test107.out \
 		test_autoformat_join.out \
 		test_breakindent.out \
+		test_listlbr.out \
 		test_eval.out \
 		test_options.out
 
@@ -165,5 +166,6 @@ test106.out: test106.in
 test107.out: test107.in
 test_autoformat_join.out: test_autoformat_join.in
 test_breakindent.out: test_breakindent.in
+test_listlbr.out: test_listlbr.in
 test_eval.out: test_eval.in
 test_options.out: test_options.in
diff --git a/src/testdir/Make_dos.mak b/src/testdir/Make_dos.mak
--- a/src/testdir/Make_dos.mak
+++ b/src/testdir/Make_dos.mak
@@ -37,6 +37,7 @@ SCRIPTS =	test3.out test4.out test5.out 
 		test105.out test106.out  test107.out\
 		test_autoformat_join.out \
 		test_breakindent.out \
+		test_listlbr \
 		test_eval.out \
 		test_options.out
 
diff --git a/src/testdir/Make_ming.mak b/src/testdir/Make_ming.mak
--- a/src/testdir/Make_ming.mak
+++ b/src/testdir/Make_ming.mak
@@ -57,6 +57,7 @@ SCRIPTS =	test3.out test4.out test5.out 
 		test105.out test106.out test107.out \
 		test_autoformat_join.out \
 		test_breakindent.out \
+		test_listlbr.out \
 		test_eval.out \
 		test_options.out
 
diff --git a/src/testdir/Make_os2.mak b/src/testdir/Make_os2.mak
--- a/src/testdir/Make_os2.mak
+++ b/src/testdir/Make_os2.mak
@@ -40,6 +40,7 @@ SCRIPTS = test1.out test3.out test4.out 
 		test_autoformat_join.out \
 		test_eval.out \
 		test_breakindent.out \
+		test_listlbr.out \
 		test_options.out
 
 .SUFFIXES: .in .out
diff --git a/src/testdir/Make_vms.mms b/src/testdir/Make_vms.mms
--- a/src/testdir/Make_vms.mms
+++ b/src/testdir/Make_vms.mms
@@ -98,6 +98,7 @@ SCRIPT = test1.out  test2.out  test3.out
 	 test105.out test106.out test107.out \
 	 test_autoformat_join.out \
 	 test_breakindent.out \
+	 test_listlbr.out \
 	 test_eval.out \
 	 test_options.out
 
diff --git a/src/testdir/Makefile b/src/testdir/Makefile
--- a/src/testdir/Makefile
+++ b/src/testdir/Makefile
@@ -35,6 +35,7 @@ SCRIPTS = test1.out test2.out test3.out 
 		test104.out test105.out test106.out test107.out \
 		test_autoformat_join.out \
 		test_breakindent.out \
+		test_listlbr.out \
 		test_eval.out \
 		test_options.out
 
diff --git a/src/testdir/test_listlbr.in b/src/testdir/test_listlbr.in
new file mode 100644
--- /dev/null
+++ b/src/testdir/test_listlbr.in
@@ -0,0 +1,62 @@
+Test for linebreak and list option
+
+STARTTEST
+:so small.vim
+:if !exists("+linebreak") | e! test.ok | w! test.out | qa! | endif
+:10new|:vsp|:vert resize 20
+:put =\"\tabcdef hijklmn\tpqrstuvwxyz\u00a01060ABCDEFGHIJKLMNOP \"
+:norm! zt
+:set ts=4 sw=4 sts=4 linebreak sbr=+ wrap
+:fu! ScreenChar(width)
+:	let c=''
+:	for j in range(1,4)
+:	    for i in range(1,a:width)
+:	    	let c.=nr2char(screenchar(j, i))
+:	    endfor
+:           let c.="\n"
+:	endfor
+:	return c
+:endfu
+:fu! DoRecordScreen()
+:	wincmd l
+:	$put =printf(\"\n%s\", g:test)
+:	$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 + set list + fancy listchars"
+:exe "set linebreak list listchars=nbsp:\u2423,tab:\u2595\u2014,trail:\u02d1,eol:\ub6"
+:redraw!
+:let line=ScreenChar(winwidth(0))
+:call DoRecordScreen()
+:let g:test ="Test 4: set linebreak nolist"
+:set nolist linebreak
+:redraw!
+:let line=ScreenChar(winwidth(0))
+:call DoRecordScreen()
+:let g:test ="Test 5: set nolinebreak list"
+:set list nolinebreak
+:redraw!
+:let line=ScreenChar(winwidth(0))
+:call DoRecordScreen()
+:let g:test ="Test 6: 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)
+:$put =line
+:$
+:norm! zt
+:redraw!
+:let line=ScreenChar(winwidth(0))
+:call DoRecordScreen()
+:%w! test.out
+:qa!
+ENDTEST
+dummy text
diff --git a/src/testdir/test_listlbr.ok b/src/testdir/test_listlbr.ok
new file mode 100644
--- /dev/null
+++ b/src/testdir/test_listlbr.ok
@@ -0,0 +1,39 @@
+
+	abcdef hijklmn	pqrstuvwxyz 1060ABCDEFGHIJKLMNOP 
+
+Test 1: set linebreak
+    abcdef          
++hijklmn            
++pqrstuvwxyz 1060ABC
++DEFGHIJKLMNOP      
+
+Test 2: set linebreak + set list
+^Iabcdef hijklmn^I  
++pqrstuvwxyz 1060ABC
++DEFGHIJKLMNOP      
+                    
+
+Test 3: set linebreak + set list + fancy listchars
+▕———abcdef          
++hijklmn▕———        
++pqrstuvwxyz␣1060ABC
++DEFGHIJKLMNOPˑ¶    
+
+Test 4: set linebreak nolist
+    abcdef          
++hijklmn            
++pqrstuvwxyz 1060ABC
++DEFGHIJKLMNOP      
+
+Test 5: set nolinebreak list
+▕———abcdef hijklmn▕—
++pqrstuvwxyz␣1060ABC
++DEFGHIJKLMNOPˑ¶    
+¶                   
+1	aaaaaaaaaaaaaaaaaa
+
+Test 6: set linebreak with tab and 1 line as long as screen: should break!
+1                   
++aaaaaaaaaaaaaaaaaa 
+~                   
+~                   

Raspunde prin e-mail lui