1544d3bc9SBram Moolenaar" Test for linebreak and list option in utf-8 mode 2544d3bc9SBram Moolenaar 3544d3bc9SBram Moolenaarset encoding=utf-8 4544d3bc9SBram Moolenaarscriptencoding utf-8 5544d3bc9SBram Moolenaar 6b46fecd3SBram Moolenaarsource check.vim 7b46fecd3SBram MoolenaarCheckOption linebreak 8b46fecd3SBram MoolenaarCheckFeature conceal 9b46fecd3SBram MoolenaarCheckFeature signs 10544d3bc9SBram Moolenaar 11544d3bc9SBram Moolenaarsource view_util.vim 12544d3bc9SBram Moolenaar 131e115360SBram Moolenaarfunc s:screen_lines(lnum, width) abort 14544d3bc9SBram Moolenaar return ScreenLines(a:lnum, a:width) 151e115360SBram Moolenaarendfunc 16544d3bc9SBram Moolenaar 171e115360SBram Moolenaarfunc s:compare_lines(expect, actual) 18544d3bc9SBram Moolenaar call assert_equal(a:expect, a:actual) 191e115360SBram Moolenaarendfunc 20544d3bc9SBram Moolenaar 211e115360SBram Moolenaarfunc s:screen_attr(lnum, chars, ...) abort 22544d3bc9SBram Moolenaar let line = getline(a:lnum) 23544d3bc9SBram Moolenaar let attr = [] 24544d3bc9SBram Moolenaar let prefix = get(a:000, 0, 0) 25544d3bc9SBram Moolenaar for i in range(a:chars[0], a:chars[1]) 26544d3bc9SBram Moolenaar let scol = strdisplaywidth(strcharpart(line, 0, i-1)) + 1 27544d3bc9SBram Moolenaar let attr += [screenattr(a:lnum, scol + prefix)] 28544d3bc9SBram Moolenaar endfor 29544d3bc9SBram Moolenaar return attr 301e115360SBram Moolenaarendfunc 31544d3bc9SBram Moolenaar 321e115360SBram Moolenaarfunc s:test_windows(...) 33544d3bc9SBram Moolenaar call NewWindow(10, 20) 34544d3bc9SBram Moolenaar setl ts=4 sw=4 sts=4 linebreak sbr=+ wrap 35544d3bc9SBram Moolenaar exe get(a:000, 0, '') 361e115360SBram Moolenaarendfunc 37544d3bc9SBram Moolenaar 381e115360SBram Moolenaarfunc s:close_windows(...) 39544d3bc9SBram Moolenaar call CloseWindow() 40544d3bc9SBram Moolenaar exe get(a:000, 0, '') 411e115360SBram Moolenaarendfunc 42544d3bc9SBram Moolenaar 43544d3bc9SBram Moolenaarfunc Test_linebreak_with_fancy_listchars() 44544d3bc9SBram Moolenaar call s:test_windows("setl list listchars=nbsp:\u2423,tab:\u2595\u2014,trail:\u02d1,eol:\ub6") 45544d3bc9SBram Moolenaar call setline(1, "\tabcdef hijklmn\tpqrstuvwxyz\u00a01060ABCDEFGHIJKLMNOP ") 46544d3bc9SBram Moolenaar redraw! 47544d3bc9SBram Moolenaar let lines = s:screen_lines([1, 4], winwidth(0)) 48544d3bc9SBram Moolenaar let expect = [ 49544d3bc9SBram Moolenaar\ "▕———abcdef ", 50544d3bc9SBram Moolenaar\ "+hijklmn▕——— ", 51544d3bc9SBram Moolenaar\ "+pqrstuvwxyz␣1060ABC", 52544d3bc9SBram Moolenaar\ "+DEFGHIJKLMNOPˑ¶ ", 53544d3bc9SBram Moolenaar\ ] 54544d3bc9SBram Moolenaar call s:compare_lines(expect, lines) 55544d3bc9SBram Moolenaar call s:close_windows() 56544d3bc9SBram Moolenaarendfunc 57544d3bc9SBram Moolenaar 58544d3bc9SBram Moolenaarfunc Test_nolinebreak_with_list() 59544d3bc9SBram Moolenaar call s:test_windows("setl nolinebreak list listchars=nbsp:\u2423,tab:\u2595\u2014,trail:\u02d1,eol:\ub6") 60544d3bc9SBram Moolenaar call setline(1, "\tabcdef hijklmn\tpqrstuvwxyz\u00a01060ABCDEFGHIJKLMNOP ") 61544d3bc9SBram Moolenaar redraw! 62544d3bc9SBram Moolenaar let lines = s:screen_lines([1, 4], winwidth(0)) 63544d3bc9SBram Moolenaar let expect = [ 64544d3bc9SBram Moolenaar\ "▕———abcdef hijklmn▕—", 65544d3bc9SBram Moolenaar\ "+pqrstuvwxyz␣1060ABC", 66544d3bc9SBram Moolenaar\ "+DEFGHIJKLMNOPˑ¶ ", 67544d3bc9SBram Moolenaar\ "~ ", 68544d3bc9SBram Moolenaar\ ] 69544d3bc9SBram Moolenaar call s:compare_lines(expect, lines) 70544d3bc9SBram Moolenaar call s:close_windows() 71544d3bc9SBram Moolenaarendfunc 72544d3bc9SBram Moolenaar 73*89a54b41SBram Moolenaar" this was causing a crash 74*89a54b41SBram Moolenaarfunc Test_linebreak_with_list_and_tabs() 75*89a54b41SBram Moolenaar set linebreak list listchars=tab:⇤\ ⇥ tabstop=100 76*89a54b41SBram Moolenaar new 77*89a54b41SBram Moolenaar call setline(1, "\t\t\ttext") 78*89a54b41SBram Moolenaar redraw 79*89a54b41SBram Moolenaar bwipe! 80*89a54b41SBram Moolenaar set nolinebreak nolist listchars&vim tabstop=8 81*89a54b41SBram Moolenaarendfunc 82*89a54b41SBram Moolenaar 83544d3bc9SBram Moolenaarfunc Test_linebreak_with_nolist() 84544d3bc9SBram Moolenaar call s:test_windows('setl nolist') 85544d3bc9SBram Moolenaar call setline(1, "\t*mask = nil;") 86544d3bc9SBram Moolenaar redraw! 87544d3bc9SBram Moolenaar let lines = s:screen_lines([1, 4], winwidth(0)) 88544d3bc9SBram Moolenaar let expect = [ 89544d3bc9SBram Moolenaar\ " *mask = nil; ", 90544d3bc9SBram Moolenaar\ "~ ", 91544d3bc9SBram Moolenaar\ "~ ", 92544d3bc9SBram Moolenaar\ "~ ", 93544d3bc9SBram Moolenaar\ ] 94544d3bc9SBram Moolenaar call s:compare_lines(expect, lines) 95544d3bc9SBram Moolenaar call s:close_windows() 96544d3bc9SBram Moolenaarendfunc 97544d3bc9SBram Moolenaar 98544d3bc9SBram Moolenaarfunc Test_list_and_concealing1() 99544d3bc9SBram Moolenaar call s:test_windows('setl list listchars=tab:>- cole=1') 100544d3bc9SBram Moolenaar call setline(1, [ 101544d3bc9SBram Moolenaar\ "#define ABCDE\t\t1", 102544d3bc9SBram Moolenaar\ "#define ABCDEF\t\t1", 103544d3bc9SBram Moolenaar\ "#define ABCDEFG\t\t1", 104544d3bc9SBram Moolenaar\ "#define ABCDEFGH\t1", 105544d3bc9SBram Moolenaar\ "#define MSG_MODE_FILE\t\t\t1", 106544d3bc9SBram Moolenaar\ "#define MSG_MODE_CONSOLE\t\t2", 107544d3bc9SBram Moolenaar\ "#define MSG_MODE_FILE_AND_CONSOLE\t3", 108544d3bc9SBram Moolenaar\ "#define MSG_MODE_FILE_THEN_CONSOLE\t4", 109544d3bc9SBram Moolenaar\ ]) 110544d3bc9SBram Moolenaar vert resize 40 111544d3bc9SBram Moolenaar syn match Conceal conceal cchar=>'AB\|MSG_MODE' 112544d3bc9SBram Moolenaar redraw! 113544d3bc9SBram Moolenaar let lines = s:screen_lines([1, 7], winwidth(0)) 114544d3bc9SBram Moolenaar let expect = [ 115544d3bc9SBram Moolenaar\ "#define ABCDE>-->---1 ", 116544d3bc9SBram Moolenaar\ "#define >CDEF>-->---1 ", 117544d3bc9SBram Moolenaar\ "#define >CDEFG>->---1 ", 118544d3bc9SBram Moolenaar\ "#define >CDEFGH>----1 ", 119544d3bc9SBram Moolenaar\ "#define >_FILE>--------->--->---1 ", 120544d3bc9SBram Moolenaar\ "#define >_CONSOLE>---------->---2 ", 121544d3bc9SBram Moolenaar\ "#define >_FILE_AND_CONSOLE>---------3 ", 122544d3bc9SBram Moolenaar\ ] 123544d3bc9SBram Moolenaar call s:compare_lines(expect, lines) 124544d3bc9SBram Moolenaar call s:close_windows() 125544d3bc9SBram Moolenaarendfunc 126544d3bc9SBram Moolenaar 127544d3bc9SBram Moolenaarfunc Test_list_and_concealing2() 128544d3bc9SBram Moolenaar call s:test_windows('setl nowrap ts=2 list listchars=tab:>- cole=2 concealcursor=n') 129544d3bc9SBram Moolenaar call setline(1, "bbeeeeee\t\t;\tsome text") 130544d3bc9SBram Moolenaar vert resize 40 131544d3bc9SBram Moolenaar syn clear 132544d3bc9SBram Moolenaar syn match meaning /;\s*\zs.*/ 133544d3bc9SBram Moolenaar syn match hasword /^\x\{8}/ contains=word 134544d3bc9SBram Moolenaar syn match word /\<\x\{8}\>/ contains=beginword,endword contained 135544d3bc9SBram Moolenaar syn match beginword /\<\x\x/ contained conceal 136544d3bc9SBram Moolenaar syn match endword /\x\{6}\>/ contained 137544d3bc9SBram Moolenaar hi meaning guibg=blue 138544d3bc9SBram Moolenaar hi beginword guibg=green 139544d3bc9SBram Moolenaar hi endword guibg=red 140544d3bc9SBram Moolenaar redraw! 141544d3bc9SBram Moolenaar let lines = s:screen_lines([1, 1], winwidth(0)) 142544d3bc9SBram Moolenaar let expect = [ 143544d3bc9SBram Moolenaar\ "eeeeee>--->-;>some text ", 144544d3bc9SBram Moolenaar\ ] 145544d3bc9SBram Moolenaar call s:compare_lines(expect, lines) 146544d3bc9SBram Moolenaar call s:close_windows() 147544d3bc9SBram Moolenaarendfunc 148544d3bc9SBram Moolenaar 149544d3bc9SBram Moolenaarfunc Test_screenattr_for_comment() 150544d3bc9SBram Moolenaar call s:test_windows("setl ft=c ts=7 list listchars=nbsp:\u2423,tab:\u2595\u2014,trail:\u02d1,eol:\ub6") 151544d3bc9SBram Moolenaar call setline(1, " /*\t\t and some more */") 152544d3bc9SBram Moolenaar norm! gg0 153544d3bc9SBram Moolenaar syntax on 154544d3bc9SBram Moolenaar hi SpecialKey term=underline ctermfg=red guifg=red 155544d3bc9SBram Moolenaar redraw! 156544d3bc9SBram Moolenaar let line = getline(1) 157544d3bc9SBram Moolenaar let attr = s:screen_attr(1, [1, 6]) 158544d3bc9SBram Moolenaar call assert_notequal(attr[0], attr[1]) 159544d3bc9SBram Moolenaar call assert_notequal(attr[1], attr[3]) 160544d3bc9SBram Moolenaar call assert_notequal(attr[3], attr[5]) 161544d3bc9SBram Moolenaar call s:close_windows() 162544d3bc9SBram Moolenaarendfunc 163544d3bc9SBram Moolenaar 164544d3bc9SBram Moolenaarfunc Test_visual_block_and_selection_exclusive() 165544d3bc9SBram Moolenaar call s:test_windows('setl selection=exclusive') 166544d3bc9SBram Moolenaar call setline(1, "long line: " . repeat("foobar ", 40) . "TARGETÃ' at end") 167544d3bc9SBram Moolenaar exe "norm! $3B\<C-v>eAx\<Esc>" 168544d3bc9SBram Moolenaar let lines = s:screen_lines([1, 10], winwidth(0)) 169544d3bc9SBram Moolenaar let expect = [ 170544d3bc9SBram Moolenaar\ "+foobar foobar ", 171544d3bc9SBram Moolenaar\ "+foobar foobar ", 172544d3bc9SBram Moolenaar\ "+foobar foobar ", 173544d3bc9SBram Moolenaar\ "+foobar foobar ", 174544d3bc9SBram Moolenaar\ "+foobar foobar ", 175544d3bc9SBram Moolenaar\ "+foobar foobar ", 176544d3bc9SBram Moolenaar\ "+foobar foobar ", 177544d3bc9SBram Moolenaar\ "+foobar foobar ", 178544d3bc9SBram Moolenaar\ "+foobar foobar ", 179544d3bc9SBram Moolenaar\ "+foobar TARGETÃx' ", 180544d3bc9SBram Moolenaar\ ] 181544d3bc9SBram Moolenaar call s:compare_lines(expect, lines) 182544d3bc9SBram Moolenaar call s:close_windows() 183544d3bc9SBram Moolenaarendfunc 184544d3bc9SBram Moolenaar 185544d3bc9SBram Moolenaarfunc Test_multibyte_sign_and_colorcolumn() 186544d3bc9SBram Moolenaar call s:test_windows("setl nolinebreak cc=3 list listchars=nbsp:\u2423,tab:\u2595\u2014,trail:\u02d1,eol:\ub6") 187544d3bc9SBram Moolenaar call setline(1, ["", "a b c", "a b c"]) 188544d3bc9SBram Moolenaar exe "sign define foo text=\uff0b" 189544d3bc9SBram Moolenaar exe "sign place 1 name=foo line=2 buffer=" . bufnr('%') 190544d3bc9SBram Moolenaar redraw! 191544d3bc9SBram Moolenaar norm! ggj0 192544d3bc9SBram Moolenaar let signwidth = strdisplaywidth("\uff0b") 193544d3bc9SBram Moolenaar let attr1 = s:screen_attr(2, [1, 3], signwidth) 194544d3bc9SBram Moolenaar let attr2 = s:screen_attr(3, [1, 3], signwidth) 195544d3bc9SBram Moolenaar call assert_equal(attr1[0], attr2[0]) 196544d3bc9SBram Moolenaar call assert_equal(attr1[1], attr2[1]) 197544d3bc9SBram Moolenaar call assert_equal(attr1[2], attr2[2]) 198544d3bc9SBram Moolenaar let lines = s:screen_lines([1, 3], winwidth(0)) 199544d3bc9SBram Moolenaar let expect = [ 200544d3bc9SBram Moolenaar\ " ¶ ", 201544d3bc9SBram Moolenaar\ "+a b c¶ ", 202544d3bc9SBram Moolenaar\ " a b c¶ ", 203544d3bc9SBram Moolenaar\ ] 204544d3bc9SBram Moolenaar call s:compare_lines(expect, lines) 205544d3bc9SBram Moolenaar call s:close_windows() 206544d3bc9SBram Moolenaarendfunc 20738632fafSBram Moolenaar 208774e5a96SBram Moolenaarfunc Test_colorcolumn_priority() 209774e5a96SBram Moolenaar call s:test_windows('setl cc=4 cuc hls') 210774e5a96SBram Moolenaar call setline(1, ["xxyy", ""]) 211774e5a96SBram Moolenaar norm! gg 212774e5a96SBram Moolenaar exe "normal! /xxyy\<CR>" 213774e5a96SBram Moolenaar norm! G 214774e5a96SBram Moolenaar redraw! 215774e5a96SBram Moolenaar let line_attr = s:screen_attr(1, [1, &cc]) 216774e5a96SBram Moolenaar " Search wins over CursorColumn 217774e5a96SBram Moolenaar call assert_equal(line_attr[1], line_attr[0]) 218774e5a96SBram Moolenaar " Search wins over Colorcolumn 219774e5a96SBram Moolenaar call assert_equal(line_attr[2], line_attr[3]) 220774e5a96SBram Moolenaar call s:close_windows('setl hls&vim') 221774e5a96SBram Moolenaarendfunc 222774e5a96SBram Moolenaar 22338632fafSBram Moolenaarfunc Test_illegal_byte_and_breakat() 22438632fafSBram Moolenaar call s:test_windows("setl sbr= brk+=<") 22538632fafSBram Moolenaar vert resize 18 22638632fafSBram Moolenaar call setline(1, repeat("\x80", 6)) 22738632fafSBram Moolenaar redraw! 22838632fafSBram Moolenaar let lines = s:screen_lines([1, 2], winwidth(0)) 22938632fafSBram Moolenaar let expect = [ 23038632fafSBram Moolenaar\ "<80><80><80><80><8", 23138632fafSBram Moolenaar\ "0><80> ", 23238632fafSBram Moolenaar\ ] 23338632fafSBram Moolenaar call s:compare_lines(expect, lines) 23438632fafSBram Moolenaar call s:close_windows('setl brk&vim') 23538632fafSBram Moolenaarendfunc 23638632fafSBram Moolenaar 23738632fafSBram Moolenaarfunc Test_multibyte_wrap_and_breakat() 23838632fafSBram Moolenaar call s:test_windows("setl sbr= brk+=>") 23938632fafSBram Moolenaar call setline(1, repeat('a', 17) . repeat('あ', 2)) 24038632fafSBram Moolenaar redraw! 24138632fafSBram Moolenaar let lines = s:screen_lines([1, 2], winwidth(0)) 24238632fafSBram Moolenaar let expect = [ 24338632fafSBram Moolenaar\ "aaaaaaaaaaaaaaaaaあ>", 24438632fafSBram Moolenaar\ "あ ", 24538632fafSBram Moolenaar\ ] 24638632fafSBram Moolenaar call s:compare_lines(expect, lines) 24738632fafSBram Moolenaar call s:close_windows('setl brk&vim') 24838632fafSBram Moolenaarendfunc 249abc39ab6SBram Moolenaar 250abc39ab6SBram Moolenaarfunc Test_chinese_char_on_wrap_column() 251abc39ab6SBram Moolenaar call s:test_windows("setl nolbr wrap sbr=") 252abc39ab6SBram Moolenaar syntax off 253abc39ab6SBram Moolenaar call setline(1, [ 254abc39ab6SBram Moolenaar\ 'aaaaaaaaaaaaaaaaaaa中'. 255abc39ab6SBram Moolenaar\ 'aaaaaaaaaaaaaaaaa中'. 256abc39ab6SBram Moolenaar\ 'aaaaaaaaaaaaaaaaa中'. 257abc39ab6SBram Moolenaar\ 'aaaaaaaaaaaaaaaaa中'. 258abc39ab6SBram Moolenaar\ 'aaaaaaaaaaaaaaaaa中'. 259abc39ab6SBram Moolenaar\ 'aaaaaaaaaaaaaaaaa中'. 260abc39ab6SBram Moolenaar\ 'aaaaaaaaaaaaaaaaa中'. 261abc39ab6SBram Moolenaar\ 'aaaaaaaaaaaaaaaaa中'. 262abc39ab6SBram Moolenaar\ 'aaaaaaaaaaaaaaaaa中'. 263abc39ab6SBram Moolenaar\ 'aaaaaaaaaaaaaaaaa中'. 264abc39ab6SBram Moolenaar\ 'hello']) 265abc39ab6SBram Moolenaar call cursor(1,1) 266abc39ab6SBram Moolenaar norm! $ 267abc39ab6SBram Moolenaar redraw! 268abc39ab6SBram Moolenaar let expect=[ 269abc39ab6SBram Moolenaar\ '中aaaaaaaaaaaaaaaaa>', 270abc39ab6SBram Moolenaar\ '中aaaaaaaaaaaaaaaaa>', 271abc39ab6SBram Moolenaar\ '中aaaaaaaaaaaaaaaaa>', 272abc39ab6SBram Moolenaar\ '中aaaaaaaaaaaaaaaaa>', 273abc39ab6SBram Moolenaar\ '中aaaaaaaaaaaaaaaaa>', 274abc39ab6SBram Moolenaar\ '中aaaaaaaaaaaaaaaaa>', 275abc39ab6SBram Moolenaar\ '中aaaaaaaaaaaaaaaaa>', 276abc39ab6SBram Moolenaar\ '中aaaaaaaaaaaaaaaaa>', 277abc39ab6SBram Moolenaar\ '中aaaaaaaaaaaaaaaaa>', 278abc39ab6SBram Moolenaar\ '中hello '] 279abc39ab6SBram Moolenaar let lines = s:screen_lines([1, 10], winwidth(0)) 280abc39ab6SBram Moolenaar call s:compare_lines(expect, lines) 281abc39ab6SBram Moolenaar call s:close_windows() 2826d91bcb4SBram Moolenaarendfunc 2836d91bcb4SBram Moolenaar 2846d91bcb4SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab 285