mirror of
https://github.com/vim/vim.git
synced 2025-09-25 03:54:15 -04:00
patch 8.0.0518: bad fold text when a multi-byte char has a zero byte
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)
This commit is contained in:
@@ -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)
|
||||
|
@@ -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
|
||||
|
@@ -764,6 +764,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
518,
|
||||
/**/
|
||||
517,
|
||||
/**/
|
||||
|
Reference in New Issue
Block a user