diff options
author | Bram Moolenaar <Bram@vim.org> | 2017-03-29 14:40:47 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2017-03-29 14:40:47 +0200 |
commit | c6cd8409c2993b1476e123fba11cb4b8d743b896 (patch) | |
tree | 8468d7164d26f4120f70d32710e7160e832c3565 /src | |
parent | b6fa30ccc39cdb7f1d07b99fe2f4c6b61671dac2 (diff) | |
download | vim-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)
Diffstat (limited to 'src')
-rw-r--r-- | src/screen.c | 5 | ||||
-rw-r--r-- | src/testdir/test_display.vim | 56 | ||||
-rw-r--r-- | src/version.c | 2 |
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, |