1" Test for syntax and syntax iskeyword option 2 3source check.vim 4CheckFeature syntax 5 6source view_util.vim 7source screendump.vim 8 9func GetSyntaxItem(pat) 10 let c = '' 11 let a = ['a', getreg('a'), getregtype('a')] 12 0 13 redraw! 14 call search(a:pat, 'W') 15 let synid = synID(line('.'), col('.'), 1) 16 while synid == synID(line('.'), col('.'), 1) 17 norm! v"ay 18 " stop at whitespace 19 if @a =~# '\s' 20 break 21 endif 22 let c .= @a 23 norm! l 24 endw 25 call call('setreg', a) 26 0 27 return c 28endfunc 29 30func Test_syn_iskeyword() 31 new 32 call setline(1, [ 33 \ 'CREATE TABLE FOOBAR(', 34 \ ' DLTD_BY VARCHAR2(100)', 35 \ ');', 36 \ '']) 37 38 syntax on 39 set ft=sql 40 syn match SYN /C\k\+\>/ 41 hi link SYN ErrorMsg 42 call assert_equal('DLTD_BY', GetSyntaxItem('DLTD')) 43 /\<D\k\+\>/:norm! ygn 44 call assert_equal('DLTD_BY', @0) 45 redir @c 46 syn iskeyword 47 redir END 48 call assert_equal("\nsyntax iskeyword not set", @c) 49 50 syn iskeyword @,48-57,_,192-255 51 redir @c 52 syn iskeyword 53 redir END 54 call assert_equal("\nsyntax iskeyword @,48-57,_,192-255", @c) 55 56 setlocal isk-=_ 57 call assert_equal('DLTD_BY', GetSyntaxItem('DLTD')) 58 /\<D\k\+\>/:norm! ygn 59 let b2 = @0 60 call assert_equal('DLTD', @0) 61 62 syn iskeyword clear 63 redir @c 64 syn iskeyword 65 redir END 66 call assert_equal("\nsyntax iskeyword not set", @c) 67 68 quit! 69endfunc 70 71func Test_syntax_after_reload() 72 split Xsomefile 73 call setline(1, ['hello', 'there']) 74 w! 75 only! 76 setl filetype=hello 77 au FileType hello let g:gotit = 1 78 call assert_false(exists('g:gotit')) 79 edit other 80 buf Xsomefile 81 call assert_equal('hello', &filetype) 82 call assert_true(exists('g:gotit')) 83 call delete('Xsomefile') 84endfunc 85 86func Test_syntime() 87 if !has('profile') 88 return 89 endif 90 91 syntax on 92 syntime on 93 let a = execute('syntime report') 94 call assert_equal("\nNo Syntax items defined for this buffer", a) 95 96 view ../memfile_test.c 97 setfiletype cpp 98 redraw 99 let a = execute('syntime report') 100 call assert_match('^ TOTAL *COUNT *MATCH *SLOWEST *AVERAGE *NAME *PATTERN', a) 101 call assert_match(' \d*\.\d* \+[^0]\d* .* cppRawString ', a) 102 call assert_match(' \d*\.\d* \+[^0]\d* .* cppNumber ', a) 103 104 syntime off 105 syntime clear 106 let a = execute('syntime report') 107 call assert_match('^ TOTAL *COUNT *MATCH *SLOWEST *AVERAGE *NAME *PATTERN', a) 108 call assert_notmatch('.* cppRawString *', a) 109 call assert_notmatch('.* cppNumber*', a) 110 call assert_notmatch('[1-9]', a) 111 112 call assert_fails('syntime abc', 'E475') 113 114 syntax clear 115 let a = execute('syntime report') 116 call assert_equal("\nNo Syntax items defined for this buffer", a) 117 118 bd 119endfunc 120 121func Test_syntime_completion() 122 if !has('profile') 123 return 124 endif 125 126 call feedkeys(":syntime \<C-A>\<C-B>\"\<CR>", 'tx') 127 call assert_equal('"syntime clear off on report', @:) 128endfunc 129 130func Test_syntax_list() 131 syntax on 132 let a = execute('syntax list') 133 call assert_equal("\nNo Syntax items defined for this buffer", a) 134 135 view ../memfile_test.c 136 setfiletype c 137 138 let a = execute('syntax list') 139 call assert_match('cInclude*', a) 140 call assert_match('cDefine', a) 141 142 let a = execute('syntax list cDefine') 143 call assert_notmatch('cInclude*', a) 144 call assert_match('cDefine', a) 145 call assert_match(' links to Macro$', a) 146 147 call assert_fails('syntax list ABCD', 'E28:') 148 call assert_fails('syntax list @ABCD', 'E392:') 149 150 syntax clear 151 let a = execute('syntax list') 152 call assert_equal("\nNo Syntax items defined for this buffer", a) 153 154 bd 155endfunc 156 157func Test_syntax_completion() 158 call feedkeys(":syn \<C-A>\<C-B>\"\<CR>", 'tx') 159 call assert_equal('"syn case clear cluster conceal enable include iskeyword keyword list manual match off on region reset spell sync', @:) 160 161 call feedkeys(":syn case \<C-A>\<C-B>\"\<CR>", 'tx') 162 call assert_equal('"syn case ignore match', @:) 163 164 call feedkeys(":syn spell \<C-A>\<C-B>\"\<CR>", 'tx') 165 call assert_equal('"syn spell default notoplevel toplevel', @:) 166 167 call feedkeys(":syn sync \<C-A>\<C-B>\"\<CR>", 'tx') 168 call assert_equal('"syn sync ccomment clear fromstart linebreaks= linecont lines= match maxlines= minlines= region', @:) 169 170 " Check that clearing "Aap" avoids it showing up before Boolean. 171 hi Aap ctermfg=blue 172 call feedkeys(":syn list \<C-A>\<C-B>\"\<CR>", 'tx') 173 call assert_match('^"syn list Aap Boolean Character ', @:) 174 hi clear Aap 175 176 call feedkeys(":syn list \<C-A>\<C-B>\"\<CR>", 'tx') 177 call assert_match('^"syn list Boolean Character ', @:) 178 179 call feedkeys(":syn match \<C-A>\<C-B>\"\<CR>", 'tx') 180 call assert_match('^"syn match Boolean Character ', @:) 181endfunc 182 183func Test_echohl_completion() 184 call feedkeys(":echohl no\<C-A>\<C-B>\"\<CR>", 'tx') 185 call assert_equal('"echohl NonText Normal none', @:) 186endfunc 187 188func Test_syntax_arg_skipped() 189 syn clear 190 syntax case ignore 191 if 0 192 syntax case match 193 endif 194 call assert_match('case ignore', execute('syntax case')) 195 196 syn keyword Foo foo 197 call assert_match('Foo', execute('syntax')) 198 syn clear 199 call assert_match('case match', execute('syntax case')) 200 call assert_notmatch('Foo', execute('syntax')) 201 202 if has('conceal') 203 syn clear 204 syntax conceal on 205 if 0 206 syntax conceal off 207 endif 208 call assert_match('conceal on', execute('syntax conceal')) 209 syn clear 210 call assert_match('conceal off', execute('syntax conceal')) 211 212 syntax conceal on 213 syntax conceal off 214 call assert_match('conceal off', execute('syntax conceal')) 215 endif 216 217 syntax region Bar start=/</ end=/>/ 218 if 0 219 syntax region NotTest start=/</ end=/>/ contains=@Spell 220 endif 221 call assert_match('Bar', execute('syntax')) 222 call assert_notmatch('NotTest', execute('syntax')) 223 call assert_notmatch('Spell', execute('syntax')) 224 225 hi Foo ctermfg=blue 226 let a = execute('hi Foo') 227 if 0 228 syntax rest 229 endif 230 call assert_equal(a, execute('hi Foo')) 231 hi clear Bar 232 hi clear Foo 233 234 set ft=tags 235 syn off 236 if 0 237 syntax enable 238 endif 239 call assert_match('No Syntax items defined', execute('syntax')) 240 syntax enable 241 call assert_match('tagComment', execute('syntax')) 242 set ft= 243 244 syn clear 245 if 0 246 syntax include @Spell nothing 247 endif 248 call assert_notmatch('Spell', execute('syntax')) 249 250 syn clear 251 syn iskeyword 48-57,$,_ 252 call assert_match('48-57,$,_', execute('syntax iskeyword')) 253 if 0 254 syn clear 255 syn iskeyword clear 256 endif 257 call assert_match('48-57,$,_', execute('syntax iskeyword')) 258 syn iskeyword clear 259 call assert_match('not set', execute('syntax iskeyword')) 260 syn iskeyword 48-57,$,_ 261 syn clear 262 call assert_match('not set', execute('syntax iskeyword')) 263 264 syn clear 265 syn keyword Foo foo 266 if 0 267 syn keyword NotAdded bar 268 endif 269 call assert_match('Foo', execute('syntax')) 270 call assert_notmatch('NotAdded', execute('highlight')) 271 272 syn clear 273 syn keyword Foo foo 274 call assert_match('Foo', execute('syntax')) 275 call assert_match('Foo', execute('syntax list')) 276 call assert_notmatch('Foo', execute('if 0 | syntax | endif')) 277 call assert_notmatch('Foo', execute('if 0 | syntax list | endif')) 278 279 syn clear 280 syn match Fopi /asdf/ 281 if 0 282 syn match Fopx /asdf/ 283 endif 284 call assert_match('Fopi', execute('syntax')) 285 call assert_notmatch('Fopx', execute('syntax')) 286 287 syn clear 288 syn spell toplevel 289 call assert_match('spell toplevel', execute('syntax spell')) 290 if 0 291 syn spell notoplevel 292 endif 293 call assert_match('spell toplevel', execute('syntax spell')) 294 syn spell notoplevel 295 call assert_match('spell notoplevel', execute('syntax spell')) 296 syn spell default 297 call assert_match('spell default', execute('syntax spell')) 298 299 syn clear 300 if 0 301 syntax cluster Spell 302 endif 303 call assert_notmatch('Spell', execute('syntax')) 304 305 syn clear 306 syn keyword Foo foo 307 syn sync ccomment 308 syn sync maxlines=5 309 if 0 310 syn sync maxlines=11 311 endif 312 call assert_match('on C-style comments', execute('syntax sync')) 313 call assert_match('maximal 5 lines', execute('syntax sync')) 314 syn sync clear 315 if 0 316 syn sync ccomment 317 endif 318 call assert_notmatch('on C-style comments', execute('syntax sync')) 319 320 syn clear 321endfunc 322 323" Check for an error. Used when multiple errors are thrown and we are checking 324" for an earliest error. 325func AssertFails(cmd, errcode) 326 let save_exception = '' 327 try 328 exe a:cmd 329 catch 330 let save_exception = v:exception 331 endtry 332 call assert_match(a:errcode, save_exception) 333endfunc 334 335func Test_syntax_invalid_arg() 336 call assert_fails('syntax case asdf', 'E390:') 337 if has('conceal') 338 call assert_fails('syntax conceal asdf', 'E390:') 339 endif 340 call assert_fails('syntax spell asdf', 'E390:') 341 call assert_fails('syntax clear @ABCD', 'E391:') 342 call assert_fails('syntax include random_file', 'E484:') 343 call assert_fails('syntax include <afile>', 'E495:') 344 call assert_fails('syntax sync x', 'E404:') 345 call assert_fails('syntax keyword Abc a[', 'E789:') 346 call assert_fails('syntax keyword Abc a[bc]d', 'E890:') 347 call assert_fails('syntax cluster Abc add=A add=', 'E475:') 348 349 " Test for too many \z\( and unmatched \z\( 350 " Not able to use assert_fails() here because both E50:/E879: and E475: 351 " messages are emitted. 352 set regexpengine=1 353 call AssertFails("syntax region MyRegion start='\\z\\(' end='\\*/'", 'E52:') 354 355 let cmd = "syntax region MyRegion start='" 356 let cmd ..= repeat("\\z\\(.\\)", 10) .. "' end='\*/'" 357 call AssertFails(cmd, 'E50:') 358 359 set regexpengine=2 360 call AssertFails("syntax region MyRegion start='\\z\\(' end='\\*/'", 'E54:') 361 362 let cmd = "syntax region MyRegion start='" 363 let cmd ..= repeat("\\z\\(.\\)", 10) .. "' end='\*/'" 364 call AssertFails(cmd, 'E879:') 365 set regexpengine& 366 367 call AssertFails('syntax keyword cMyItem grouphere G1', 'E393:') 368 call AssertFails('syntax sync match Abc grouphere MyItem "abc"', 'E394:') 369 call AssertFails('syn keyword Type contains int', 'E395:') 370 call assert_fails('syntax include @Xxx', 'E397:') 371 call AssertFails('syntax region X start', 'E398:') 372 call assert_fails('syntax region X start="{"', 'E399:') 373 call AssertFails('syntax cluster contains=Abc', 'E400:') 374 call AssertFails("syntax match Character /'.'", 'E401:') 375 call AssertFails("syntax match Character /'.'/a", 'E402:') 376 call assert_fails('syntax sync linecont /pat', 'E404:') 377 call assert_fails('syntax sync linecont', 'E404:') 378 call assert_fails('syntax sync linecont /pat1/ linecont /pat2/', 'E403:') 379 call assert_fails('syntax sync minlines=a', 'E404:') 380 call AssertFails('syntax match ABC /x/ contains=', 'E406:') 381 call AssertFails("syntax match Character contains /'.'/", 'E405:') 382 call AssertFails('syntax match ccFoo "Foo" nextgroup=ALLBUT,F', 'E407:') 383 call AssertFails('syntax region Block start="{" contains=F,ALLBUT', 'E408:') 384 call AssertFails("syntax match Characters contains=a.*x /'.'/", 'E409:') 385endfunc 386 387func Test_syn_sync() 388 syntax region HereGroup start=/this/ end=/that/ 389 syntax sync match SyncHere grouphere HereGroup "pattern" 390 call assert_match('SyncHere', execute('syntax sync')) 391 syn sync clear 392 call assert_notmatch('SyncHere', execute('syntax sync')) 393 syn clear 394endfunc 395 396func Test_syn_clear() 397 syntax keyword Foo foo 398 syntax keyword Bar tar 399 call assert_match('Foo', execute('syntax')) 400 call assert_match('Bar', execute('syntax')) 401 call assert_equal('Foo', synIDattr(hlID("Foo"), "name")) 402 syn clear Foo 403 call assert_notmatch('Foo', execute('syntax')) 404 call assert_match('Bar', execute('syntax')) 405 call assert_equal('Foo', synIDattr(hlID("Foo"), "name")) 406 syn clear Foo Bar 407 call assert_notmatch('Foo', execute('syntax')) 408 call assert_notmatch('Bar', execute('syntax')) 409 hi clear Foo 410 call assert_equal('Foo', synIDattr(hlID("Foo"), "name")) 411 hi clear Bar 412 call assert_fails('syntax clear invalid_syngroup', 'E28:') 413endfunc 414 415func Test_invalid_name() 416 syn clear 417 syn keyword Nop yes 418 call assert_fails("syntax keyword Wr\x17ong bar", 'E669:') 419 syntax keyword @Wrong bar 420 call assert_match('W18:', execute('1messages')) 421 syn clear 422 hi clear Nop 423 hi clear @Wrong 424endfunc 425 426func Test_ownsyntax() 427 new Xfoo 428 call setline(1, '#define FOO') 429 syntax on 430 set filetype=c 431 ownsyntax perl 432 call assert_equal('perlComment', synIDattr(synID(line('.'), col('.'), 1), 'name')) 433 call assert_equal('c', b:current_syntax) 434 call assert_equal('perl', w:current_syntax) 435 436 " A new split window should have the original syntax. 437 split 438 call assert_equal('cDefine', synIDattr(synID(line('.'), col('.'), 1), 'name')) 439 call assert_equal('c', b:current_syntax) 440 call assert_equal(0, exists('w:current_syntax')) 441 442 wincmd x 443 call assert_equal('perlComment', synIDattr(synID(line("."), col("."), 1), "name")) 444 445 syntax off 446 set filetype& 447 %bw! 448endfunc 449 450func Test_ownsyntax_completion() 451 call feedkeys(":ownsyntax java\<C-A>\<C-B>\"\<CR>", 'tx') 452 call assert_equal('"ownsyntax java javacc javascript javascriptreact', @:) 453endfunc 454 455func Test_highlight_invalid_arg() 456 if has('gui_running') 457 call assert_fails('hi XXX guifg=xxx', 'E254:') 458 endif 459 call assert_fails('hi DoesNotExist', 'E411:') 460 call assert_fails('hi link', 'E412:') 461 call assert_fails('hi link a', 'E412:') 462 call assert_fails('hi link a b c', 'E413:') 463 call assert_fails('hi XXX =', 'E415:') 464 call assert_fails('hi XXX cterm', 'E416:') 465 call assert_fails('hi XXX cterm=', 'E417:') 466 call assert_fails('hi XXX cterm=DoesNotExist', 'E418:') 467 call assert_fails('hi XXX ctermfg=DoesNotExist', 'E421:') 468 call assert_fails('hi XXX xxx=White', 'E423:') 469endfunc 470 471func Test_bg_detection() 472 CheckNotGui 473 474 " auto-detection of &bg, make sure sure it isn't set anywhere before 475 " this test 476 hi Normal ctermbg=0 477 call assert_equal('dark', &bg) 478 hi Normal ctermbg=4 479 call assert_equal('dark', &bg) 480 hi Normal ctermbg=12 481 call assert_equal('light', &bg) 482 hi Normal ctermbg=15 483 call assert_equal('light', &bg) 484 485 " manually-set &bg takes precedence over auto-detection 486 set bg=light 487 hi Normal ctermbg=4 488 call assert_equal('light', &bg) 489 set bg=dark 490 hi Normal ctermbg=12 491 call assert_equal('dark', &bg) 492 493 hi Normal ctermbg=NONE 494endfunc 495 496func Test_syntax_hangs() 497 if !has('reltime') || !has('float') || !has('syntax') 498 return 499 endif 500 501 " This pattern takes a long time to match, it should timeout. 502 new 503 call setline(1, ['aaa', repeat('abc ', 1000), 'ccc']) 504 let start = reltime() 505 set nolazyredraw redrawtime=101 506 syn match Error /\%#=1a*.*X\@<=b*/ 507 redraw 508 let elapsed = reltimefloat(reltime(start)) 509 call assert_true(elapsed > 0.1) 510 call assert_true(elapsed < 1.0) 511 512 " second time syntax HL is disabled 513 let start = reltime() 514 redraw 515 let elapsed = reltimefloat(reltime(start)) 516 call assert_true(elapsed < 0.1) 517 518 " after CTRL-L the timeout flag is reset 519 let start = reltime() 520 exe "normal \<C-L>" 521 redraw 522 let elapsed = reltimefloat(reltime(start)) 523 call assert_true(elapsed > 0.1) 524 call assert_true(elapsed < 1.0) 525 526 set redrawtime& 527 bwipe! 528endfunc 529 530func Test_conceal() 531 if !has('conceal') 532 return 533 endif 534 535 new 536 call setline(1, ['', '123456']) 537 syn match test23 "23" conceal cchar=X 538 syn match test45 "45" conceal 539 540 set conceallevel=0 541 call assert_equal('123456 ', ScreenLines(2, 7)[0]) 542 call assert_equal([[0, '', 0], [0, '', 0], [0, '', 0], [0, '', 0], [0, '', 0], [0, '', 0]], map(range(1, 6), 'synconcealed(2, v:val)')) 543 544 set conceallevel=1 545 call assert_equal('1X 6 ', ScreenLines(2, 7)[0]) 546 call assert_equal([[0, '', 0], [1, 'X', 1], [1, 'X', 1], [1, ' ', 2], [1, ' ', 2], [0, '', 0]], map(range(1, 6), 'synconcealed(2, v:val)')) 547 548 set conceallevel=1 549 set listchars=conceal:Y 550 call assert_equal([[0, '', 0], [1, 'X', 1], [1, 'X', 1], [1, 'Y', 2], [1, 'Y', 2], [0, '', 0]], map(range(1, 6), 'synconcealed(2, v:val)')) 551 call assert_equal('1XY6 ', ScreenLines(2, 7)[0]) 552 553 set conceallevel=2 554 call assert_match('1X6 ', ScreenLines(2, 7)[0]) 555 call assert_equal([[0, '', 0], [1, 'X', 1], [1, 'X', 1], [1, '', 2], [1, '', 2], [0, '', 0]], map(range(1, 6), 'synconcealed(2, v:val)')) 556 557 set conceallevel=3 558 call assert_match('16 ', ScreenLines(2, 7)[0]) 559 call assert_equal([[0, '', 0], [1, '', 1], [1, '', 1], [1, '', 2], [1, '', 2], [0, '', 0]], map(range(1, 6), 'synconcealed(2, v:val)')) 560 561 call AssertFails("syntax match Entity '&' conceal cchar=\<Tab>", 'E844:') 562 563 syn clear 564 set conceallevel& 565 bw! 566endfunc 567 568func Test_synstack_synIDtrans() 569 new 570 setfiletype c 571 syntax on 572 call setline(1, ' /* A comment with a TODO */') 573 574 call assert_equal([], synstack(1, 1)) 575 576 norm f/ 577 eval synstack(line("."), col("."))->map('synIDattr(v:val, "name")')->assert_equal(['cComment', 'cCommentStart']) 578 eval synstack(line("."), col("."))->map('synIDattr(synIDtrans(v:val), "name")')->assert_equal(['Comment', 'Comment']) 579 580 norm fA 581 call assert_equal(['cComment'], map(synstack(line("."), col(".")), 'synIDattr(v:val, "name")')) 582 call assert_equal(['Comment'], map(synstack(line("."), col(".")), 'synIDattr(synIDtrans(v:val), "name")')) 583 584 norm fT 585 call assert_equal(['cComment', 'cTodo'], map(synstack(line("."), col(".")), 'synIDattr(v:val, "name")')) 586 call assert_equal(['Comment', 'Todo'], map(synstack(line("."), col(".")), 'synIDattr(synIDtrans(v:val), "name")')) 587 588 call assert_fails("let n=synIDtrans([])", 'E745:') 589 590 syn clear 591 bw! 592endfunc 593 594" Check highlighting for a small piece of C code with a screen dump. 595func Test_syntax_c() 596 if !CanRunVimInTerminal() 597 throw 'Skipped: cannot make screendumps' 598 endif 599 call writefile([ 600 \ '/* comment line at the top */', 601 \ 'int main(int argc, char **argv) { // another comment', 602 \ '#if 0', 603 \ ' int not_used;', 604 \ '#else', 605 \ ' int used;', 606 \ '#endif', 607 \ ' printf("Just an example piece of C code\n");', 608 \ ' return 0x0ff;', 609 \ '}', 610 \ "\t\t ", 611 \ ' static void', 612 \ 'myFunction(const double count, struct nothing, long there) {', 613 \ "\t// 123: nothing to endif here", 614 \ "\tfor (int i = 0; i < count; ++i) {", 615 \ "\t break;", 616 \ "\t}", 617 \ "\tNote: asdf", 618 \ '}', 619 \ ], 'Xtest.c') 620 621 " This makes the default for 'background' use "dark", check that the 622 " response to t_RB corrects it to "light". 623 let $COLORFGBG = '15;0' 624 625 let buf = RunVimInTerminal('Xtest.c', {}) 626 call term_sendkeys(buf, ":syn keyword Search Note\r") 627 call term_sendkeys(buf, ":syn match Error /^\\s\\+$/\r") 628 call term_sendkeys(buf, ":set hlsearch\r") 629 call term_sendkeys(buf, "/endif\r") 630 call term_sendkeys(buf, "vjfC") 631 call VerifyScreenDump(buf, 'Test_syntax_c_01', {}) 632 633 call term_sendkeys(buf, "\<Esc>") 634 call StopVimInTerminal(buf) 635 636 let $COLORFGBG = '' 637 call delete('Xtest.c') 638endfun 639 640" Using \z() in a region with NFA failing should not crash. 641func Test_syn_wrong_z_one() 642 new 643 call setline(1, ['just some text', 'with foo and bar to match with']) 644 syn region FooBar start="foo\z(.*\)bar" end="\z1" 645 call test_override("nfa_fail", 1) 646 redraw! 647 redraw! 648 call test_override("ALL", 0) 649 bwipe! 650endfunc 651 652func Test_syntax_after_bufdo() 653 call writefile(['/* aaa comment */'], 'Xaaa.c') 654 call writefile(['/* bbb comment */'], 'Xbbb.c') 655 call writefile(['/* ccc comment */'], 'Xccc.c') 656 call writefile(['/* ddd comment */'], 'Xddd.c') 657 658 let bnr = bufnr('%') 659 new Xaaa.c 660 badd Xbbb.c 661 badd Xccc.c 662 badd Xddd.c 663 exe "bwipe " . bnr 664 let l = [] 665 bufdo call add(l, bufnr('%')) 666 call assert_equal(4, len(l)) 667 668 syntax on 669 670 " This used to only enable syntax HL in the last buffer. 671 bufdo tab split 672 tabrewind 673 for tab in range(1, 4) 674 norm fm 675 call assert_equal(['cComment'], map(synstack(line("."), col(".")), 'synIDattr(v:val, "name")')) 676 tabnext 677 endfor 678 679 bwipe! Xaaa.c 680 bwipe! Xbbb.c 681 bwipe! Xccc.c 682 bwipe! Xddd.c 683 syntax off 684 call delete('Xaaa.c') 685 call delete('Xbbb.c') 686 call delete('Xccc.c') 687 call delete('Xddd.c') 688endfunc 689 690" vim: shiftwidth=2 sts=2 expandtab 691