changeset 10982:5e20c9f96cd5 v8.0.0380

patch 8.0.0380: with 'linebreak' double wide char wraps badly commit https://github.com/vim/vim/commit/38632faf635f6434441827e136bceb5a930c59ad Author: Bram Moolenaar <Bram@vim.org> Date: Sun Feb 26 19:40:59 2017 +0100 patch 8.0.0380: with 'linebreak' double wide char wraps badly Problem: With 'linebreak' set and 'breakat' includes ">" a double-wide character results in "<<" displayed. Solution: Check for the character not to be replaced. (Ozaki Kiichi, closes #1456)
author Christian Brabandt <cb@256bit.org>
date Sun, 26 Feb 2017 19:45:04 +0100
parents a03c6919dfdc
children 40f5c653f7df
files src/screen.c src/testdir/test_listlbr_utf8.vim src/version.c
diffstat 3 files changed, 35 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/screen.c
+++ b/src/screen.c
@@ -4189,6 +4189,8 @@ win_line(
 	}
 	else
 	{
+	    int c0;
+
 	    if (p_extra_free != NULL)
 	    {
 		vim_free(p_extra_free);
@@ -4197,7 +4199,7 @@ win_line(
 	    /*
 	     * Get a character from the line itself.
 	     */
-	    c = *ptr;
+	    c0 = c = *ptr;
 #ifdef FEAT_MBYTE
 	    if (has_mbyte)
 	    {
@@ -4214,7 +4216,7 @@ win_line(
 			/* Overlong encoded ASCII or ASCII with composing char
 			 * is displayed normally, except a NUL. */
 			if (mb_c < 0x80)
-			    c = mb_c;
+			    c0 = c = mb_c;
 			mb_utf8 = TRUE;
 
 			/* At start of the line we can have a composing char.
@@ -4538,7 +4540,8 @@ win_line(
 		/*
 		 * Found last space before word: check for line break.
 		 */
-		if (wp->w_p_lbr && vim_isbreak(c) && !vim_isbreak(*ptr))
+		if (wp->w_p_lbr && c0 == c
+				      && vim_isbreak(c) && !vim_isbreak(*ptr))
 		{
 # ifdef FEAT_MBYTE
 		    int mb_off = has_mbyte ? (*mb_head_off)(line, ptr - 1) : 0;
--- a/src/testdir/test_listlbr_utf8.vim
+++ b/src/testdir/test_listlbr_utf8.vim
@@ -193,3 +193,30 @@ func Test_multibyte_sign_and_colorcolumn
   call s:compare_lines(expect, lines)
   call s:close_windows()
 endfunc
+
+func Test_illegal_byte_and_breakat()
+  call s:test_windows("setl sbr= brk+=<")
+  vert resize 18
+  call setline(1, repeat("\x80", 6))
+  redraw!
+  let lines = s:screen_lines([1, 2], winwidth(0))
+  let expect = [
+\ "<80><80><80><80><8",
+\ "0><80>            ",
+\ ]
+  call s:compare_lines(expect, lines)
+  call s:close_windows('setl brk&vim')
+endfunc
+
+func Test_multibyte_wrap_and_breakat()
+  call s:test_windows("setl sbr= brk+=>")
+  call setline(1, repeat('a', 17) . repeat('あ', 2))
+  redraw!
+  let lines = s:screen_lines([1, 2], winwidth(0))
+  let expect = [
+\ "aaaaaaaaaaaaaaaaaあ>",
+\ "あ                  ",
+\ ]
+  call s:compare_lines(expect, lines)
+  call s:close_windows('setl brk&vim')
+endfunc
--- a/src/version.c
+++ b/src/version.c
@@ -765,6 +765,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    380,
+/**/
     379,
 /**/
     378,