summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-03-29 14:40:47 +0200
committerBram Moolenaar <Bram@vim.org>2017-03-29 14:40:47 +0200
commitc6cd8409c2993b1476e123fba11cb4b8d743b896 (patch)
tree8468d7164d26f4120f70d32710e7160e832c3565
parentb6fa30ccc39cdb7f1d07b99fe2f4c6b61671dac2 (diff)
downloadvim-git-c6cd8409c2993b1476e123fba11cb4b8d743b896.tar.gz
patch 8.0.0518: bad fold text when a multi-byte char has a zero bytev8.0.0518
Problem: Storing a zero byte from a multi-byte character causes fold text to show up wrong. Solution: Avoid putting zero in ScreenLines. (Christian Brabandt, closes #1567)
-rw-r--r--src/screen.c5
-rw-r--r--src/testdir/test_display.vim56
-rw-r--r--src/version.c2
3 files changed, 44 insertions, 19 deletions
diff --git a/src/screen.c b/src/screen.c
index 82c5ba57b..6a7284bb4 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -2697,12 +2697,15 @@ fold_line(
{
ScreenLinesUC[off + col] = fill_fold;
ScreenLinesC[0][off + col] = 0;
+ ScreenLines[off + col] = 0x80; /* avoid storing zero */
}
else
ScreenLinesUC[off + col] = 0;
+ col++;
}
+ else
#endif
- ScreenLines[off + col++] = fill_fold;
+ ScreenLines[off + col++] = fill_fold;
}
if (text != buf)
diff --git a/src/testdir/test_display.vim b/src/testdir/test_display.vim
index 609e16c73..4253b5693 100644
--- a/src/testdir/test_display.vim
+++ b/src/testdir/test_display.vim
@@ -3,18 +3,12 @@ if !has('gui_running') && has('unix')
set term=ansi
endif
-function! s:screenline(lnum, nr) abort
- let line = []
- for j in range(a:nr)
- for c in range(1, winwidth(0))
- call add(line, nr2char(screenchar(a:lnum+j, c)))
- endfor
- call add(line, "\n")
- endfor
- return join(line, '')
-endfunction
+source view_util.vim
-function! Test_display_foldcolumn()
+func! Test_display_foldcolumn()
+ if !has("folding")
+ return
+ endif
new
vnew
vert resize 25
@@ -23,17 +17,43 @@ function! Test_display_foldcolumn()
1put='e more noise blah blah‚ more stuff here'
- let expect = "e more noise blah blah<82\n> more stuff here \n"
+ let expect = [
+ \ "e more noise blah blah<82",
+ \ "> more stuff here "
+ \ ]
call cursor(2, 1)
norm! zt
- redraw!
- call assert_equal(expect, s:screenline(1,2))
+ let lines=ScreenLines([1,2], winwidth(0))
+ call assert_equal(expect, lines)
set fdc=2
- redraw!
- let expect = " e more noise blah blah<\n 82> more stuff here \n"
- call assert_equal(expect, s:screenline(1,2))
+ let lines=ScreenLines([1,2], winwidth(0))
+ let expect = [
+ \ " e more noise blah blah<",
+ \ " 82> more stuff here "
+ \ ]
+ call assert_equal(expect, lines)
quit!
quit!
-endfunction
+endfunc
+
+func! Test_display_foldtext_mbyte()
+ if !has("folding") || !has("multi_byte")
+ return
+ endif
+ call NewWindow(10, 40)
+ call append(0, range(1,20))
+ exe "set foldmethod=manual foldtext=foldtext() fillchars=fold:\u2500,vert:\u2502 fdc=2"
+ call cursor(2, 1)
+ norm! zf13G
+ let lines=ScreenLines([1,3], winwidth(0)+1)
+ let expect=[
+ \ " 1 \u2502",
+ \ "+ +-- 12 lines: 2". repeat("\u2500", 23). "\u2502",
+ \ " 14 \u2502",
+ \ ]
+ call assert_equal(expect, lines)
+ set foldtext& fillchars& foldmethod& fdc&
+ bw!
+endfunc
diff --git a/src/version.c b/src/version.c
index 1afe3ab9a..45d6e8f73 100644
--- 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 */
/**/
+ 518,
+/**/
517,
/**/
516,