11473551aSBram Moolenaar" Tests for autocommands 21473551aSBram Moolenaar 38c64a36eSBram Moolenaarsource shared.vim 48c5a278fSBram Moolenaarsource check.vim 5cadbe1b1SBram Moolenaarsource term_util.vim 68c64a36eSBram Moolenaar 71e115360SBram Moolenaarfunc s:cleanup_buffers() abort 8b3435b0aSBram Moolenaar for bnr in range(1, bufnr('$')) 9b3435b0aSBram Moolenaar if bufloaded(bnr) && bufnr('%') != bnr 10b3435b0aSBram Moolenaar execute 'bd! ' . bnr 11b3435b0aSBram Moolenaar endif 12b3435b0aSBram Moolenaar endfor 1304f62f88SBram Moolenaarendfunc 14b3435b0aSBram Moolenaar 151473551aSBram Moolenaarfunc Test_vim_did_enter() 161473551aSBram Moolenaar call assert_false(v:vim_did_enter) 171473551aSBram Moolenaar 181473551aSBram Moolenaar " This script will never reach the main loop, can't check if v:vim_did_enter 191473551aSBram Moolenaar " becomes one. 201473551aSBram Moolenaarendfunc 2140b1b544SBram Moolenaar 227591116aSBram Moolenaar" Test for the CursorHold autocmd 237591116aSBram Moolenaarfunc Test_CursorHold_autocmd() 247591116aSBram Moolenaar CheckRunVimInTerminal 257591116aSBram Moolenaar call writefile(['one', 'two', 'three'], 'Xfile') 267591116aSBram Moolenaar let before =<< trim END 277591116aSBram Moolenaar set updatetime=10 287591116aSBram Moolenaar au CursorHold * call writefile([line('.')], 'Xoutput', 'a') 297591116aSBram Moolenaar END 307591116aSBram Moolenaar call writefile(before, 'Xinit') 317591116aSBram Moolenaar let buf = RunVimInTerminal('-S Xinit Xfile', {}) 3217f67547SBram Moolenaar call term_sendkeys(buf, "G") 3362cd26a2SBram Moolenaar call term_wait(buf, 50) 347591116aSBram Moolenaar call term_sendkeys(buf, "gg") 357591116aSBram Moolenaar call term_wait(buf) 3617f67547SBram Moolenaar call WaitForAssert({-> assert_equal(['1'], readfile('Xoutput')[-1:-1])}) 377591116aSBram Moolenaar call term_sendkeys(buf, "j") 387591116aSBram Moolenaar call term_wait(buf) 3917f67547SBram Moolenaar call WaitForAssert({-> assert_equal(['1', '2'], readfile('Xoutput')[-2:-1])}) 407591116aSBram Moolenaar call term_sendkeys(buf, "j") 417591116aSBram Moolenaar call term_wait(buf) 4217f67547SBram Moolenaar call WaitForAssert({-> assert_equal(['1', '2', '3'], readfile('Xoutput')[-3:-1])}) 437591116aSBram Moolenaar call StopVimInTerminal(buf) 447591116aSBram Moolenaar 457591116aSBram Moolenaar call delete('Xinit') 467591116aSBram Moolenaar call delete('Xoutput') 477591116aSBram Moolenaar call delete('Xfile') 487591116aSBram Moolenaarendfunc 497591116aSBram Moolenaar 50c67e8921SBram Moolenaarif has('timers') 5197b0075bSBram Moolenaar 5240b1b544SBram Moolenaar func ExitInsertMode(id) 5340b1b544SBram Moolenaar call feedkeys("\<Esc>") 5440b1b544SBram Moolenaar endfunc 5540b1b544SBram Moolenaar 5640b1b544SBram Moolenaar func Test_cursorhold_insert() 57f18c4dbbSBram Moolenaar " Need to move the cursor. 58f18c4dbbSBram Moolenaar call feedkeys("ggG", "xt") 59f18c4dbbSBram Moolenaar 6040b1b544SBram Moolenaar let g:triggered = 0 6140b1b544SBram Moolenaar au CursorHoldI * let g:triggered += 1 6240b1b544SBram Moolenaar set updatetime=20 6392bb83e4SBram Moolenaar call timer_start(200, 'ExitInsertMode') 6440b1b544SBram Moolenaar call feedkeys('a', 'x!') 6540b1b544SBram Moolenaar call assert_equal(1, g:triggered) 6626d98218SBram Moolenaar unlet g:triggered 6726d98218SBram Moolenaar au! CursorHoldI 6826d98218SBram Moolenaar set updatetime& 6926d98218SBram Moolenaar endfunc 7026d98218SBram Moolenaar 7126d98218SBram Moolenaar func Test_cursorhold_insert_with_timer_interrupt() 726d91bcb4SBram Moolenaar CheckFeature job 7326d98218SBram Moolenaar " Need to move the cursor. 7426d98218SBram Moolenaar call feedkeys("ggG", "xt") 7526d98218SBram Moolenaar 7626d98218SBram Moolenaar " Confirm the timer invoked in exit_cb of the job doesn't disturb 7726d98218SBram Moolenaar " CursorHoldI event. 7826d98218SBram Moolenaar let g:triggered = 0 7926d98218SBram Moolenaar au CursorHoldI * let g:triggered += 1 8062cd26a2SBram Moolenaar set updatetime=100 8126d98218SBram Moolenaar call job_start(has('win32') ? 'cmd /c echo:' : 'echo', 8262cd26a2SBram Moolenaar \ {'exit_cb': {-> timer_start(200, 'ExitInsertMode')}}) 8326d98218SBram Moolenaar call feedkeys('a', 'x!') 8426d98218SBram Moolenaar call assert_equal(1, g:triggered) 8526d98218SBram Moolenaar unlet g:triggered 86e99e8449SBram Moolenaar au! CursorHoldI 87aeac9006SBram Moolenaar set updatetime& 8840b1b544SBram Moolenaar endfunc 8940b1b544SBram Moolenaar 9040b1b544SBram Moolenaar func Test_cursorhold_insert_ctrl_x() 9140b1b544SBram Moolenaar let g:triggered = 0 9240b1b544SBram Moolenaar au CursorHoldI * let g:triggered += 1 9340b1b544SBram Moolenaar set updatetime=20 9440b1b544SBram Moolenaar call timer_start(100, 'ExitInsertMode') 9540b1b544SBram Moolenaar " CursorHoldI does not trigger after CTRL-X 9640b1b544SBram Moolenaar call feedkeys("a\<C-X>", 'x!') 9740b1b544SBram Moolenaar call assert_equal(0, g:triggered) 9826d98218SBram Moolenaar unlet g:triggered 99e99e8449SBram Moolenaar au! CursorHoldI 100aeac9006SBram Moolenaar set updatetime& 10140b1b544SBram Moolenaar endfunc 10297b0075bSBram Moolenaar 1035a9357d0SBram Moolenaar func Test_cursorhold_insert_ctrl_g_U() 1045a9357d0SBram Moolenaar au CursorHoldI * : 1055a9357d0SBram Moolenaar set updatetime=20 1065a9357d0SBram Moolenaar new 1075a9357d0SBram Moolenaar call timer_start(100, { -> feedkeys("\<Left>foo\<Esc>", 't') }) 1085a9357d0SBram Moolenaar call feedkeys("i()\<C-g>U", 'tx!') 1095a9357d0SBram Moolenaar sleep 200m 1105a9357d0SBram Moolenaar call assert_equal('(foo)', getline(1)) 1115a9357d0SBram Moolenaar undo 1125a9357d0SBram Moolenaar call assert_equal('', getline(1)) 1135a9357d0SBram Moolenaar 1145a9357d0SBram Moolenaar bwipe! 1155a9357d0SBram Moolenaar au! CursorHoldI 1165a9357d0SBram Moolenaar set updatetime& 1175a9357d0SBram Moolenaar endfunc 1185a9357d0SBram Moolenaar 11997b0075bSBram Moolenaar func Test_OptionSet_modeline() 12097b0075bSBram Moolenaar call test_override('starting', 1) 12197b0075bSBram Moolenaar au! OptionSet 12297b0075bSBram Moolenaar augroup set_tabstop 12397b0075bSBram Moolenaar au OptionSet tabstop call timer_start(1, {-> execute("echo 'Handler called'", "")}) 12497b0075bSBram Moolenaar augroup END 12597b0075bSBram Moolenaar call writefile(['vim: set ts=7 sw=5 :', 'something'], 'XoptionsetModeline') 12697b0075bSBram Moolenaar set modeline 12797b0075bSBram Moolenaar let v:errmsg = '' 12897b0075bSBram Moolenaar call assert_fails('split XoptionsetModeline', 'E12:') 12997b0075bSBram Moolenaar call assert_equal(7, &ts) 13097b0075bSBram Moolenaar call assert_equal('', v:errmsg) 13197b0075bSBram Moolenaar 13297b0075bSBram Moolenaar augroup set_tabstop 13397b0075bSBram Moolenaar au! 13497b0075bSBram Moolenaar augroup END 13597b0075bSBram Moolenaar bwipe! 13697b0075bSBram Moolenaar set ts& 13797b0075bSBram Moolenaar call delete('XoptionsetModeline') 13897b0075bSBram Moolenaar call test_override('starting', 0) 13997b0075bSBram Moolenaar endfunc 14097b0075bSBram Moolenaar 14197b0075bSBram Moolenaarendif "has('timers') 142c67e8921SBram Moolenaar 14304f62f88SBram Moolenaarfunc Test_bufunload() 144c67e8921SBram Moolenaar augroup test_bufunload_group 145c67e8921SBram Moolenaar autocmd! 146c67e8921SBram Moolenaar autocmd BufUnload * call add(s:li, "bufunload") 147c67e8921SBram Moolenaar autocmd BufDelete * call add(s:li, "bufdelete") 148c67e8921SBram Moolenaar autocmd BufWipeout * call add(s:li, "bufwipeout") 149c67e8921SBram Moolenaar augroup END 150c67e8921SBram Moolenaar 151c67e8921SBram Moolenaar let s:li = [] 152c67e8921SBram Moolenaar new 153c67e8921SBram Moolenaar setlocal bufhidden= 154c67e8921SBram Moolenaar bunload 155c67e8921SBram Moolenaar call assert_equal(["bufunload", "bufdelete"], s:li) 156c67e8921SBram Moolenaar 157c67e8921SBram Moolenaar let s:li = [] 158c67e8921SBram Moolenaar new 159c67e8921SBram Moolenaar setlocal bufhidden=delete 160c67e8921SBram Moolenaar bunload 161c67e8921SBram Moolenaar call assert_equal(["bufunload", "bufdelete"], s:li) 162c67e8921SBram Moolenaar 163c67e8921SBram Moolenaar let s:li = [] 164c67e8921SBram Moolenaar new 165c67e8921SBram Moolenaar setlocal bufhidden=unload 166c67e8921SBram Moolenaar bwipeout 167c67e8921SBram Moolenaar call assert_equal(["bufunload", "bufdelete", "bufwipeout"], s:li) 168c67e8921SBram Moolenaar 169e99e8449SBram Moolenaar au! test_bufunload_group 170c67e8921SBram Moolenaar augroup! test_bufunload_group 171c67e8921SBram Moolenaarendfunc 17230445cb6SBram Moolenaar 17330445cb6SBram Moolenaar" SEGV occurs in older versions. (At least 7.4.2005 or older) 17404f62f88SBram Moolenaarfunc Test_autocmd_bufunload_with_tabnext() 17530445cb6SBram Moolenaar tabedit 17630445cb6SBram Moolenaar tabfirst 17730445cb6SBram Moolenaar 17830445cb6SBram Moolenaar augroup test_autocmd_bufunload_with_tabnext_group 17930445cb6SBram Moolenaar autocmd! 18030445cb6SBram Moolenaar autocmd BufUnload <buffer> tabnext 18130445cb6SBram Moolenaar augroup END 18230445cb6SBram Moolenaar 18330445cb6SBram Moolenaar quit 18430445cb6SBram Moolenaar call assert_equal(2, tabpagenr('$')) 18530445cb6SBram Moolenaar 186e0ab94e7SBram Moolenaar autocmd! test_autocmd_bufunload_with_tabnext_group 18730445cb6SBram Moolenaar augroup! test_autocmd_bufunload_with_tabnext_group 18830445cb6SBram Moolenaar tablast 18930445cb6SBram Moolenaar quit 19030445cb6SBram Moolenaarendfunc 191c917da4bSBram Moolenaar 1925ed58c7bSBram Moolenaarfunc Test_argdelete_in_next() 1935ed58c7bSBram Moolenaar au BufNew,BufEnter,BufLeave,BufWinEnter * argdel 1945ed58c7bSBram Moolenaar call assert_fails('next a b', 'E1156:') 1955ed58c7bSBram Moolenaar au! BufNew,BufEnter,BufLeave,BufWinEnter * 1965ed58c7bSBram Moolenaarendfunc 1975ed58c7bSBram Moolenaar 19804f62f88SBram Moolenaarfunc Test_autocmd_bufwinleave_with_tabfirst() 199f9e687e0SBram Moolenaar tabedit 200f9e687e0SBram Moolenaar augroup sample 201f9e687e0SBram Moolenaar autocmd! 202f9e687e0SBram Moolenaar autocmd BufWinLeave <buffer> tabfirst 203f9e687e0SBram Moolenaar augroup END 204f9e687e0SBram Moolenaar call setline(1, ['a', 'b', 'c']) 205f9e687e0SBram Moolenaar edit! a.txt 206f18c4dbbSBram Moolenaar tabclose 207f9e687e0SBram Moolenaarendfunc 208f9e687e0SBram Moolenaar 209e0ab94e7SBram Moolenaar" SEGV occurs in older versions. (At least 7.4.2321 or older) 21004f62f88SBram Moolenaarfunc Test_autocmd_bufunload_avoiding_SEGV_01() 211e0ab94e7SBram Moolenaar split aa.txt 212e0ab94e7SBram Moolenaar let lastbuf = bufnr('$') 213e0ab94e7SBram Moolenaar 214e0ab94e7SBram Moolenaar augroup test_autocmd_bufunload 215e0ab94e7SBram Moolenaar autocmd! 216e0ab94e7SBram Moolenaar exe 'autocmd BufUnload <buffer> ' . (lastbuf + 1) . 'bwipeout!' 217e0ab94e7SBram Moolenaar augroup END 218e0ab94e7SBram Moolenaar 21928ee892aSBram Moolenaar call assert_fails('edit bb.txt', 'E937:') 220e0ab94e7SBram Moolenaar 221e0ab94e7SBram Moolenaar autocmd! test_autocmd_bufunload 222e0ab94e7SBram Moolenaar augroup! test_autocmd_bufunload 223e0ab94e7SBram Moolenaar bwipe! aa.txt 224e0ab94e7SBram Moolenaar bwipe! bb.txt 225e0ab94e7SBram Moolenaarendfunc 226e0ab94e7SBram Moolenaar 227e0ab94e7SBram Moolenaar" SEGV occurs in older versions. (At least 7.4.2321 or older) 22804f62f88SBram Moolenaarfunc Test_autocmd_bufunload_avoiding_SEGV_02() 229e0ab94e7SBram Moolenaar setlocal buftype=nowrite 230e0ab94e7SBram Moolenaar let lastbuf = bufnr('$') 231e0ab94e7SBram Moolenaar 232e0ab94e7SBram Moolenaar augroup test_autocmd_bufunload 233e0ab94e7SBram Moolenaar autocmd! 234e0ab94e7SBram Moolenaar exe 'autocmd BufUnload <buffer> ' . (lastbuf + 1) . 'bwipeout!' 235e0ab94e7SBram Moolenaar augroup END 236e0ab94e7SBram Moolenaar 237e0ab94e7SBram Moolenaar normal! i1 238e0ab94e7SBram Moolenaar call assert_fails('edit a.txt', 'E517:') 239e0ab94e7SBram Moolenaar 240e0ab94e7SBram Moolenaar autocmd! test_autocmd_bufunload 241e0ab94e7SBram Moolenaar augroup! test_autocmd_bufunload 242e0ab94e7SBram Moolenaar bwipe! a.txt 243e0ab94e7SBram Moolenaarendfunc 244e0ab94e7SBram Moolenaar 2451cfb9bb5SBram Moolenaarfunc Test_autocmd_dummy_wipeout() 2461cfb9bb5SBram Moolenaar " prepare files 2471cfb9bb5SBram Moolenaar call writefile([''], 'Xdummywipetest1.txt') 2481cfb9bb5SBram Moolenaar call writefile([''], 'Xdummywipetest2.txt') 2491cfb9bb5SBram Moolenaar augroup test_bufunload_group 2501cfb9bb5SBram Moolenaar autocmd! 2511cfb9bb5SBram Moolenaar autocmd BufUnload * call add(s:li, "bufunload") 2521cfb9bb5SBram Moolenaar autocmd BufDelete * call add(s:li, "bufdelete") 2531cfb9bb5SBram Moolenaar autocmd BufWipeout * call add(s:li, "bufwipeout") 2541cfb9bb5SBram Moolenaar augroup END 2551cfb9bb5SBram Moolenaar 2561cfb9bb5SBram Moolenaar let s:li = [] 2571cfb9bb5SBram Moolenaar split Xdummywipetest1.txt 2581cfb9bb5SBram Moolenaar silent! vimgrep /notmatched/ Xdummywipetest* 2591cfb9bb5SBram Moolenaar call assert_equal(["bufunload", "bufwipeout"], s:li) 2601cfb9bb5SBram Moolenaar 2611cfb9bb5SBram Moolenaar bwipeout 2621cfb9bb5SBram Moolenaar call delete('Xdummywipetest1.txt') 2631cfb9bb5SBram Moolenaar call delete('Xdummywipetest2.txt') 2641cfb9bb5SBram Moolenaar au! test_bufunload_group 2651cfb9bb5SBram Moolenaar augroup! test_bufunload_group 2661cfb9bb5SBram Moolenaarendfunc 2671cfb9bb5SBram Moolenaar 268c917da4bSBram Moolenaarfunc Test_win_tab_autocmd() 269c917da4bSBram Moolenaar let g:record = [] 270c917da4bSBram Moolenaar 271c917da4bSBram Moolenaar augroup testing 272c917da4bSBram Moolenaar au WinNew * call add(g:record, 'WinNew') 27323beefedSnaohiro ono au WinClosed * call add(g:record, 'WinClosed') 274c917da4bSBram Moolenaar au WinEnter * call add(g:record, 'WinEnter') 275c917da4bSBram Moolenaar au WinLeave * call add(g:record, 'WinLeave') 276c917da4bSBram Moolenaar au TabNew * call add(g:record, 'TabNew') 27712c11d55SBram Moolenaar au TabClosed * call add(g:record, 'TabClosed') 278c917da4bSBram Moolenaar au TabEnter * call add(g:record, 'TabEnter') 279c917da4bSBram Moolenaar au TabLeave * call add(g:record, 'TabLeave') 280c917da4bSBram Moolenaar augroup END 281c917da4bSBram Moolenaar 282c917da4bSBram Moolenaar split 283c917da4bSBram Moolenaar tabnew 284c917da4bSBram Moolenaar close 285c917da4bSBram Moolenaar close 286c917da4bSBram Moolenaar 287c917da4bSBram Moolenaar call assert_equal([ 288c917da4bSBram Moolenaar \ 'WinLeave', 'WinNew', 'WinEnter', 289c917da4bSBram Moolenaar \ 'WinLeave', 'TabLeave', 'WinNew', 'WinEnter', 'TabNew', 'TabEnter', 29023beefedSnaohiro ono \ 'WinLeave', 'TabLeave', 'WinClosed', 'TabClosed', 'WinEnter', 'TabEnter', 29123beefedSnaohiro ono \ 'WinLeave', 'WinClosed', 'WinEnter' 292c917da4bSBram Moolenaar \ ], g:record) 293c917da4bSBram Moolenaar 29412c11d55SBram Moolenaar let g:record = [] 29512c11d55SBram Moolenaar tabnew somefile 29612c11d55SBram Moolenaar tabnext 29712c11d55SBram Moolenaar bwipe somefile 29812c11d55SBram Moolenaar 29912c11d55SBram Moolenaar call assert_equal([ 30012c11d55SBram Moolenaar \ 'WinLeave', 'TabLeave', 'WinNew', 'WinEnter', 'TabNew', 'TabEnter', 30112c11d55SBram Moolenaar \ 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', 30223beefedSnaohiro ono \ 'WinClosed', 'TabClosed' 30312c11d55SBram Moolenaar \ ], g:record) 30412c11d55SBram Moolenaar 305c917da4bSBram Moolenaar augroup testing 306c917da4bSBram Moolenaar au! 307c917da4bSBram Moolenaar augroup END 308c917da4bSBram Moolenaar unlet g:record 309c917da4bSBram Moolenaarendfunc 310e99e8449SBram Moolenaar 31123beefedSnaohiro onofunc Test_WinClosed() 31223beefedSnaohiro ono " Test that the pattern is matched against the closed window's ID, and both 31323beefedSnaohiro ono " <amatch> and <afile> are set to it. 31423beefedSnaohiro ono new 31523beefedSnaohiro ono let winid = win_getid() 31623beefedSnaohiro ono let g:matched = v:false 31723beefedSnaohiro ono augroup test-WinClosed 31823beefedSnaohiro ono autocmd! 31923beefedSnaohiro ono execute 'autocmd WinClosed' winid 'let g:matched = v:true' 32023beefedSnaohiro ono autocmd WinClosed * let g:amatch = str2nr(expand('<amatch>')) 32123beefedSnaohiro ono autocmd WinClosed * let g:afile = str2nr(expand('<afile>')) 32223beefedSnaohiro ono augroup END 32323beefedSnaohiro ono close 32423beefedSnaohiro ono call assert_true(g:matched) 32523beefedSnaohiro ono call assert_equal(winid, g:amatch) 32623beefedSnaohiro ono call assert_equal(winid, g:afile) 32723beefedSnaohiro ono 32823beefedSnaohiro ono " Test that WinClosed is non-recursive. 32923beefedSnaohiro ono new 33023beefedSnaohiro ono new 33123beefedSnaohiro ono call assert_equal(3, winnr('$')) 33223beefedSnaohiro ono let g:triggered = 0 33323beefedSnaohiro ono augroup test-WinClosed 33423beefedSnaohiro ono autocmd! 33523beefedSnaohiro ono autocmd WinClosed * let g:triggered += 1 33623beefedSnaohiro ono autocmd WinClosed * 2 wincmd c 33723beefedSnaohiro ono augroup END 33823beefedSnaohiro ono close 33923beefedSnaohiro ono call assert_equal(1, winnr('$')) 34023beefedSnaohiro ono call assert_equal(1, g:triggered) 34123beefedSnaohiro ono 34223beefedSnaohiro ono autocmd! test-WinClosed 34323beefedSnaohiro ono augroup! test-WinClosed 34423beefedSnaohiro ono unlet g:matched 34523beefedSnaohiro ono unlet g:amatch 34623beefedSnaohiro ono unlet g:afile 34723beefedSnaohiro ono unlet g:triggered 34823beefedSnaohiro onoendfunc 34923beefedSnaohiro ono 350e99e8449SBram Moolenaarfunc s:AddAnAutocmd() 351e99e8449SBram Moolenaar augroup vimBarTest 352e99e8449SBram Moolenaar au BufReadCmd * echo 'hello' 353e99e8449SBram Moolenaar augroup END 354e99e8449SBram Moolenaar call assert_equal(3, len(split(execute('au vimBarTest'), "\n"))) 355e99e8449SBram Moolenaarendfunc 356e99e8449SBram Moolenaar 357e99e8449SBram Moolenaarfunc Test_early_bar() 358e99e8449SBram Moolenaar " test that a bar is recognized before the {event} 359e99e8449SBram Moolenaar call s:AddAnAutocmd() 360*b8e642f7SBram Moolenaar augroup vimBarTest | au! | let done = 77 | augroup END 361e99e8449SBram Moolenaar call assert_equal(1, len(split(execute('au vimBarTest'), "\n"))) 362*b8e642f7SBram Moolenaar call assert_equal(77, done) 363e99e8449SBram Moolenaar 364e99e8449SBram Moolenaar call s:AddAnAutocmd() 365*b8e642f7SBram Moolenaar augroup vimBarTest| au!| let done = 88 | augroup END 366e99e8449SBram Moolenaar call assert_equal(1, len(split(execute('au vimBarTest'), "\n"))) 367*b8e642f7SBram Moolenaar call assert_equal(88, done) 368e99e8449SBram Moolenaar 369e99e8449SBram Moolenaar " test that a bar is recognized after the {event} 370e99e8449SBram Moolenaar call s:AddAnAutocmd() 371*b8e642f7SBram Moolenaar augroup vimBarTest| au!BufReadCmd| let done = 99 | augroup END 372e99e8449SBram Moolenaar call assert_equal(1, len(split(execute('au vimBarTest'), "\n"))) 373*b8e642f7SBram Moolenaar call assert_equal(99, done) 374e99e8449SBram Moolenaar 375e99e8449SBram Moolenaar " test that a bar is recognized after the {group} 376e99e8449SBram Moolenaar call s:AddAnAutocmd() 377e99e8449SBram Moolenaar au! vimBarTest|echo 'hello' 378e99e8449SBram Moolenaar call assert_equal(1, len(split(execute('au vimBarTest'), "\n"))) 379e99e8449SBram Moolenaarendfunc 380f2c4c391SBram Moolenaar 3815c80908cSBram Moolenaarfunc RemoveGroup() 3825c80908cSBram Moolenaar autocmd! StartOK 3835c80908cSBram Moolenaar augroup! StartOK 3845c80908cSBram Moolenaarendfunc 3855c80908cSBram Moolenaar 386f2c4c391SBram Moolenaarfunc Test_augroup_warning() 387f2c4c391SBram Moolenaar augroup TheWarning 388f2c4c391SBram Moolenaar au VimEnter * echo 'entering' 389f2c4c391SBram Moolenaar augroup END 3905dc4e2f8SBram Moolenaar call assert_match("TheWarning.*VimEnter", execute('au VimEnter')) 391f2c4c391SBram Moolenaar redir => res 392f2c4c391SBram Moolenaar augroup! TheWarning 393f2c4c391SBram Moolenaar redir END 3945dc4e2f8SBram Moolenaar call assert_match("W19:", res) 3955dc4e2f8SBram Moolenaar call assert_match("-Deleted-.*VimEnter", execute('au VimEnter')) 396f2c4c391SBram Moolenaar 397f2c4c391SBram Moolenaar " check "Another" does not take the pace of the deleted entry 398f2c4c391SBram Moolenaar augroup Another 399f2c4c391SBram Moolenaar augroup END 4005dc4e2f8SBram Moolenaar call assert_match("-Deleted-.*VimEnter", execute('au VimEnter')) 401aeac9006SBram Moolenaar augroup! Another 4025c80908cSBram Moolenaar 4035c80908cSBram Moolenaar " no warning for postpone aucmd delete 4045c80908cSBram Moolenaar augroup StartOK 4055c80908cSBram Moolenaar au VimEnter * call RemoveGroup() 4065c80908cSBram Moolenaar augroup END 4075dc4e2f8SBram Moolenaar call assert_match("StartOK.*VimEnter", execute('au VimEnter')) 4085c80908cSBram Moolenaar redir => res 4095c80908cSBram Moolenaar doautocmd VimEnter 4105c80908cSBram Moolenaar redir END 4115dc4e2f8SBram Moolenaar call assert_notmatch("W19:", res) 412de653f08SBram Moolenaar au! VimEnter 413ad48e6c1SBram Moolenaar 414ad48e6c1SBram Moolenaar call assert_fails('augroup!', 'E471:') 415f2c4c391SBram Moolenaarendfunc 416b62cc36aSBram Moolenaar 4178d84ff1aSBram Moolenaarfunc Test_BufReadCmdHelp() 4188d84ff1aSBram Moolenaar " This used to cause access to free memory 4198d84ff1aSBram Moolenaar au BufReadCmd * e +h 4208d84ff1aSBram Moolenaar help 4218d84ff1aSBram Moolenaar 4228d84ff1aSBram Moolenaar au! BufReadCmd 4238d84ff1aSBram Moolenaarendfunc 4248d84ff1aSBram Moolenaar 4258d84ff1aSBram Moolenaarfunc Test_BufReadCmdHelpJump() 4268d84ff1aSBram Moolenaar " This used to cause access to free memory 4278d84ff1aSBram Moolenaar au BufReadCmd * e +h{ 428cf1ba35fSBram Moolenaar " } to fix highlighting 429cf1ba35fSBram Moolenaar call assert_fails('help', 'E434:') 4308d84ff1aSBram Moolenaar 4318d84ff1aSBram Moolenaar au! BufReadCmd 4328d84ff1aSBram Moolenaarendfunc 4338d84ff1aSBram Moolenaar 434b62cc36aSBram Moolenaarfunc Test_augroup_deleted() 435de653f08SBram Moolenaar " This caused a crash before E936 was introduced 436b62cc36aSBram Moolenaar augroup x 437de653f08SBram Moolenaar call assert_fails('augroup! x', 'E936:') 438b62cc36aSBram Moolenaar au VimEnter * echo 439de653f08SBram Moolenaar augroup end 440de653f08SBram Moolenaar augroup! x 4415dc4e2f8SBram Moolenaar call assert_match("-Deleted-.*VimEnter", execute('au VimEnter')) 442de653f08SBram Moolenaar au! VimEnter 443b62cc36aSBram Moolenaarendfunc 444b62cc36aSBram Moolenaar 445e0ab94e7SBram Moolenaar" Tests for autocommands on :close command. 446e0ab94e7SBram Moolenaar" This used to be in test13. 447e0ab94e7SBram Moolenaarfunc Test_three_windows() 448b3435b0aSBram Moolenaar " Clean up buffers, because in some cases this function fails. 449b3435b0aSBram Moolenaar call s:cleanup_buffers() 450b3435b0aSBram Moolenaar 451e0ab94e7SBram Moolenaar " Write three files and open them, each in a window. 452e0ab94e7SBram Moolenaar " Then go to next window, with autocommand that deletes the previous one. 453e0ab94e7SBram Moolenaar " Do this twice, writing the file. 454e0ab94e7SBram Moolenaar e! Xtestje1 455e0ab94e7SBram Moolenaar call setline(1, 'testje1') 456e0ab94e7SBram Moolenaar w 457e0ab94e7SBram Moolenaar sp Xtestje2 458e0ab94e7SBram Moolenaar call setline(1, 'testje2') 459e0ab94e7SBram Moolenaar w 460e0ab94e7SBram Moolenaar sp Xtestje3 461e0ab94e7SBram Moolenaar call setline(1, 'testje3') 462e0ab94e7SBram Moolenaar w 463e0ab94e7SBram Moolenaar wincmd w 464e0ab94e7SBram Moolenaar au WinLeave Xtestje2 bwipe 465e0ab94e7SBram Moolenaar wincmd w 466e0ab94e7SBram Moolenaar call assert_equal('Xtestje1', expand('%')) 467e0ab94e7SBram Moolenaar 468e0ab94e7SBram Moolenaar au WinLeave Xtestje1 bwipe Xtestje3 469e0ab94e7SBram Moolenaar close 470e0ab94e7SBram Moolenaar call assert_equal('Xtestje1', expand('%')) 471e0ab94e7SBram Moolenaar 472e0ab94e7SBram Moolenaar " Test deleting the buffer on a Unload event. If this goes wrong there 473e0ab94e7SBram Moolenaar " will be the ATTENTION prompt. 474e0ab94e7SBram Moolenaar e Xtestje1 475e0ab94e7SBram Moolenaar au! 476e0ab94e7SBram Moolenaar au! BufUnload Xtestje1 bwipe 477e0ab94e7SBram Moolenaar call assert_fails('e Xtestje3', 'E937:') 478e0ab94e7SBram Moolenaar call assert_equal('Xtestje3', expand('%')) 479e0ab94e7SBram Moolenaar 480e0ab94e7SBram Moolenaar e Xtestje2 481e0ab94e7SBram Moolenaar sp Xtestje1 482e0ab94e7SBram Moolenaar call assert_fails('e', 'E937:') 483a997b45cSBram Moolenaar call assert_equal('Xtestje1', expand('%')) 484e0ab94e7SBram Moolenaar 485e0ab94e7SBram Moolenaar " Test changing buffers in a BufWipeout autocommand. If this goes wrong 486e0ab94e7SBram Moolenaar " there are ml_line errors and/or a Crash. 487e0ab94e7SBram Moolenaar au! 488e0ab94e7SBram Moolenaar only 489e0ab94e7SBram Moolenaar e Xanother 490e0ab94e7SBram Moolenaar e Xtestje1 491e0ab94e7SBram Moolenaar bwipe Xtestje2 492e0ab94e7SBram Moolenaar bwipe Xtestje3 493e0ab94e7SBram Moolenaar au BufWipeout Xtestje1 buf Xtestje1 494e0ab94e7SBram Moolenaar bwipe 495e0ab94e7SBram Moolenaar call assert_equal('Xanother', expand('%')) 496e0ab94e7SBram Moolenaar 497e0ab94e7SBram Moolenaar only 498e0ab94e7SBram Moolenaar help 499e0ab94e7SBram Moolenaar wincmd w 500e0ab94e7SBram Moolenaar 1quit 501e0ab94e7SBram Moolenaar call assert_equal('Xanother', expand('%')) 502e0ab94e7SBram Moolenaar 503e0ab94e7SBram Moolenaar au! 5044520d440SBram Moolenaar enew 505e0ab94e7SBram Moolenaar call delete('Xtestje1') 506e0ab94e7SBram Moolenaar call delete('Xtestje2') 507e0ab94e7SBram Moolenaar call delete('Xtestje3') 508e0ab94e7SBram Moolenaarendfunc 509e13b9afeSBram Moolenaar 510e13b9afeSBram Moolenaarfunc Test_BufEnter() 511e13b9afeSBram Moolenaar au! BufEnter 512e13b9afeSBram Moolenaar au Bufenter * let val = val . '+' 513e13b9afeSBram Moolenaar let g:val = '' 514e13b9afeSBram Moolenaar split NewFile 515e13b9afeSBram Moolenaar call assert_equal('+', g:val) 516e13b9afeSBram Moolenaar bwipe! 517e13b9afeSBram Moolenaar call assert_equal('++', g:val) 518e13b9afeSBram Moolenaar 519e13b9afeSBram Moolenaar " Also get BufEnter when editing a directory 520e13b9afeSBram Moolenaar call mkdir('Xdir') 521e13b9afeSBram Moolenaar split Xdir 522e13b9afeSBram Moolenaar call assert_equal('+++', g:val) 523e94260f3SBram Moolenaar 524e94260f3SBram Moolenaar " On MS-Windows we can't edit the directory, make sure we wipe the right 525e94260f3SBram Moolenaar " buffer. 526e94260f3SBram Moolenaar bwipe! Xdir 527e13b9afeSBram Moolenaar 528e13b9afeSBram Moolenaar call delete('Xdir', 'd') 529e13b9afeSBram Moolenaar au! BufEnter 530e13b9afeSBram Moolenaarendfunc 5318c752bd6SBram Moolenaar 5328c752bd6SBram Moolenaar" Closing a window might cause an endless loop 5338c752bd6SBram Moolenaar" E814 for older Vims 53404f62f88SBram Moolenaarfunc Test_autocmd_bufwipe_in_SessLoadPost() 5351d68d9b2SBram Moolenaar edit Xtest 5368c752bd6SBram Moolenaar tabnew 5371d68d9b2SBram Moolenaar file Xsomething 5388c752bd6SBram Moolenaar set noswapfile 5398c752bd6SBram Moolenaar mksession! 5408c752bd6SBram Moolenaar 541c79745a8SBram Moolenaar let content =<< trim [CODE] 54262cd26a2SBram Moolenaar call test_override('ui_delay', 10) 543c79745a8SBram Moolenaar set nocp noswapfile 544c79745a8SBram Moolenaar let v:swapchoice = "e" 545c79745a8SBram Moolenaar augroup test_autocmd_sessionload 546c79745a8SBram Moolenaar autocmd! 547c79745a8SBram Moolenaar autocmd SessionLoadPost * exe bufnr("Xsomething") . "bw!" 548c79745a8SBram Moolenaar augroup END 549c79745a8SBram Moolenaar 550c79745a8SBram Moolenaar func WriteErrors() 551c79745a8SBram Moolenaar call writefile([execute("messages")], "Xerrors") 552c79745a8SBram Moolenaar endfunc 553c79745a8SBram Moolenaar au VimLeave * call WriteErrors() 554c79745a8SBram Moolenaar [CODE] 555c79745a8SBram Moolenaar 5568c752bd6SBram Moolenaar call writefile(content, 'Xvimrc') 55793344c2dSBram Moolenaar call system(GetVimCommand('Xvimrc') .. ' --not-a-term --noplugins -S Session.vim -c cq') 558e94260f3SBram Moolenaar let errors = join(readfile('Xerrors')) 559e2e4075fSBram Moolenaar call assert_match('E814:', errors) 5608c752bd6SBram Moolenaar 5618c752bd6SBram Moolenaar set swapfile 562e94260f3SBram Moolenaar for file in ['Session.vim', 'Xvimrc', 'Xerrors'] 5638c752bd6SBram Moolenaar call delete(file) 5648c752bd6SBram Moolenaar endfor 5658c752bd6SBram Moolenaarendfunc 5668c752bd6SBram Moolenaar 567797e63b9SBram Moolenaar" Using :blast and :ball for many events caused a crash, because b_nwindows was 568797e63b9SBram Moolenaar" not incremented correctly. 569797e63b9SBram Moolenaarfunc Test_autocmd_blast_badd() 570797e63b9SBram Moolenaar let content =<< trim [CODE] 571797e63b9SBram Moolenaar au BufNew,BufAdd,BufWinEnter,BufEnter,BufLeave,BufWinLeave,BufUnload,VimEnter foo* blast 572797e63b9SBram Moolenaar edit foo1 573797e63b9SBram Moolenaar au BufNew,BufAdd,BufWinEnter,BufEnter,BufLeave,BufWinLeave,BufUnload,VimEnter foo* ball 574797e63b9SBram Moolenaar edit foo2 575797e63b9SBram Moolenaar call writefile(['OK'], 'Xerrors') 576797e63b9SBram Moolenaar qall 577797e63b9SBram Moolenaar [CODE] 578797e63b9SBram Moolenaar 579797e63b9SBram Moolenaar call writefile(content, 'XblastBall') 580797e63b9SBram Moolenaar call system(GetVimCommand() .. ' --clean -S XblastBall') 581797e63b9SBram Moolenaar call assert_match('OK', readfile('Xerrors')->join()) 582797e63b9SBram Moolenaar 583797e63b9SBram Moolenaar call delete('XblastBall') 584797e63b9SBram Moolenaar call delete('Xerrors') 585797e63b9SBram Moolenaarendfunc 586797e63b9SBram Moolenaar 5878c752bd6SBram Moolenaar" SEGV occurs in older versions. 58804f62f88SBram Moolenaarfunc Test_autocmd_bufwipe_in_SessLoadPost2() 5898c752bd6SBram Moolenaar tabnew 5908c752bd6SBram Moolenaar set noswapfile 5918c752bd6SBram Moolenaar mksession! 5928c752bd6SBram Moolenaar 593c79745a8SBram Moolenaar let content =<< trim [CODE] 594c79745a8SBram Moolenaar set nocp noswapfile 595c79745a8SBram Moolenaar function! DeleteInactiveBufs() 596c79745a8SBram Moolenaar tabfirst 597c79745a8SBram Moolenaar let tabblist = [] 598c79745a8SBram Moolenaar for i in range(1, tabpagenr(''$'')) 599c79745a8SBram Moolenaar call extend(tabblist, tabpagebuflist(i)) 600c79745a8SBram Moolenaar endfor 601c79745a8SBram Moolenaar for b in range(1, bufnr(''$'')) 602c79745a8SBram Moolenaar if bufexists(b) && buflisted(b) && (index(tabblist, b) == -1 || bufname(b) =~# ''^$'') 603c79745a8SBram Moolenaar exec ''bwipeout '' . b 604c79745a8SBram Moolenaar endif 605c79745a8SBram Moolenaar endfor 606c79745a8SBram Moolenaar echomsg "SessionLoadPost DONE" 607c79745a8SBram Moolenaar endfunction 608c79745a8SBram Moolenaar au SessionLoadPost * call DeleteInactiveBufs() 609c79745a8SBram Moolenaar 610c79745a8SBram Moolenaar func WriteErrors() 611c79745a8SBram Moolenaar call writefile([execute("messages")], "Xerrors") 612c79745a8SBram Moolenaar endfunc 613c79745a8SBram Moolenaar au VimLeave * call WriteErrors() 614c79745a8SBram Moolenaar [CODE] 615c79745a8SBram Moolenaar 6168c752bd6SBram Moolenaar call writefile(content, 'Xvimrc') 61793344c2dSBram Moolenaar call system(GetVimCommand('Xvimrc') .. ' --not-a-term --noplugins -S Session.vim -c cq') 618e94260f3SBram Moolenaar let errors = join(readfile('Xerrors')) 619e94260f3SBram Moolenaar " This probably only ever matches on unix. 620e94260f3SBram Moolenaar call assert_notmatch('Caught deadly signal SEGV', errors) 621e94260f3SBram Moolenaar call assert_match('SessionLoadPost DONE', errors) 6228c752bd6SBram Moolenaar 6238c752bd6SBram Moolenaar set swapfile 624e94260f3SBram Moolenaar for file in ['Session.vim', 'Xvimrc', 'Xerrors'] 6258c752bd6SBram Moolenaar call delete(file) 6268c752bd6SBram Moolenaar endfor 6278c752bd6SBram Moolenaarendfunc 628faf29d7fSBram Moolenaar 629faf29d7fSBram Moolenaarfunc Test_empty_doau() 630faf29d7fSBram Moolenaar doau \| 631faf29d7fSBram Moolenaarendfunc 63204f62f88SBram Moolenaar 63304f62f88SBram Moolenaarfunc s:AutoCommandOptionSet(match) 634d7c96879SBram Moolenaar let template = "Option: <%s>, OldVal: <%s>, OldValLocal: <%s>, OldValGlobal: <%s>, NewVal: <%s>, Scope: <%s>, Command: <%s>\n" 63504f62f88SBram Moolenaar let item = remove(g:options, 0) 636d7c96879SBram Moolenaar let expected = printf(template, item[0], item[1], item[2], item[3], item[4], item[5], item[6]) 637d7c96879SBram Moolenaar let actual = printf(template, a:match, v:option_old, v:option_oldlocal, v:option_oldglobal, v:option_new, v:option_type, v:option_command) 63804f62f88SBram Moolenaar let g:opt = [expected, actual] 63904f62f88SBram Moolenaar "call assert_equal(expected, actual) 64004f62f88SBram Moolenaarendfunc 64104f62f88SBram Moolenaar 64204f62f88SBram Moolenaarfunc Test_OptionSet() 6436d91bcb4SBram Moolenaar CheckOption autochdir 64404f62f88SBram Moolenaar 6454a6fcf80SBram Moolenaar badd test_autocmd.vim 6464a6fcf80SBram Moolenaar 64704f62f88SBram Moolenaar call test_override('starting', 1) 64804f62f88SBram Moolenaar set nocp 64904f62f88SBram Moolenaar au OptionSet * :call s:AutoCommandOptionSet(expand("<amatch>")) 65004f62f88SBram Moolenaar 65104f62f88SBram Moolenaar " 1: Setting number option" 652d7c96879SBram Moolenaar let g:options = [['number', 0, 0, 0, 1, 'global', 'set']] 65304f62f88SBram Moolenaar set nu 65404f62f88SBram Moolenaar call assert_equal([], g:options) 65504f62f88SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 65604f62f88SBram Moolenaar 65704f62f88SBram Moolenaar " 2: Setting local number option" 658d7c96879SBram Moolenaar let g:options = [['number', 1, 1, '', 0, 'local', 'setlocal']] 65904f62f88SBram Moolenaar setlocal nonu 66004f62f88SBram Moolenaar call assert_equal([], g:options) 66104f62f88SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 66204f62f88SBram Moolenaar 66304f62f88SBram Moolenaar " 3: Setting global number option" 664d7c96879SBram Moolenaar let g:options = [['number', 1, '', 1, 0, 'global', 'setglobal']] 66504f62f88SBram Moolenaar setglobal nonu 66604f62f88SBram Moolenaar call assert_equal([], g:options) 66704f62f88SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 66804f62f88SBram Moolenaar 66904f62f88SBram Moolenaar " 4: Setting local autoindent option" 670d7c96879SBram Moolenaar let g:options = [['autoindent', 0, 0, '', 1, 'local', 'setlocal']] 67104f62f88SBram Moolenaar setlocal ai 67204f62f88SBram Moolenaar call assert_equal([], g:options) 67304f62f88SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 67404f62f88SBram Moolenaar 67504f62f88SBram Moolenaar " 5: Setting global autoindent option" 676d7c96879SBram Moolenaar let g:options = [['autoindent', 0, '', 0, 1, 'global', 'setglobal']] 67704f62f88SBram Moolenaar setglobal ai 67804f62f88SBram Moolenaar call assert_equal([], g:options) 67904f62f88SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 68004f62f88SBram Moolenaar 68104f62f88SBram Moolenaar " 6: Setting global autoindent option" 682d7c96879SBram Moolenaar let g:options = [['autoindent', 1, 1, 1, 0, 'global', 'set']] 683d7c96879SBram Moolenaar set ai! 684d7c96879SBram Moolenaar call assert_equal([], g:options) 685d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 686d7c96879SBram Moolenaar 687d7c96879SBram Moolenaar " 6a: Setting global autoindent option" 688d7c96879SBram Moolenaar let g:options = [['autoindent', 1, 1, 0, 0, 'global', 'set']] 689d7c96879SBram Moolenaar noa setlocal ai 690d7c96879SBram Moolenaar noa setglobal noai 69104f62f88SBram Moolenaar set ai! 69204f62f88SBram Moolenaar call assert_equal([], g:options) 69304f62f88SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 69404f62f88SBram Moolenaar 69504f62f88SBram Moolenaar " Should not print anything, use :noa 69604f62f88SBram Moolenaar " 7: don't trigger OptionSet" 697d7c96879SBram Moolenaar let g:options = [['invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid']] 69804f62f88SBram Moolenaar noa set nonu 699d7c96879SBram Moolenaar call assert_equal([['invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid']], g:options) 70004f62f88SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 70104f62f88SBram Moolenaar 70204f62f88SBram Moolenaar " 8: Setting several global list and number option" 703d7c96879SBram Moolenaar let g:options = [['list', 0, 0, 0, 1, 'global', 'set'], ['number', 0, 0, 0, 1, 'global', 'set']] 70404f62f88SBram Moolenaar set list nu 70504f62f88SBram Moolenaar call assert_equal([], g:options) 70604f62f88SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 70704f62f88SBram Moolenaar 70804f62f88SBram Moolenaar " 9: don't trigger OptionSet" 709d7c96879SBram Moolenaar let g:options = [['invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid'], ['invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid']] 71004f62f88SBram Moolenaar noa set nolist nonu 711d7c96879SBram Moolenaar call assert_equal([['invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid'], ['invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid']], g:options) 71204f62f88SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 71304f62f88SBram Moolenaar 71404f62f88SBram Moolenaar " 10: Setting global acd" 715d7c96879SBram Moolenaar let g:options = [['autochdir', 0, 0, '', 1, 'local', 'setlocal']] 71604f62f88SBram Moolenaar setlocal acd 71704f62f88SBram Moolenaar call assert_equal([], g:options) 71804f62f88SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 71904f62f88SBram Moolenaar 72004f62f88SBram Moolenaar " 11: Setting global autoread (also sets local value)" 721d7c96879SBram Moolenaar let g:options = [['autoread', 0, 0, 0, 1, 'global', 'set']] 72204f62f88SBram Moolenaar set ar 72304f62f88SBram Moolenaar call assert_equal([], g:options) 72404f62f88SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 72504f62f88SBram Moolenaar 72604f62f88SBram Moolenaar " 12: Setting local autoread" 727d7c96879SBram Moolenaar let g:options = [['autoread', 1, 1, '', 1, 'local', 'setlocal']] 72804f62f88SBram Moolenaar setlocal ar 72904f62f88SBram Moolenaar call assert_equal([], g:options) 73004f62f88SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 73104f62f88SBram Moolenaar 73204f62f88SBram Moolenaar " 13: Setting global autoread" 733d7c96879SBram Moolenaar let g:options = [['autoread', 1, '', 1, 0, 'global', 'setglobal']] 73404f62f88SBram Moolenaar setglobal invar 73504f62f88SBram Moolenaar call assert_equal([], g:options) 73604f62f88SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 73704f62f88SBram Moolenaar 73804f62f88SBram Moolenaar " 14: Setting option backspace through :let" 739d7c96879SBram Moolenaar let g:options = [['backspace', '', '', '', 'eol,indent,start', 'global', 'set']] 74004f62f88SBram Moolenaar let &bs = "eol,indent,start" 74104f62f88SBram Moolenaar call assert_equal([], g:options) 74204f62f88SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 74304f62f88SBram Moolenaar 74404f62f88SBram Moolenaar " 15: Setting option backspace through setbufvar()" 745d7c96879SBram Moolenaar let g:options = [['backup', 0, 0, '', 1, 'local', 'setlocal']] 74604f62f88SBram Moolenaar " try twice, first time, shouldn't trigger because option name is invalid, 74704f62f88SBram Moolenaar " second time, it should trigger 7484a6fcf80SBram Moolenaar let bnum = bufnr('%') 749e2e4075fSBram Moolenaar call assert_fails("call setbufvar(bnum, '&l:bk', 1)", 'E355:') 75004f62f88SBram Moolenaar " should trigger, use correct option name 7514a6fcf80SBram Moolenaar call setbufvar(bnum, '&backup', 1) 75204f62f88SBram Moolenaar call assert_equal([], g:options) 75304f62f88SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 75404f62f88SBram Moolenaar 75504f62f88SBram Moolenaar " 16: Setting number option using setwinvar" 756d7c96879SBram Moolenaar let g:options = [['number', 0, 0, '', 1, 'local', 'setlocal']] 75704f62f88SBram Moolenaar call setwinvar(0, '&number', 1) 75804f62f88SBram Moolenaar call assert_equal([], g:options) 75904f62f88SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 76004f62f88SBram Moolenaar 76104f62f88SBram Moolenaar " 17: Setting key option, shouldn't trigger" 762d7c96879SBram Moolenaar let g:options = [['key', 'invalid', 'invalid1', 'invalid2', 'invalid3', 'invalid4', 'invalid5']] 76304f62f88SBram Moolenaar setlocal key=blah 76404f62f88SBram Moolenaar setlocal key= 765d7c96879SBram Moolenaar call assert_equal([['key', 'invalid', 'invalid1', 'invalid2', 'invalid3', 'invalid4', 'invalid5']], g:options) 76604f62f88SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 76704f62f88SBram Moolenaar 768d7c96879SBram Moolenaar 769d7c96879SBram Moolenaar " 18a: Setting string global option" 770d7c96879SBram Moolenaar let oldval = &backupext 771d7c96879SBram Moolenaar let g:options = [['backupext', oldval, oldval, oldval, 'foo', 'global', 'set']] 772d7c96879SBram Moolenaar set backupext=foo 773d7c96879SBram Moolenaar call assert_equal([], g:options) 774d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 775d7c96879SBram Moolenaar 776d7c96879SBram Moolenaar " 18b: Resetting string global option" 777d7c96879SBram Moolenaar let g:options = [['backupext', 'foo', 'foo', 'foo', oldval, 'global', 'set']] 778d7c96879SBram Moolenaar set backupext& 779d7c96879SBram Moolenaar call assert_equal([], g:options) 780d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 781d7c96879SBram Moolenaar 782d7c96879SBram Moolenaar " 18c: Setting global string global option" 783d7c96879SBram Moolenaar let g:options = [['backupext', oldval, '', oldval, 'bar', 'global', 'setglobal']] 784d7c96879SBram Moolenaar setglobal backupext=bar 785d7c96879SBram Moolenaar call assert_equal([], g:options) 786d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 787d7c96879SBram Moolenaar 788d7c96879SBram Moolenaar " 18d: Setting local string global option" 789d7c96879SBram Moolenaar " As this is a global option this sets the global value even though 790d7c96879SBram Moolenaar " :setlocal is used! 791d7c96879SBram Moolenaar noa set backupext& " Reset global and local value (without triggering autocmd) 792d7c96879SBram Moolenaar let g:options = [['backupext', oldval, oldval, '', 'baz', 'local', 'setlocal']] 793d7c96879SBram Moolenaar setlocal backupext=baz 794d7c96879SBram Moolenaar call assert_equal([], g:options) 795d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 796d7c96879SBram Moolenaar 797d7c96879SBram Moolenaar " 18e: Setting again string global option" 798d7c96879SBram Moolenaar noa setglobal backupext=ext_global " Reset global and local value (without triggering autocmd) 799d7c96879SBram Moolenaar noa setlocal backupext=ext_local " Sets the global(!) value! 800d7c96879SBram Moolenaar let g:options = [['backupext', 'ext_local', 'ext_local', 'ext_local', 'fuu', 'global', 'set']] 801d7c96879SBram Moolenaar set backupext=fuu 802d7c96879SBram Moolenaar call assert_equal([], g:options) 803d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 804d7c96879SBram Moolenaar 805d7c96879SBram Moolenaar 806b811de5dSzeertzjq " 19a: Setting string global-local (to buffer) option" 8078efa026aSBram Moolenaar let oldval = &tags 808d7c96879SBram Moolenaar let g:options = [['tags', oldval, oldval, oldval, 'tagpath', 'global', 'set']] 8098efa026aSBram Moolenaar set tags=tagpath 8108efa026aSBram Moolenaar call assert_equal([], g:options) 8118efa026aSBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 8128efa026aSBram Moolenaar 813b811de5dSzeertzjq " 19b: Resetting string global-local (to buffer) option" 814d7c96879SBram Moolenaar let g:options = [['tags', 'tagpath', 'tagpath', 'tagpath', oldval, 'global', 'set']] 8158efa026aSBram Moolenaar set tags& 8168efa026aSBram Moolenaar call assert_equal([], g:options) 8178efa026aSBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 8188efa026aSBram Moolenaar 819b811de5dSzeertzjq " 19c: Setting global string global-local (to buffer) option " 820d7c96879SBram Moolenaar let g:options = [['tags', oldval, '', oldval, 'tagpath1', 'global', 'setglobal']] 821d7c96879SBram Moolenaar setglobal tags=tagpath1 822d7c96879SBram Moolenaar call assert_equal([], g:options) 823d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 824d7c96879SBram Moolenaar 825b811de5dSzeertzjq " 19d: Setting local string global-local (to buffer) option" 826d7c96879SBram Moolenaar let g:options = [['tags', 'tagpath1', 'tagpath1', '', 'tagpath2', 'local', 'setlocal']] 827d7c96879SBram Moolenaar setlocal tags=tagpath2 828d7c96879SBram Moolenaar call assert_equal([], g:options) 829d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 830d7c96879SBram Moolenaar 831b811de5dSzeertzjq " 19e: Setting again string global-local (to buffer) option" 832b811de5dSzeertzjq " Note: v:option_old is the old global value for global-local string options 833d7c96879SBram Moolenaar " but the old local value for all other kinds of options. 834d7c96879SBram Moolenaar noa setglobal tags=tag_global " Reset global and local value (without triggering autocmd) 835d7c96879SBram Moolenaar noa setlocal tags=tag_local 836d7c96879SBram Moolenaar let g:options = [['tags', 'tag_global', 'tag_local', 'tag_global', 'tagpath', 'global', 'set']] 837d7c96879SBram Moolenaar set tags=tagpath 838d7c96879SBram Moolenaar call assert_equal([], g:options) 839d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 840d7c96879SBram Moolenaar 841b811de5dSzeertzjq " 19f: Setting string global-local (to buffer) option to an empty string" 842b811de5dSzeertzjq " Note: v:option_old is the old global value for global-local string options 843d7c96879SBram Moolenaar " but the old local value for all other kinds of options. 844d7c96879SBram Moolenaar noa set tags=tag_global " Reset global and local value (without triggering autocmd) 845d7c96879SBram Moolenaar noa setlocal tags= " empty string 846d7c96879SBram Moolenaar let g:options = [['tags', 'tag_global', '', 'tag_global', 'tagpath', 'global', 'set']] 847d7c96879SBram Moolenaar set tags=tagpath 848d7c96879SBram Moolenaar call assert_equal([], g:options) 849d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 850d7c96879SBram Moolenaar 851d7c96879SBram Moolenaar 852d7c96879SBram Moolenaar " 20a: Setting string local (to buffer) option" 853d7c96879SBram Moolenaar let oldval = &spelllang 854d7c96879SBram Moolenaar let g:options = [['spelllang', oldval, oldval, oldval, 'elvish,klingon', 'global', 'set']] 855d7c96879SBram Moolenaar set spelllang=elvish,klingon 856d7c96879SBram Moolenaar call assert_equal([], g:options) 857d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 858d7c96879SBram Moolenaar 859d7c96879SBram Moolenaar " 20b: Resetting string local (to buffer) option" 860d7c96879SBram Moolenaar let g:options = [['spelllang', 'elvish,klingon', 'elvish,klingon', 'elvish,klingon', oldval, 'global', 'set']] 861d7c96879SBram Moolenaar set spelllang& 862d7c96879SBram Moolenaar call assert_equal([], g:options) 863d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 864d7c96879SBram Moolenaar 865d7c96879SBram Moolenaar " 20c: Setting global string local (to buffer) option" 866d7c96879SBram Moolenaar let g:options = [['spelllang', oldval, '', oldval, 'elvish', 'global', 'setglobal']] 867d7c96879SBram Moolenaar setglobal spelllang=elvish 868d7c96879SBram Moolenaar call assert_equal([], g:options) 869d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 870d7c96879SBram Moolenaar 871d7c96879SBram Moolenaar " 20d: Setting local string local (to buffer) option" 872d7c96879SBram Moolenaar noa set spelllang& " Reset global and local value (without triggering autocmd) 873d7c96879SBram Moolenaar let g:options = [['spelllang', oldval, oldval, '', 'klingon', 'local', 'setlocal']] 874d7c96879SBram Moolenaar setlocal spelllang=klingon 875d7c96879SBram Moolenaar call assert_equal([], g:options) 876d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 877d7c96879SBram Moolenaar 878d7c96879SBram Moolenaar " 20e: Setting again string local (to buffer) option" 879b811de5dSzeertzjq " Note: v:option_old is the old global value for global-local string options 880d7c96879SBram Moolenaar " but the old local value for all other kinds of options. 881d7c96879SBram Moolenaar noa setglobal spelllang=spellglobal " Reset global and local value (without triggering autocmd) 882d7c96879SBram Moolenaar noa setlocal spelllang=spelllocal 883d7c96879SBram Moolenaar let g:options = [['spelllang', 'spelllocal', 'spelllocal', 'spellglobal', 'foo', 'global', 'set']] 884d7c96879SBram Moolenaar set spelllang=foo 885d7c96879SBram Moolenaar call assert_equal([], g:options) 886d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 887d7c96879SBram Moolenaar 888d7c96879SBram Moolenaar 889b811de5dSzeertzjq " 21a: Setting string global-local (to window) option" 890d7c96879SBram Moolenaar let oldval = &statusline 891d7c96879SBram Moolenaar let g:options = [['statusline', oldval, oldval, oldval, 'foo', 'global', 'set']] 892d7c96879SBram Moolenaar set statusline=foo 893d7c96879SBram Moolenaar call assert_equal([], g:options) 894d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 895d7c96879SBram Moolenaar 896b811de5dSzeertzjq " 21b: Resetting string global-local (to window) option" 897b811de5dSzeertzjq " Note: v:option_old is the old global value for global-local string options 898d7c96879SBram Moolenaar " but the old local value for all other kinds of options. 899d7c96879SBram Moolenaar let g:options = [['statusline', 'foo', 'foo', 'foo', oldval, 'global', 'set']] 900d7c96879SBram Moolenaar set statusline& 901d7c96879SBram Moolenaar call assert_equal([], g:options) 902d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 903d7c96879SBram Moolenaar 904b811de5dSzeertzjq " 21c: Setting global string global-local (to window) option" 905d7c96879SBram Moolenaar let g:options = [['statusline', oldval, '', oldval, 'bar', 'global', 'setglobal']] 906d7c96879SBram Moolenaar setglobal statusline=bar 907d7c96879SBram Moolenaar call assert_equal([], g:options) 908d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 909d7c96879SBram Moolenaar 910b811de5dSzeertzjq " 21d: Setting local string global-local (to window) option" 911d7c96879SBram Moolenaar noa set statusline& " Reset global and local value (without triggering autocmd) 912d7c96879SBram Moolenaar let g:options = [['statusline', oldval, oldval, '', 'baz', 'local', 'setlocal']] 913d7c96879SBram Moolenaar setlocal statusline=baz 914d7c96879SBram Moolenaar call assert_equal([], g:options) 915d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 916d7c96879SBram Moolenaar 917b811de5dSzeertzjq " 21e: Setting again string global-local (to window) option" 918b811de5dSzeertzjq " Note: v:option_old is the old global value for global-local string options 919d7c96879SBram Moolenaar " but the old local value for all other kinds of options. 920d7c96879SBram Moolenaar noa setglobal statusline=bar " Reset global and local value (without triggering autocmd) 921d7c96879SBram Moolenaar noa setlocal statusline=baz 922d7c96879SBram Moolenaar let g:options = [['statusline', 'bar', 'baz', 'bar', 'foo', 'global', 'set']] 923d7c96879SBram Moolenaar set statusline=foo 924d7c96879SBram Moolenaar call assert_equal([], g:options) 925d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 926d7c96879SBram Moolenaar 927d7c96879SBram Moolenaar 928d7c96879SBram Moolenaar " 22a: Setting string local (to window) option" 929d7c96879SBram Moolenaar let oldval = &foldignore 930d7c96879SBram Moolenaar let g:options = [['foldignore', oldval, oldval, oldval, 'fo', 'global', 'set']] 931d7c96879SBram Moolenaar set foldignore=fo 932d7c96879SBram Moolenaar call assert_equal([], g:options) 933d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 934d7c96879SBram Moolenaar 935d7c96879SBram Moolenaar " 22b: Resetting string local (to window) option" 936d7c96879SBram Moolenaar let g:options = [['foldignore', 'fo', 'fo', 'fo', oldval, 'global', 'set']] 937d7c96879SBram Moolenaar set foldignore& 938d7c96879SBram Moolenaar call assert_equal([], g:options) 939d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 940d7c96879SBram Moolenaar 941d7c96879SBram Moolenaar " 22c: Setting global string local (to window) option" 942d7c96879SBram Moolenaar let g:options = [['foldignore', oldval, '', oldval, 'bar', 'global', 'setglobal']] 943d7c96879SBram Moolenaar setglobal foldignore=bar 944d7c96879SBram Moolenaar call assert_equal([], g:options) 945d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 946d7c96879SBram Moolenaar 947d7c96879SBram Moolenaar " 22d: Setting local string local (to window) option" 948d7c96879SBram Moolenaar noa set foldignore& " Reset global and local value (without triggering autocmd) 949d7c96879SBram Moolenaar let g:options = [['foldignore', oldval, oldval, '', 'baz', 'local', 'setlocal']] 950d7c96879SBram Moolenaar setlocal foldignore=baz 951d7c96879SBram Moolenaar call assert_equal([], g:options) 952d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 953d7c96879SBram Moolenaar 954d7c96879SBram Moolenaar " 22e: Setting again string local (to window) option" 955d7c96879SBram Moolenaar noa setglobal foldignore=glob " Reset global and local value (without triggering autocmd) 956d7c96879SBram Moolenaar noa setlocal foldignore=loc 957d7c96879SBram Moolenaar let g:options = [['foldignore', 'loc', 'loc', 'glob', 'fo', 'global', 'set']] 958d7c96879SBram Moolenaar set foldignore=fo 959d7c96879SBram Moolenaar call assert_equal([], g:options) 960d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 961d7c96879SBram Moolenaar 962d7c96879SBram Moolenaar 963b811de5dSzeertzjq " 23a: Setting global number global option" 964d7c96879SBram Moolenaar noa setglobal cmdheight=8 " Reset global and local value (without triggering autocmd) 965d7c96879SBram Moolenaar noa setlocal cmdheight=1 " Sets the global(!) value! 966d7c96879SBram Moolenaar let g:options = [['cmdheight', '1', '', '1', '2', 'global', 'setglobal']] 967d7c96879SBram Moolenaar setglobal cmdheight=2 968d7c96879SBram Moolenaar call assert_equal([], g:options) 969d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 970d7c96879SBram Moolenaar 971d7c96879SBram Moolenaar " 23b: Setting local number global option" 972d7c96879SBram Moolenaar noa setglobal cmdheight=8 " Reset global and local value (without triggering autocmd) 973d7c96879SBram Moolenaar noa setlocal cmdheight=1 " Sets the global(!) value! 974d7c96879SBram Moolenaar let g:options = [['cmdheight', '1', '1', '', '2', 'local', 'setlocal']] 975d7c96879SBram Moolenaar setlocal cmdheight=2 976d7c96879SBram Moolenaar call assert_equal([], g:options) 977d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 978d7c96879SBram Moolenaar 979d7c96879SBram Moolenaar " 23c: Setting again number global option" 980d7c96879SBram Moolenaar noa setglobal cmdheight=8 " Reset global and local value (without triggering autocmd) 981d7c96879SBram Moolenaar noa setlocal cmdheight=1 " Sets the global(!) value! 982d7c96879SBram Moolenaar let g:options = [['cmdheight', '1', '1', '1', '2', 'global', 'set']] 983d7c96879SBram Moolenaar set cmdheight=2 984d7c96879SBram Moolenaar call assert_equal([], g:options) 985d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 986d7c96879SBram Moolenaar 987d7c96879SBram Moolenaar " 23d: Setting again number global option" 988d7c96879SBram Moolenaar noa set cmdheight=8 " Reset global and local value (without triggering autocmd) 989d7c96879SBram Moolenaar let g:options = [['cmdheight', '8', '8', '8', '2', 'global', 'set']] 990d7c96879SBram Moolenaar set cmdheight=2 991d7c96879SBram Moolenaar call assert_equal([], g:options) 992d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 993d7c96879SBram Moolenaar 994d7c96879SBram Moolenaar 995d7c96879SBram Moolenaar " 24a: Setting global number global-local (to buffer) option" 996d7c96879SBram Moolenaar noa setglobal undolevels=8 " Reset global and local value (without triggering autocmd) 997d7c96879SBram Moolenaar noa setlocal undolevels=1 998d7c96879SBram Moolenaar let g:options = [['undolevels', '8', '', '8', '2', 'global', 'setglobal']] 999d7c96879SBram Moolenaar setglobal undolevels=2 1000d7c96879SBram Moolenaar call assert_equal([], g:options) 1001d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 1002d7c96879SBram Moolenaar 1003d7c96879SBram Moolenaar " 24b: Setting local number global-local (to buffer) option" 1004d7c96879SBram Moolenaar noa setglobal undolevels=8 " Reset global and local value (without triggering autocmd) 1005d7c96879SBram Moolenaar noa setlocal undolevels=1 1006d7c96879SBram Moolenaar let g:options = [['undolevels', '1', '1', '', '2', 'local', 'setlocal']] 1007d7c96879SBram Moolenaar setlocal undolevels=2 1008d7c96879SBram Moolenaar call assert_equal([], g:options) 1009d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 1010d7c96879SBram Moolenaar 1011d7c96879SBram Moolenaar " 24c: Setting again number global-local (to buffer) option" 1012d7c96879SBram Moolenaar noa setglobal undolevels=8 " Reset global and local value (without triggering autocmd) 1013d7c96879SBram Moolenaar noa setlocal undolevels=1 1014d7c96879SBram Moolenaar let g:options = [['undolevels', '1', '1', '8', '2', 'global', 'set']] 1015d7c96879SBram Moolenaar set undolevels=2 1016d7c96879SBram Moolenaar call assert_equal([], g:options) 1017d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 1018d7c96879SBram Moolenaar 1019d7c96879SBram Moolenaar " 24d: Setting again global number global-local (to buffer) option" 1020d7c96879SBram Moolenaar noa set undolevels=8 " Reset global and local value (without triggering autocmd) 1021d7c96879SBram Moolenaar let g:options = [['undolevels', '8', '8', '8', '2', 'global', 'set']] 1022d7c96879SBram Moolenaar set undolevels=2 1023d7c96879SBram Moolenaar call assert_equal([], g:options) 1024d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 1025d7c96879SBram Moolenaar 1026d7c96879SBram Moolenaar 1027d7c96879SBram Moolenaar " 25a: Setting global number local (to buffer) option" 1028d7c96879SBram Moolenaar noa setglobal wrapmargin=8 " Reset global and local value (without triggering autocmd) 1029d7c96879SBram Moolenaar noa setlocal wrapmargin=1 1030d7c96879SBram Moolenaar let g:options = [['wrapmargin', '8', '', '8', '2', 'global', 'setglobal']] 1031d7c96879SBram Moolenaar setglobal wrapmargin=2 1032d7c96879SBram Moolenaar call assert_equal([], g:options) 1033d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 1034d7c96879SBram Moolenaar 1035d7c96879SBram Moolenaar " 25b: Setting local number local (to buffer) option" 1036d7c96879SBram Moolenaar noa setglobal wrapmargin=8 " Reset global and local value (without triggering autocmd) 1037d7c96879SBram Moolenaar noa setlocal wrapmargin=1 1038d7c96879SBram Moolenaar let g:options = [['wrapmargin', '1', '1', '', '2', 'local', 'setlocal']] 1039d7c96879SBram Moolenaar setlocal wrapmargin=2 1040d7c96879SBram Moolenaar call assert_equal([], g:options) 1041d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 1042d7c96879SBram Moolenaar 1043d7c96879SBram Moolenaar " 25c: Setting again number local (to buffer) option" 1044d7c96879SBram Moolenaar noa setglobal wrapmargin=8 " Reset global and local value (without triggering autocmd) 1045d7c96879SBram Moolenaar noa setlocal wrapmargin=1 1046d7c96879SBram Moolenaar let g:options = [['wrapmargin', '1', '1', '8', '2', 'global', 'set']] 1047d7c96879SBram Moolenaar set wrapmargin=2 1048d7c96879SBram Moolenaar call assert_equal([], g:options) 1049d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 1050d7c96879SBram Moolenaar 1051d7c96879SBram Moolenaar " 25d: Setting again global number local (to buffer) option" 1052d7c96879SBram Moolenaar noa set wrapmargin=8 " Reset global and local value (without triggering autocmd) 1053d7c96879SBram Moolenaar let g:options = [['wrapmargin', '8', '8', '8', '2', 'global', 'set']] 1054d7c96879SBram Moolenaar set wrapmargin=2 1055d7c96879SBram Moolenaar call assert_equal([], g:options) 1056d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 1057d7c96879SBram Moolenaar 1058d7c96879SBram Moolenaar 1059d7c96879SBram Moolenaar " 26: Setting number global-local (to window) option. 1060d7c96879SBram Moolenaar " Such option does currently not exist. 1061d7c96879SBram Moolenaar 1062d7c96879SBram Moolenaar 1063d7c96879SBram Moolenaar " 27a: Setting global number local (to window) option" 1064d7c96879SBram Moolenaar noa setglobal foldcolumn=8 " Reset global and local value (without triggering autocmd) 1065d7c96879SBram Moolenaar noa setlocal foldcolumn=1 1066d7c96879SBram Moolenaar let g:options = [['foldcolumn', '8', '', '8', '2', 'global', 'setglobal']] 1067d7c96879SBram Moolenaar setglobal foldcolumn=2 1068d7c96879SBram Moolenaar call assert_equal([], g:options) 1069d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 1070d7c96879SBram Moolenaar 1071d7c96879SBram Moolenaar " 27b: Setting local number local (to window) option" 1072d7c96879SBram Moolenaar noa setglobal foldcolumn=8 " Reset global and local value (without triggering autocmd) 1073d7c96879SBram Moolenaar noa setlocal foldcolumn=1 1074d7c96879SBram Moolenaar let g:options = [['foldcolumn', '1', '1', '', '2', 'local', 'setlocal']] 1075d7c96879SBram Moolenaar setlocal foldcolumn=2 1076d7c96879SBram Moolenaar call assert_equal([], g:options) 1077d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 1078d7c96879SBram Moolenaar 1079d7c96879SBram Moolenaar " 27c: Setting again number local (to window) option" 1080d7c96879SBram Moolenaar noa setglobal foldcolumn=8 " Reset global and local value (without triggering autocmd) 1081d7c96879SBram Moolenaar noa setlocal foldcolumn=1 1082d7c96879SBram Moolenaar let g:options = [['foldcolumn', '1', '1', '8', '2', 'global', 'set']] 1083d7c96879SBram Moolenaar set foldcolumn=2 1084d7c96879SBram Moolenaar call assert_equal([], g:options) 1085d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 1086d7c96879SBram Moolenaar 1087b811de5dSzeertzjq " 27d: Setting again global number local (to window) option" 1088d7c96879SBram Moolenaar noa set foldcolumn=8 " Reset global and local value (without triggering autocmd) 1089d7c96879SBram Moolenaar let g:options = [['foldcolumn', '8', '8', '8', '2', 'global', 'set']] 1090d7c96879SBram Moolenaar set foldcolumn=2 1091d7c96879SBram Moolenaar call assert_equal([], g:options) 1092d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 1093d7c96879SBram Moolenaar 1094d7c96879SBram Moolenaar 1095d7c96879SBram Moolenaar " 28a: Setting global boolean global option" 1096d7c96879SBram Moolenaar noa setglobal nowrapscan " Reset global and local value (without triggering autocmd) 1097d7c96879SBram Moolenaar noa setlocal wrapscan " Sets the global(!) value! 1098d7c96879SBram Moolenaar let g:options = [['wrapscan', '1', '', '1', '0', 'global', 'setglobal']] 1099d7c96879SBram Moolenaar setglobal nowrapscan 1100d7c96879SBram Moolenaar call assert_equal([], g:options) 1101d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 1102d7c96879SBram Moolenaar 1103d7c96879SBram Moolenaar " 28b: Setting local boolean global option" 1104d7c96879SBram Moolenaar noa setglobal nowrapscan " Reset global and local value (without triggering autocmd) 1105d7c96879SBram Moolenaar noa setlocal wrapscan " Sets the global(!) value! 1106d7c96879SBram Moolenaar let g:options = [['wrapscan', '1', '1', '', '0', 'local', 'setlocal']] 1107d7c96879SBram Moolenaar setlocal nowrapscan 1108d7c96879SBram Moolenaar call assert_equal([], g:options) 1109d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 1110d7c96879SBram Moolenaar 1111d7c96879SBram Moolenaar " 28c: Setting again boolean global option" 1112d7c96879SBram Moolenaar noa setglobal nowrapscan " Reset global and local value (without triggering autocmd) 1113d7c96879SBram Moolenaar noa setlocal wrapscan " Sets the global(!) value! 1114d7c96879SBram Moolenaar let g:options = [['wrapscan', '1', '1', '1', '0', 'global', 'set']] 1115d7c96879SBram Moolenaar set nowrapscan 1116d7c96879SBram Moolenaar call assert_equal([], g:options) 1117d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 1118d7c96879SBram Moolenaar 1119d7c96879SBram Moolenaar " 28d: Setting again global boolean global option" 1120d7c96879SBram Moolenaar noa set nowrapscan " Reset global and local value (without triggering autocmd) 1121d7c96879SBram Moolenaar let g:options = [['wrapscan', '0', '0', '0', '1', 'global', 'set']] 1122d7c96879SBram Moolenaar set wrapscan 1123d7c96879SBram Moolenaar call assert_equal([], g:options) 1124d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 1125d7c96879SBram Moolenaar 1126d7c96879SBram Moolenaar 1127d7c96879SBram Moolenaar " 29a: Setting global boolean global-local (to buffer) option" 1128d7c96879SBram Moolenaar noa setglobal noautoread " Reset global and local value (without triggering autocmd) 1129d7c96879SBram Moolenaar noa setlocal autoread 1130d7c96879SBram Moolenaar let g:options = [['autoread', '0', '', '0', '1', 'global', 'setglobal']] 1131d7c96879SBram Moolenaar setglobal autoread 1132d7c96879SBram Moolenaar call assert_equal([], g:options) 1133d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 1134d7c96879SBram Moolenaar 1135d7c96879SBram Moolenaar " 29b: Setting local boolean global-local (to buffer) option" 1136d7c96879SBram Moolenaar noa setglobal noautoread " Reset global and local value (without triggering autocmd) 1137d7c96879SBram Moolenaar noa setlocal autoread 1138d7c96879SBram Moolenaar let g:options = [['autoread', '1', '1', '', '0', 'local', 'setlocal']] 1139d7c96879SBram Moolenaar setlocal noautoread 1140d7c96879SBram Moolenaar call assert_equal([], g:options) 1141d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 1142d7c96879SBram Moolenaar 1143d7c96879SBram Moolenaar " 29c: Setting again boolean global-local (to buffer) option" 1144d7c96879SBram Moolenaar noa setglobal noautoread " Reset global and local value (without triggering autocmd) 1145d7c96879SBram Moolenaar noa setlocal autoread 1146d7c96879SBram Moolenaar let g:options = [['autoread', '1', '1', '0', '1', 'global', 'set']] 1147d7c96879SBram Moolenaar set autoread 1148d7c96879SBram Moolenaar call assert_equal([], g:options) 1149d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 1150d7c96879SBram Moolenaar 1151d7c96879SBram Moolenaar " 29d: Setting again global boolean global-local (to buffer) option" 1152d7c96879SBram Moolenaar noa set noautoread " Reset global and local value (without triggering autocmd) 1153d7c96879SBram Moolenaar let g:options = [['autoread', '0', '0', '0', '1', 'global', 'set']] 1154d7c96879SBram Moolenaar set autoread 1155d7c96879SBram Moolenaar call assert_equal([], g:options) 1156d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 1157d7c96879SBram Moolenaar 1158d7c96879SBram Moolenaar 1159d7c96879SBram Moolenaar " 30a: Setting global boolean local (to buffer) option" 1160d7c96879SBram Moolenaar noa setglobal nocindent " Reset global and local value (without triggering autocmd) 1161d7c96879SBram Moolenaar noa setlocal cindent 1162d7c96879SBram Moolenaar let g:options = [['cindent', '0', '', '0', '1', 'global', 'setglobal']] 1163d7c96879SBram Moolenaar setglobal cindent 1164d7c96879SBram Moolenaar call assert_equal([], g:options) 1165d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 1166d7c96879SBram Moolenaar 1167d7c96879SBram Moolenaar " 30b: Setting local boolean local (to buffer) option" 1168d7c96879SBram Moolenaar noa setglobal nocindent " Reset global and local value (without triggering autocmd) 1169d7c96879SBram Moolenaar noa setlocal cindent 1170d7c96879SBram Moolenaar let g:options = [['cindent', '1', '1', '', '0', 'local', 'setlocal']] 1171d7c96879SBram Moolenaar setlocal nocindent 1172d7c96879SBram Moolenaar call assert_equal([], g:options) 1173d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 1174d7c96879SBram Moolenaar 1175d7c96879SBram Moolenaar " 30c: Setting again boolean local (to buffer) option" 1176d7c96879SBram Moolenaar noa setglobal nocindent " Reset global and local value (without triggering autocmd) 1177d7c96879SBram Moolenaar noa setlocal cindent 1178d7c96879SBram Moolenaar let g:options = [['cindent', '1', '1', '0', '1', 'global', 'set']] 1179d7c96879SBram Moolenaar set cindent 1180d7c96879SBram Moolenaar call assert_equal([], g:options) 1181d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 1182d7c96879SBram Moolenaar 1183d7c96879SBram Moolenaar " 30d: Setting again global boolean local (to buffer) option" 1184d7c96879SBram Moolenaar noa set nocindent " Reset global and local value (without triggering autocmd) 1185d7c96879SBram Moolenaar let g:options = [['cindent', '0', '0', '0', '1', 'global', 'set']] 1186d7c96879SBram Moolenaar set cindent 1187d7c96879SBram Moolenaar call assert_equal([], g:options) 1188d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 1189d7c96879SBram Moolenaar 1190d7c96879SBram Moolenaar 1191d7c96879SBram Moolenaar " 31: Setting boolean global-local (to window) option 1192d7c96879SBram Moolenaar " Currently no such option exists. 1193d7c96879SBram Moolenaar 1194d7c96879SBram Moolenaar 1195d7c96879SBram Moolenaar " 32a: Setting global boolean local (to window) option" 1196d7c96879SBram Moolenaar noa setglobal nocursorcolumn " Reset global and local value (without triggering autocmd) 1197d7c96879SBram Moolenaar noa setlocal cursorcolumn 1198d7c96879SBram Moolenaar let g:options = [['cursorcolumn', '0', '', '0', '1', 'global', 'setglobal']] 1199d7c96879SBram Moolenaar setglobal cursorcolumn 1200d7c96879SBram Moolenaar call assert_equal([], g:options) 1201d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 1202d7c96879SBram Moolenaar 1203d7c96879SBram Moolenaar " 32b: Setting local boolean local (to window) option" 1204d7c96879SBram Moolenaar noa setglobal nocursorcolumn " Reset global and local value (without triggering autocmd) 1205d7c96879SBram Moolenaar noa setlocal cursorcolumn 1206d7c96879SBram Moolenaar let g:options = [['cursorcolumn', '1', '1', '', '0', 'local', 'setlocal']] 1207d7c96879SBram Moolenaar setlocal nocursorcolumn 1208d7c96879SBram Moolenaar call assert_equal([], g:options) 1209d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 1210d7c96879SBram Moolenaar 1211d7c96879SBram Moolenaar " 32c: Setting again boolean local (to window) option" 1212d7c96879SBram Moolenaar noa setglobal nocursorcolumn " Reset global and local value (without triggering autocmd) 1213d7c96879SBram Moolenaar noa setlocal cursorcolumn 1214d7c96879SBram Moolenaar let g:options = [['cursorcolumn', '1', '1', '0', '1', 'global', 'set']] 1215d7c96879SBram Moolenaar set cursorcolumn 1216d7c96879SBram Moolenaar call assert_equal([], g:options) 1217d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 1218d7c96879SBram Moolenaar 1219d7c96879SBram Moolenaar " 32d: Setting again global boolean local (to window) option" 1220d7c96879SBram Moolenaar noa set nocursorcolumn " Reset global and local value (without triggering autocmd) 1221d7c96879SBram Moolenaar let g:options = [['cursorcolumn', '0', '0', '0', '1', 'global', 'set']] 1222d7c96879SBram Moolenaar set cursorcolumn 1223d7c96879SBram Moolenaar call assert_equal([], g:options) 1224d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 1225d7c96879SBram Moolenaar 1226d7c96879SBram Moolenaar 12271bc353b6SBram Moolenaar " 33: Test autocommands when an option value is converted internally. 1228d7c96879SBram Moolenaar noa set backspace=1 " Reset global and local value (without triggering autocmd) 1229d7c96879SBram Moolenaar let g:options = [['backspace', 'indent,eol', 'indent,eol', 'indent,eol', '2', 'global', 'set']] 1230d7c96879SBram Moolenaar set backspace=2 1231d7c96879SBram Moolenaar call assert_equal([], g:options) 1232d7c96879SBram Moolenaar call assert_equal(g:opt[0], g:opt[1]) 1233d7c96879SBram Moolenaar 1234d7c96879SBram Moolenaar 123504f62f88SBram Moolenaar " Cleanup 123604f62f88SBram Moolenaar au! OptionSet 12370331faf7SBram Moolenaar " set tags& 1238d7c96879SBram Moolenaar for opt in ['nu', 'ai', 'acd', 'ar', 'bs', 'backup', 'cul', 'cp', 'backupext', 'tags', 'spelllang', 'statusline', 'foldignore', 'cmdheight', 'undolevels', 'wrapmargin', 'foldcolumn', 'wrapscan', 'autoread', 'cindent', 'cursorcolumn'] 123991d2e783SBram Moolenaar exe printf(":set %s&vim", opt) 124004f62f88SBram Moolenaar endfor 124104f62f88SBram Moolenaar call test_override('starting', 0) 124204f62f88SBram Moolenaar delfunc! AutoCommandOptionSet 124304f62f88SBram Moolenaarendfunc 124404f62f88SBram Moolenaar 124504f62f88SBram Moolenaarfunc Test_OptionSet_diffmode() 124604f62f88SBram Moolenaar call test_override('starting', 1) 124726d98218SBram Moolenaar " 18: Changing an option when entering diff mode 124804f62f88SBram Moolenaar new 124904f62f88SBram Moolenaar au OptionSet diff :let &l:cul = v:option_new 125004f62f88SBram Moolenaar 125104f62f88SBram Moolenaar call setline(1, ['buffer 1', 'line2', 'line3', 'line4']) 125204f62f88SBram Moolenaar call assert_equal(0, &l:cul) 125304f62f88SBram Moolenaar diffthis 125404f62f88SBram Moolenaar call assert_equal(1, &l:cul) 125504f62f88SBram Moolenaar 125604f62f88SBram Moolenaar vnew 125704f62f88SBram Moolenaar call setline(1, ['buffer 2', 'line 2', 'line 3', 'line4']) 125804f62f88SBram Moolenaar call assert_equal(0, &l:cul) 125904f62f88SBram Moolenaar diffthis 126004f62f88SBram Moolenaar call assert_equal(1, &l:cul) 126104f62f88SBram Moolenaar 126204f62f88SBram Moolenaar diffoff 126304f62f88SBram Moolenaar call assert_equal(0, &l:cul) 126404f62f88SBram Moolenaar call assert_equal(1, getwinvar(2, '&l:cul')) 126504f62f88SBram Moolenaar bw! 126604f62f88SBram Moolenaar 126704f62f88SBram Moolenaar call assert_equal(1, &l:cul) 126804f62f88SBram Moolenaar diffoff! 126904f62f88SBram Moolenaar call assert_equal(0, &l:cul) 127004f62f88SBram Moolenaar call assert_equal(0, getwinvar(1, '&l:cul')) 127104f62f88SBram Moolenaar bw! 127204f62f88SBram Moolenaar 127304f62f88SBram Moolenaar " Cleanup 127404f62f88SBram Moolenaar au! OptionSet 127504f62f88SBram Moolenaar call test_override('starting', 0) 127604f62f88SBram Moolenaarendfunc 127704f62f88SBram Moolenaar 127804f62f88SBram Moolenaarfunc Test_OptionSet_diffmode_close() 127904f62f88SBram Moolenaar call test_override('starting', 1) 128004f62f88SBram Moolenaar " 19: Try to close the current window when entering diff mode 128104f62f88SBram Moolenaar " should not segfault 128204f62f88SBram Moolenaar new 128304f62f88SBram Moolenaar au OptionSet diff close 128404f62f88SBram Moolenaar 128504f62f88SBram Moolenaar call setline(1, ['buffer 1', 'line2', 'line3', 'line4']) 1286e2e4075fSBram Moolenaar call assert_fails(':diffthis', 'E788:') 128704f62f88SBram Moolenaar call assert_equal(1, &diff) 128804f62f88SBram Moolenaar vnew 128904f62f88SBram Moolenaar call setline(1, ['buffer 2', 'line 2', 'line 3', 'line4']) 1290e2e4075fSBram Moolenaar call assert_fails(':diffthis', 'E788:') 129104f62f88SBram Moolenaar call assert_equal(1, &diff) 1292a9aa86ffSBram Moolenaar set diffopt-=closeoff 129304f62f88SBram Moolenaar bw! 1294e2e4075fSBram Moolenaar call assert_fails(':diffoff!', 'E788:') 129504f62f88SBram Moolenaar bw! 129604f62f88SBram Moolenaar 129704f62f88SBram Moolenaar " Cleanup 129804f62f88SBram Moolenaar au! OptionSet 129904f62f88SBram Moolenaar call test_override('starting', 0) 130004f62f88SBram Moolenaar "delfunc! AutoCommandOptionSet 130104f62f88SBram Moolenaarendfunc 13024a137b45SBram Moolenaar 13034a137b45SBram Moolenaar" Test for Bufleave autocommand that deletes the buffer we are about to edit. 13044a137b45SBram Moolenaarfunc Test_BufleaveWithDelete() 13054a137b45SBram Moolenaar new | edit Xfile1 13064a137b45SBram Moolenaar 13074a137b45SBram Moolenaar augroup test_bufleavewithdelete 13084a137b45SBram Moolenaar autocmd! 13094a137b45SBram Moolenaar autocmd BufLeave Xfile1 bwipe Xfile2 13104a137b45SBram Moolenaar augroup END 13114a137b45SBram Moolenaar 13124a137b45SBram Moolenaar call assert_fails('edit Xfile2', 'E143:') 13134a137b45SBram Moolenaar call assert_equal('Xfile1', bufname('%')) 13144a137b45SBram Moolenaar 13154a137b45SBram Moolenaar autocmd! test_bufleavewithdelete BufLeave Xfile1 13164a137b45SBram Moolenaar augroup! test_bufleavewithdelete 13174a137b45SBram Moolenaar 13184a137b45SBram Moolenaar new 13194a137b45SBram Moolenaar bwipe! Xfile1 13204a137b45SBram Moolenaarendfunc 13214a6fcf80SBram Moolenaar 13224a6fcf80SBram Moolenaar" Test for autocommand that changes the buffer list, when doing ":ball". 13234a6fcf80SBram Moolenaarfunc Test_Acmd_BufAll() 13244a6fcf80SBram Moolenaar enew! 13254a6fcf80SBram Moolenaar %bwipe! 13264a6fcf80SBram Moolenaar call writefile(['Test file Xxx1'], 'Xxx1') 13274a6fcf80SBram Moolenaar call writefile(['Test file Xxx2'], 'Xxx2') 13284a6fcf80SBram Moolenaar call writefile(['Test file Xxx3'], 'Xxx3') 13294a6fcf80SBram Moolenaar 13304a6fcf80SBram Moolenaar " Add three files to the buffer list 13314a6fcf80SBram Moolenaar split Xxx1 13324a6fcf80SBram Moolenaar close 13334a6fcf80SBram Moolenaar split Xxx2 13344a6fcf80SBram Moolenaar close 13354a6fcf80SBram Moolenaar split Xxx3 13364a6fcf80SBram Moolenaar close 13374a6fcf80SBram Moolenaar 13384a6fcf80SBram Moolenaar " Wipe the buffer when the buffer is opened 13394a6fcf80SBram Moolenaar au BufReadPost Xxx2 bwipe 13404a6fcf80SBram Moolenaar 13414a6fcf80SBram Moolenaar call append(0, 'Test file Xxx4') 13424a6fcf80SBram Moolenaar ball 13434a6fcf80SBram Moolenaar 13444a6fcf80SBram Moolenaar call assert_equal(2, winnr('$')) 13454a6fcf80SBram Moolenaar call assert_equal('Xxx1', bufname(winbufnr(winnr('$')))) 13464a6fcf80SBram Moolenaar wincmd t 13474a6fcf80SBram Moolenaar 13484a6fcf80SBram Moolenaar au! BufReadPost 13494a6fcf80SBram Moolenaar %bwipe! 13504a6fcf80SBram Moolenaar call delete('Xxx1') 13514a6fcf80SBram Moolenaar call delete('Xxx2') 13524a6fcf80SBram Moolenaar call delete('Xxx3') 13534a6fcf80SBram Moolenaar enew! | only 13544a6fcf80SBram Moolenaarendfunc 13554a6fcf80SBram Moolenaar 13564a6fcf80SBram Moolenaar" Test for autocommand that changes current buffer on BufEnter event. 13574a6fcf80SBram Moolenaar" Check if modelines are interpreted for the correct buffer. 13584a6fcf80SBram Moolenaarfunc Test_Acmd_BufEnter() 13594a6fcf80SBram Moolenaar %bwipe! 13604a6fcf80SBram Moolenaar call writefile(['start of test file Xxx1', 13614a6fcf80SBram Moolenaar \ "\<Tab>this is a test", 13624a6fcf80SBram Moolenaar \ 'end of test file Xxx1'], 'Xxx1') 13634a6fcf80SBram Moolenaar call writefile(['start of test file Xxx2', 13644a6fcf80SBram Moolenaar \ 'vim: set noai :', 13654a6fcf80SBram Moolenaar \ "\<Tab>this is a test", 13664a6fcf80SBram Moolenaar \ 'end of test file Xxx2'], 'Xxx2') 13674a6fcf80SBram Moolenaar 13684a6fcf80SBram Moolenaar au BufEnter Xxx2 brew 13694a6fcf80SBram Moolenaar set ai modeline modelines=3 13704a6fcf80SBram Moolenaar edit Xxx1 13714a6fcf80SBram Moolenaar " edit Xxx2, autocmd will do :brew 13724a6fcf80SBram Moolenaar edit Xxx2 13734a6fcf80SBram Moolenaar exe "normal G?this is a\<CR>" 13744a6fcf80SBram Moolenaar " Append text with autoindent to this file 13754a6fcf80SBram Moolenaar normal othis should be auto-indented 13764a6fcf80SBram Moolenaar call assert_equal("\<Tab>this should be auto-indented", getline('.')) 13774a6fcf80SBram Moolenaar call assert_equal(3, line('.')) 13784a6fcf80SBram Moolenaar " Remove autocmd and edit Xxx2 again 13794a6fcf80SBram Moolenaar au! BufEnter Xxx2 13804a6fcf80SBram Moolenaar buf! Xxx2 13814a6fcf80SBram Moolenaar exe "normal G?this is a\<CR>" 13824a6fcf80SBram Moolenaar " append text without autoindent to Xxx 13834a6fcf80SBram Moolenaar normal othis should be in column 1 13844a6fcf80SBram Moolenaar call assert_equal("this should be in column 1", getline('.')) 13854a6fcf80SBram Moolenaar call assert_equal(4, line('.')) 13864a6fcf80SBram Moolenaar 13874a6fcf80SBram Moolenaar %bwipe! 13884a6fcf80SBram Moolenaar call delete('Xxx1') 13894a6fcf80SBram Moolenaar call delete('Xxx2') 13904a6fcf80SBram Moolenaar set ai&vim modeline&vim modelines&vim 13914a6fcf80SBram Moolenaarendfunc 13924a6fcf80SBram Moolenaar 13934a6fcf80SBram Moolenaar" Test for issue #57 13944a6fcf80SBram Moolenaar" do not move cursor on <c-o> when autoindent is set 13954a6fcf80SBram Moolenaarfunc Test_ai_CTRL_O() 13964a6fcf80SBram Moolenaar enew! 13974a6fcf80SBram Moolenaar set ai 13984a6fcf80SBram Moolenaar let save_fo = &fo 13994a6fcf80SBram Moolenaar set fo+=r 14004a6fcf80SBram Moolenaar exe "normal o# abcdef\<Esc>2hi\<CR>\<C-O>d0\<Esc>" 14014a6fcf80SBram Moolenaar exe "normal o# abcdef\<Esc>2hi\<C-O>d0\<Esc>" 14024a6fcf80SBram Moolenaar call assert_equal(['# abc', 'def', 'def'], getline(2, 4)) 14034a6fcf80SBram Moolenaar 14044a6fcf80SBram Moolenaar set ai&vim 14054a6fcf80SBram Moolenaar let &fo = save_fo 14064a6fcf80SBram Moolenaar enew! 14074a6fcf80SBram Moolenaarendfunc 14084a6fcf80SBram Moolenaar 14094a6fcf80SBram Moolenaar" Test for autocommand that deletes the current buffer on BufLeave event. 14104a6fcf80SBram Moolenaar" Also test deleting the last buffer, should give a new, empty buffer. 14114a6fcf80SBram Moolenaarfunc Test_BufLeave_Wipe() 14124a6fcf80SBram Moolenaar %bwipe! 14134a6fcf80SBram Moolenaar let content = ['start of test file Xxx', 14144a6fcf80SBram Moolenaar \ 'this is a test', 14154a6fcf80SBram Moolenaar \ 'end of test file Xxx'] 14164a6fcf80SBram Moolenaar call writefile(content, 'Xxx1') 14174a6fcf80SBram Moolenaar call writefile(content, 'Xxx2') 14184a6fcf80SBram Moolenaar 14194a6fcf80SBram Moolenaar au BufLeave Xxx2 bwipe 14204a6fcf80SBram Moolenaar edit Xxx1 14214a6fcf80SBram Moolenaar split Xxx2 14224a6fcf80SBram Moolenaar " delete buffer Xxx2, we should be back to Xxx1 14234a6fcf80SBram Moolenaar bwipe 14244a6fcf80SBram Moolenaar call assert_equal('Xxx1', bufname('%')) 14254a6fcf80SBram Moolenaar call assert_equal(1, winnr('$')) 14264a6fcf80SBram Moolenaar 14274a6fcf80SBram Moolenaar " Create an alternate buffer 14284a6fcf80SBram Moolenaar %write! test.out 14294a6fcf80SBram Moolenaar call assert_equal('test.out', bufname('#')) 14304a6fcf80SBram Moolenaar " delete alternate buffer 14314a6fcf80SBram Moolenaar bwipe test.out 14324a6fcf80SBram Moolenaar call assert_equal('Xxx1', bufname('%')) 14334a6fcf80SBram Moolenaar call assert_equal('', bufname('#')) 14344a6fcf80SBram Moolenaar 14354a6fcf80SBram Moolenaar au BufLeave Xxx1 bwipe 14364a6fcf80SBram Moolenaar " delete current buffer, get an empty one 14374a6fcf80SBram Moolenaar bwipe! 14384a6fcf80SBram Moolenaar call assert_equal(1, line('$')) 14394a6fcf80SBram Moolenaar call assert_equal('', bufname('%')) 1440b2c8750cSBram Moolenaar let g:bufinfo = getbufinfo() 1441b2c8750cSBram Moolenaar call assert_equal(1, len(g:bufinfo)) 14424a6fcf80SBram Moolenaar 14434a6fcf80SBram Moolenaar call delete('Xxx1') 14444a6fcf80SBram Moolenaar call delete('Xxx2') 144553f0c962SBram Moolenaar call delete('test.out') 14464a6fcf80SBram Moolenaar %bwipe 14474a6fcf80SBram Moolenaar au! BufLeave 1448b2c8750cSBram Moolenaar 1449b2c8750cSBram Moolenaar " check that bufinfo doesn't contain a pointer to freed memory 1450b2c8750cSBram Moolenaar call test_garbagecollect_now() 14514a6fcf80SBram Moolenaarendfunc 145287ffb5c1SBram Moolenaar 145387ffb5c1SBram Moolenaarfunc Test_QuitPre() 145487ffb5c1SBram Moolenaar edit Xfoo 145587ffb5c1SBram Moolenaar let winid = win_getid(winnr()) 145687ffb5c1SBram Moolenaar split Xbar 145787ffb5c1SBram Moolenaar au! QuitPre * let g:afile = expand('<afile>') 145887ffb5c1SBram Moolenaar " Close the other window, <afile> should be correct. 145987ffb5c1SBram Moolenaar exe win_id2win(winid) . 'q' 146087ffb5c1SBram Moolenaar call assert_equal('Xfoo', g:afile) 146187ffb5c1SBram Moolenaar 146287ffb5c1SBram Moolenaar unlet g:afile 146387ffb5c1SBram Moolenaar bwipe Xfoo 146487ffb5c1SBram Moolenaar bwipe Xbar 146587ffb5c1SBram Moolenaarendfunc 1466fafcf0ddSBram Moolenaar 1467fafcf0ddSBram Moolenaarfunc Test_Cmdline() 1468153b704eSBram Moolenaar au! CmdlineChanged : let g:text = getcmdline() 1469153b704eSBram Moolenaar let g:text = 0 1470153b704eSBram Moolenaar call feedkeys(":echom 'hello'\<CR>", 'xt') 1471153b704eSBram Moolenaar call assert_equal("echom 'hello'", g:text) 1472153b704eSBram Moolenaar au! CmdlineChanged 1473153b704eSBram Moolenaar 1474153b704eSBram Moolenaar au! CmdlineChanged : let g:entered = expand('<afile>') 1475153b704eSBram Moolenaar let g:entered = 0 1476153b704eSBram Moolenaar call feedkeys(":echom 'hello'\<CR>", 'xt') 1477153b704eSBram Moolenaar call assert_equal(':', g:entered) 1478153b704eSBram Moolenaar au! CmdlineChanged 1479153b704eSBram Moolenaar 1480fafcf0ddSBram Moolenaar au! CmdlineEnter : let g:entered = expand('<afile>') 1481fafcf0ddSBram Moolenaar au! CmdlineLeave : let g:left = expand('<afile>') 1482fafcf0ddSBram Moolenaar let g:entered = 0 1483fafcf0ddSBram Moolenaar let g:left = 0 1484fafcf0ddSBram Moolenaar call feedkeys(":echo 'hello'\<CR>", 'xt') 1485fafcf0ddSBram Moolenaar call assert_equal(':', g:entered) 1486fafcf0ddSBram Moolenaar call assert_equal(':', g:left) 1487fafcf0ddSBram Moolenaar au! CmdlineEnter 1488fafcf0ddSBram Moolenaar au! CmdlineLeave 1489fafcf0ddSBram Moolenaar 1490a4baf5b3SBram Moolenaar let save_shellslash = &shellslash 1491a4baf5b3SBram Moolenaar set noshellslash 1492fafcf0ddSBram Moolenaar au! CmdlineEnter / let g:entered = expand('<afile>') 1493fafcf0ddSBram Moolenaar au! CmdlineLeave / let g:left = expand('<afile>') 1494fafcf0ddSBram Moolenaar let g:entered = 0 1495fafcf0ddSBram Moolenaar let g:left = 0 149653f0c962SBram Moolenaar new 149753f0c962SBram Moolenaar call setline(1, 'hello') 149853f0c962SBram Moolenaar call feedkeys("/hello\<CR>", 'xt') 1499fafcf0ddSBram Moolenaar call assert_equal('/', g:entered) 1500fafcf0ddSBram Moolenaar call assert_equal('/', g:left) 150153f0c962SBram Moolenaar bwipe! 1502fafcf0ddSBram Moolenaar au! CmdlineEnter 1503fafcf0ddSBram Moolenaar au! CmdlineLeave 1504a4baf5b3SBram Moolenaar let &shellslash = save_shellslash 1505fafcf0ddSBram Moolenaarendfunc 150653f0c962SBram Moolenaar 150753f0c962SBram Moolenaar" Test for BufWritePre autocommand that deletes or unloads the buffer. 150853f0c962SBram Moolenaarfunc Test_BufWritePre() 150953f0c962SBram Moolenaar %bwipe 151053f0c962SBram Moolenaar au BufWritePre Xxx1 bunload 151153f0c962SBram Moolenaar au BufWritePre Xxx2 bwipe 151253f0c962SBram Moolenaar 151353f0c962SBram Moolenaar call writefile(['start of Xxx1', 'test', 'end of Xxx1'], 'Xxx1') 151453f0c962SBram Moolenaar call writefile(['start of Xxx2', 'test', 'end of Xxx2'], 'Xxx2') 151553f0c962SBram Moolenaar 151653f0c962SBram Moolenaar edit Xtest 151753f0c962SBram Moolenaar e! Xxx2 151853f0c962SBram Moolenaar bdel Xtest 151953f0c962SBram Moolenaar e Xxx1 152053f0c962SBram Moolenaar " write it, will unload it and give an error msg 1521e2e4075fSBram Moolenaar call assert_fails('w', 'E203:') 152253f0c962SBram Moolenaar call assert_equal('Xxx2', bufname('%')) 152353f0c962SBram Moolenaar edit Xtest 152453f0c962SBram Moolenaar e! Xxx2 152553f0c962SBram Moolenaar bwipe Xtest 152653f0c962SBram Moolenaar " write it, will delete the buffer and give an error msg 1527e2e4075fSBram Moolenaar call assert_fails('w', 'E203:') 152853f0c962SBram Moolenaar call assert_equal('Xxx1', bufname('%')) 152953f0c962SBram Moolenaar au! BufWritePre 153053f0c962SBram Moolenaar call delete('Xxx1') 153153f0c962SBram Moolenaar call delete('Xxx2') 153253f0c962SBram Moolenaarendfunc 153353f0c962SBram Moolenaar 153453f0c962SBram Moolenaar" Test for BufUnload autocommand that unloads all the other buffers 153553f0c962SBram Moolenaarfunc Test_bufunload_all() 1536f08b0eb8SBram Moolenaar let g:test_is_flaky = 1 153753f0c962SBram Moolenaar call writefile(['Test file Xxx1'], 'Xxx1')" 153853f0c962SBram Moolenaar call writefile(['Test file Xxx2'], 'Xxx2')" 153953f0c962SBram Moolenaar 1540c79745a8SBram Moolenaar let content =<< trim [CODE] 1541c79745a8SBram Moolenaar func UnloadAllBufs() 1542c79745a8SBram Moolenaar let i = 1 1543c79745a8SBram Moolenaar while i <= bufnr('$') 1544c79745a8SBram Moolenaar if i != bufnr('%') && bufloaded(i) 1545c79745a8SBram Moolenaar exe i . 'bunload' 1546c79745a8SBram Moolenaar endif 1547c79745a8SBram Moolenaar let i += 1 1548c79745a8SBram Moolenaar endwhile 1549c79745a8SBram Moolenaar endfunc 1550c79745a8SBram Moolenaar au BufUnload * call UnloadAllBufs() 1551c79745a8SBram Moolenaar au VimLeave * call writefile(['Test Finished'], 'Xout') 1552c79745a8SBram Moolenaar edit Xxx1 1553c79745a8SBram Moolenaar split Xxx2 1554c79745a8SBram Moolenaar q 1555c79745a8SBram Moolenaar [CODE] 1556c79745a8SBram Moolenaar 155753f0c962SBram Moolenaar call writefile(content, 'Xtest') 155853f0c962SBram Moolenaar 155953f0c962SBram Moolenaar call delete('Xout') 156093344c2dSBram Moolenaar call system(GetVimCommandClean() .. ' -N --not-a-term -S Xtest') 156153f0c962SBram Moolenaar call assert_true(filereadable('Xout')) 156253f0c962SBram Moolenaar 156353f0c962SBram Moolenaar call delete('Xxx1') 156453f0c962SBram Moolenaar call delete('Xxx2') 156553f0c962SBram Moolenaar call delete('Xtest') 156653f0c962SBram Moolenaar call delete('Xout') 156753f0c962SBram Moolenaarendfunc 156853f0c962SBram Moolenaar 156953f0c962SBram Moolenaar" Some tests for buffer-local autocommands 157053f0c962SBram Moolenaarfunc Test_buflocal_autocmd() 157153f0c962SBram Moolenaar let g:bname = '' 157253f0c962SBram Moolenaar edit xx 157353f0c962SBram Moolenaar au BufLeave <buffer> let g:bname = expand("%") 157453f0c962SBram Moolenaar " here, autocommand for xx should trigger. 157553f0c962SBram Moolenaar " but autocommand shall not apply to buffer named <buffer>. 157653f0c962SBram Moolenaar edit somefile 157753f0c962SBram Moolenaar call assert_equal('xx', g:bname) 157853f0c962SBram Moolenaar let g:bname = '' 157953f0c962SBram Moolenaar " here, autocommand shall be auto-deleted 158053f0c962SBram Moolenaar bwipe xx 158153f0c962SBram Moolenaar " autocmd should not trigger 158253f0c962SBram Moolenaar edit xx 158353f0c962SBram Moolenaar call assert_equal('', g:bname) 158453f0c962SBram Moolenaar " autocmd should not trigger 158553f0c962SBram Moolenaar edit somefile 158653f0c962SBram Moolenaar call assert_equal('', g:bname) 158753f0c962SBram Moolenaar enew 158853f0c962SBram Moolenaar unlet g:bname 158953f0c962SBram Moolenaarendfunc 1590430dc5d3SBram Moolenaar 1591430dc5d3SBram Moolenaar" Test for "*Cmd" autocommands 1592430dc5d3SBram Moolenaarfunc Test_Cmd_Autocmds() 1593430dc5d3SBram Moolenaar call writefile(['start of Xxx', "\tabc2", 'end of Xxx'], 'Xxx') 1594430dc5d3SBram Moolenaar 1595430dc5d3SBram Moolenaar enew! 1596430dc5d3SBram Moolenaar au BufReadCmd XtestA 0r Xxx|$del 1597430dc5d3SBram Moolenaar edit XtestA " will read text of Xxd instead 1598430dc5d3SBram Moolenaar call assert_equal('start of Xxx', getline(1)) 1599430dc5d3SBram Moolenaar 1600430dc5d3SBram Moolenaar au BufWriteCmd XtestA call append(line("$"), "write") 1601430dc5d3SBram Moolenaar write " will append a line to the file 1602430dc5d3SBram Moolenaar call assert_equal('write', getline('$')) 1603e2e4075fSBram Moolenaar call assert_fails('read XtestA', 'E484:') " should not read anything 1604430dc5d3SBram Moolenaar call assert_equal('write', getline(4)) 1605430dc5d3SBram Moolenaar 1606430dc5d3SBram Moolenaar " now we have: 1607430dc5d3SBram Moolenaar " 1 start of Xxx 1608430dc5d3SBram Moolenaar " 2 abc2 1609430dc5d3SBram Moolenaar " 3 end of Xxx 1610430dc5d3SBram Moolenaar " 4 write 1611430dc5d3SBram Moolenaar 1612430dc5d3SBram Moolenaar au FileReadCmd XtestB '[r Xxx 1613430dc5d3SBram Moolenaar 2r XtestB " will read Xxx below line 2 instead 1614430dc5d3SBram Moolenaar call assert_equal('start of Xxx', getline(3)) 1615430dc5d3SBram Moolenaar 1616430dc5d3SBram Moolenaar " now we have: 1617430dc5d3SBram Moolenaar " 1 start of Xxx 1618430dc5d3SBram Moolenaar " 2 abc2 1619430dc5d3SBram Moolenaar " 3 start of Xxx 1620430dc5d3SBram Moolenaar " 4 abc2 1621430dc5d3SBram Moolenaar " 5 end of Xxx 1622430dc5d3SBram Moolenaar " 6 end of Xxx 1623430dc5d3SBram Moolenaar " 7 write 1624430dc5d3SBram Moolenaar 1625430dc5d3SBram Moolenaar au FileWriteCmd XtestC '[,']copy $ 1626430dc5d3SBram Moolenaar normal 4GA1 1627430dc5d3SBram Moolenaar 4,5w XtestC " will copy lines 4 and 5 to the end 1628430dc5d3SBram Moolenaar call assert_equal("\tabc21", getline(8)) 1629e2e4075fSBram Moolenaar call assert_fails('r XtestC', 'E484:') " should not read anything 1630430dc5d3SBram Moolenaar call assert_equal("end of Xxx", getline(9)) 1631430dc5d3SBram Moolenaar 1632430dc5d3SBram Moolenaar " now we have: 1633430dc5d3SBram Moolenaar " 1 start of Xxx 1634430dc5d3SBram Moolenaar " 2 abc2 1635430dc5d3SBram Moolenaar " 3 start of Xxx 1636430dc5d3SBram Moolenaar " 4 abc21 1637430dc5d3SBram Moolenaar " 5 end of Xxx 1638430dc5d3SBram Moolenaar " 6 end of Xxx 1639430dc5d3SBram Moolenaar " 7 write 1640430dc5d3SBram Moolenaar " 8 abc21 1641430dc5d3SBram Moolenaar " 9 end of Xxx 1642430dc5d3SBram Moolenaar 1643430dc5d3SBram Moolenaar let g:lines = [] 1644430dc5d3SBram Moolenaar au FileAppendCmd XtestD call extend(g:lines, getline(line("'["), line("']"))) 1645430dc5d3SBram Moolenaar w >>XtestD " will add lines to 'lines' 1646430dc5d3SBram Moolenaar call assert_equal(9, len(g:lines)) 1647e2e4075fSBram Moolenaar call assert_fails('$r XtestD', 'E484:') " should not read anything 1648430dc5d3SBram Moolenaar call assert_equal(9, line('$')) 1649430dc5d3SBram Moolenaar call assert_equal('end of Xxx', getline('$')) 1650430dc5d3SBram Moolenaar 1651430dc5d3SBram Moolenaar au BufReadCmd XtestE 0r Xxx|$del 1652430dc5d3SBram Moolenaar sp XtestE " split window with test.out 1653430dc5d3SBram Moolenaar call assert_equal('end of Xxx', getline(3)) 1654430dc5d3SBram Moolenaar 1655430dc5d3SBram Moolenaar let g:lines = [] 1656430dc5d3SBram Moolenaar exe "normal 2Goasdf\<Esc>\<C-W>\<C-W>" 1657430dc5d3SBram Moolenaar au BufWriteCmd XtestE call extend(g:lines, getline(0, '$')) 1658430dc5d3SBram Moolenaar wall " will write other window to 'lines' 1659430dc5d3SBram Moolenaar call assert_equal(4, len(g:lines), g:lines) 1660430dc5d3SBram Moolenaar call assert_equal('asdf', g:lines[2]) 1661430dc5d3SBram Moolenaar 1662430dc5d3SBram Moolenaar au! BufReadCmd 1663430dc5d3SBram Moolenaar au! BufWriteCmd 1664430dc5d3SBram Moolenaar au! FileReadCmd 1665430dc5d3SBram Moolenaar au! FileWriteCmd 1666430dc5d3SBram Moolenaar au! FileAppendCmd 1667430dc5d3SBram Moolenaar %bwipe! 1668430dc5d3SBram Moolenaar call delete('Xxx') 1669430dc5d3SBram Moolenaar enew! 1670430dc5d3SBram Moolenaarendfunc 1671aace2158SBram Moolenaar 16720fff4415SBram Moolenaarfunc s:ReadFile() 16730fff4415SBram Moolenaar setl noswapfile nomodified 16740fff4415SBram Moolenaar let filename = resolve(expand("<afile>:p")) 16750fff4415SBram Moolenaar execute 'read' fnameescape(filename) 16760fff4415SBram Moolenaar 1d_ 16770fff4415SBram Moolenaar exe 'file' fnameescape(filename) 16780fff4415SBram Moolenaar setl buftype=acwrite 16790fff4415SBram Moolenaarendfunc 16800fff4415SBram Moolenaar 16810fff4415SBram Moolenaarfunc s:WriteFile() 16820fff4415SBram Moolenaar let filename = resolve(expand("<afile>:p")) 16830fff4415SBram Moolenaar setl buftype= 16840fff4415SBram Moolenaar noautocmd execute 'write' fnameescape(filename) 16850fff4415SBram Moolenaar setl buftype=acwrite 16860fff4415SBram Moolenaar setl nomodified 16870fff4415SBram Moolenaarendfunc 16880fff4415SBram Moolenaar 16890fff4415SBram Moolenaarfunc Test_BufReadCmd() 16900fff4415SBram Moolenaar autocmd BufReadCmd *.test call s:ReadFile() 16910fff4415SBram Moolenaar autocmd BufWriteCmd *.test call s:WriteFile() 16920fff4415SBram Moolenaar 16930fff4415SBram Moolenaar call writefile(['one', 'two', 'three'], 'Xcmd.test') 16940fff4415SBram Moolenaar edit Xcmd.test 16950fff4415SBram Moolenaar call assert_match('Xcmd.test" line 1 of 3', execute('file')) 16960fff4415SBram Moolenaar normal! Gofour 16970fff4415SBram Moolenaar write 16980fff4415SBram Moolenaar call assert_equal(['one', 'two', 'three', 'four'], readfile('Xcmd.test')) 16990fff4415SBram Moolenaar 17000fff4415SBram Moolenaar bwipe! 17010fff4415SBram Moolenaar call delete('Xcmd.test') 17020fff4415SBram Moolenaar au! BufReadCmd 17030fff4415SBram Moolenaar au! BufWriteCmd 17040fff4415SBram Moolenaarendfunc 17050fff4415SBram Moolenaar 1706aace2158SBram Moolenaarfunc SetChangeMarks(start, end) 170797c6943eSBram Moolenaar exe a:start .. 'mark [' 170897c6943eSBram Moolenaar exe a:end .. 'mark ]' 1709aace2158SBram Moolenaarendfunc 1710aace2158SBram Moolenaar 1711aace2158SBram Moolenaar" Verify the effects of autocmds on '[ and '] 1712aace2158SBram Moolenaarfunc Test_change_mark_in_autocmds() 1713aace2158SBram Moolenaar edit! Xtest 171497c6943eSBram Moolenaar call feedkeys("ia\<CR>b\<CR>c\<CR>d\<C-g>u\<Esc>", 'xtn') 1715aace2158SBram Moolenaar 1716aace2158SBram Moolenaar call SetChangeMarks(2, 3) 1717aace2158SBram Moolenaar write 1718aace2158SBram Moolenaar call assert_equal([1, 4], [line("'["), line("']")]) 1719aace2158SBram Moolenaar 1720aace2158SBram Moolenaar call SetChangeMarks(2, 3) 1721aace2158SBram Moolenaar au BufWritePre * call assert_equal([1, 4], [line("'["), line("']")]) 1722aace2158SBram Moolenaar write 1723aace2158SBram Moolenaar au! BufWritePre 1724aace2158SBram Moolenaar 172514ddd226SBram Moolenaar if has('unix') 1726aace2158SBram Moolenaar write XtestFilter 1727aace2158SBram Moolenaar write >> XtestFilter 1728aace2158SBram Moolenaar 1729aace2158SBram Moolenaar call SetChangeMarks(2, 3) 1730aace2158SBram Moolenaar " Marks are set to the entire range of the write 1731aace2158SBram Moolenaar au FilterWritePre * call assert_equal([1, 4], [line("'["), line("']")]) 1732aace2158SBram Moolenaar " '[ is adjusted to just before the line that will receive the filtered 1733aace2158SBram Moolenaar " data 1734aace2158SBram Moolenaar au FilterReadPre * call assert_equal([4, 4], [line("'["), line("']")]) 1735aace2158SBram Moolenaar " The filtered data is read into the buffer, and the source lines are 1736aace2158SBram Moolenaar " still present, so the range is after the source lines 1737aace2158SBram Moolenaar au FilterReadPost * call assert_equal([5, 12], [line("'["), line("']")]) 1738aace2158SBram Moolenaar %!cat XtestFilter 1739aace2158SBram Moolenaar " After the filtered data is read, the original lines are deleted 1740aace2158SBram Moolenaar call assert_equal([1, 8], [line("'["), line("']")]) 1741aace2158SBram Moolenaar au! FilterWritePre,FilterReadPre,FilterReadPost 1742aace2158SBram Moolenaar undo 1743aace2158SBram Moolenaar 1744aace2158SBram Moolenaar call SetChangeMarks(1, 4) 1745aace2158SBram Moolenaar au FilterWritePre * call assert_equal([2, 3], [line("'["), line("']")]) 1746aace2158SBram Moolenaar au FilterReadPre * call assert_equal([3, 3], [line("'["), line("']")]) 1747aace2158SBram Moolenaar au FilterReadPost * call assert_equal([4, 11], [line("'["), line("']")]) 1748aace2158SBram Moolenaar 2,3!cat XtestFilter 1749aace2158SBram Moolenaar call assert_equal([2, 9], [line("'["), line("']")]) 1750aace2158SBram Moolenaar au! FilterWritePre,FilterReadPre,FilterReadPost 1751aace2158SBram Moolenaar undo 1752aace2158SBram Moolenaar 1753aace2158SBram Moolenaar call delete('XtestFilter') 1754aace2158SBram Moolenaar endif 1755aace2158SBram Moolenaar 1756aace2158SBram Moolenaar call SetChangeMarks(1, 4) 1757aace2158SBram Moolenaar au FileWritePre * call assert_equal([2, 3], [line("'["), line("']")]) 1758aace2158SBram Moolenaar 2,3write Xtest2 1759aace2158SBram Moolenaar au! FileWritePre 1760aace2158SBram Moolenaar 1761aace2158SBram Moolenaar call SetChangeMarks(2, 3) 1762aace2158SBram Moolenaar au FileAppendPre * call assert_equal([1, 4], [line("'["), line("']")]) 1763aace2158SBram Moolenaar write >> Xtest2 1764aace2158SBram Moolenaar au! FileAppendPre 1765aace2158SBram Moolenaar 1766aace2158SBram Moolenaar call SetChangeMarks(1, 4) 1767aace2158SBram Moolenaar au FileAppendPre * call assert_equal([2, 3], [line("'["), line("']")]) 1768aace2158SBram Moolenaar 2,3write >> Xtest2 1769aace2158SBram Moolenaar au! FileAppendPre 1770aace2158SBram Moolenaar 1771aace2158SBram Moolenaar call SetChangeMarks(1, 1) 1772aace2158SBram Moolenaar au FileReadPre * call assert_equal([3, 1], [line("'["), line("']")]) 1773aace2158SBram Moolenaar au FileReadPost * call assert_equal([4, 11], [line("'["), line("']")]) 1774aace2158SBram Moolenaar 3read Xtest2 1775aace2158SBram Moolenaar au! FileReadPre,FileReadPost 1776aace2158SBram Moolenaar undo 1777aace2158SBram Moolenaar 1778aace2158SBram Moolenaar call SetChangeMarks(4, 4) 1779aace2158SBram Moolenaar " When the line is 0, it's adjusted to 1 1780aace2158SBram Moolenaar au FileReadPre * call assert_equal([1, 4], [line("'["), line("']")]) 1781aace2158SBram Moolenaar au FileReadPost * call assert_equal([1, 8], [line("'["), line("']")]) 1782aace2158SBram Moolenaar 0read Xtest2 1783aace2158SBram Moolenaar au! FileReadPre,FileReadPost 1784aace2158SBram Moolenaar undo 1785aace2158SBram Moolenaar 1786aace2158SBram Moolenaar call SetChangeMarks(4, 4) 1787aace2158SBram Moolenaar " When the line is 0, it's adjusted to 1 1788aace2158SBram Moolenaar au FileReadPre * call assert_equal([1, 4], [line("'["), line("']")]) 1789aace2158SBram Moolenaar au FileReadPost * call assert_equal([2, 9], [line("'["), line("']")]) 1790aace2158SBram Moolenaar 1read Xtest2 1791aace2158SBram Moolenaar au! FileReadPre,FileReadPost 1792aace2158SBram Moolenaar undo 1793aace2158SBram Moolenaar 1794aace2158SBram Moolenaar bwipe! 1795aace2158SBram Moolenaar call delete('Xtest') 1796aace2158SBram Moolenaar call delete('Xtest2') 1797aace2158SBram Moolenaarendfunc 1798aace2158SBram Moolenaar 1799aace2158SBram Moolenaarfunc Test_Filter_noshelltemp() 1800aeb313f3SBram Moolenaar CheckExecutable cat 1801aace2158SBram Moolenaar 1802aace2158SBram Moolenaar enew! 1803aace2158SBram Moolenaar call setline(1, ['a', 'b', 'c', 'd']) 1804aace2158SBram Moolenaar 1805aace2158SBram Moolenaar let shelltemp = &shelltemp 1806aace2158SBram Moolenaar set shelltemp 1807aace2158SBram Moolenaar 1808aace2158SBram Moolenaar let g:filter_au = 0 1809aace2158SBram Moolenaar au FilterWritePre * let g:filter_au += 1 1810aace2158SBram Moolenaar au FilterReadPre * let g:filter_au += 1 1811aace2158SBram Moolenaar au FilterReadPost * let g:filter_au += 1 1812aace2158SBram Moolenaar %!cat 1813aace2158SBram Moolenaar call assert_equal(3, g:filter_au) 1814aace2158SBram Moolenaar 1815aace2158SBram Moolenaar if has('filterpipe') 1816aace2158SBram Moolenaar set noshelltemp 1817aace2158SBram Moolenaar 1818aace2158SBram Moolenaar let g:filter_au = 0 1819aace2158SBram Moolenaar au FilterWritePre * let g:filter_au += 1 1820aace2158SBram Moolenaar au FilterReadPre * let g:filter_au += 1 1821aace2158SBram Moolenaar au FilterReadPost * let g:filter_au += 1 1822aace2158SBram Moolenaar %!cat 1823aace2158SBram Moolenaar call assert_equal(0, g:filter_au) 1824aace2158SBram Moolenaar endif 1825aace2158SBram Moolenaar 1826aace2158SBram Moolenaar au! FilterWritePre,FilterReadPre,FilterReadPost 1827aace2158SBram Moolenaar let &shelltemp = shelltemp 1828aace2158SBram Moolenaar bwipe! 1829aace2158SBram Moolenaarendfunc 18307e1652c6SBram Moolenaar 18317e1652c6SBram Moolenaarfunc Test_TextYankPost() 18327e1652c6SBram Moolenaar enew! 18337e1652c6SBram Moolenaar call setline(1, ['foo']) 18347e1652c6SBram Moolenaar 18357e1652c6SBram Moolenaar let g:event = [] 18367e1652c6SBram Moolenaar au TextYankPost * let g:event = copy(v:event) 18377e1652c6SBram Moolenaar 18387e1652c6SBram Moolenaar call assert_equal({}, v:event) 18397e1652c6SBram Moolenaar call assert_fails('let v:event = {}', 'E46:') 18407e1652c6SBram Moolenaar call assert_fails('let v:event.mykey = 0', 'E742:') 18417e1652c6SBram Moolenaar 18427e1652c6SBram Moolenaar norm "ayiw 18437e1652c6SBram Moolenaar call assert_equal( 184437d1673cSBram Moolenaar \{'regcontents': ['foo'], 'regname': 'a', 'operator': 'y', 'regtype': 'v', 'visual': v:false}, 18457e1652c6SBram Moolenaar \g:event) 18467e1652c6SBram Moolenaar norm y_ 18477e1652c6SBram Moolenaar call assert_equal( 184837d1673cSBram Moolenaar \{'regcontents': ['foo'], 'regname': '', 'operator': 'y', 'regtype': 'V', 'visual': v:false}, 184937d1673cSBram Moolenaar \g:event) 185037d1673cSBram Moolenaar norm Vy 185137d1673cSBram Moolenaar call assert_equal( 185237d1673cSBram Moolenaar \{'regcontents': ['foo'], 'regname': '', 'operator': 'y', 'regtype': 'V', 'visual': v:true}, 18537e1652c6SBram Moolenaar \g:event) 18547e1652c6SBram Moolenaar call feedkeys("\<C-V>y", 'x') 18557e1652c6SBram Moolenaar call assert_equal( 185637d1673cSBram Moolenaar \{'regcontents': ['f'], 'regname': '', 'operator': 'y', 'regtype': "\x161", 'visual': v:true}, 18577e1652c6SBram Moolenaar \g:event) 18587e1652c6SBram Moolenaar norm "xciwbar 18597e1652c6SBram Moolenaar call assert_equal( 186037d1673cSBram Moolenaar \{'regcontents': ['foo'], 'regname': 'x', 'operator': 'c', 'regtype': 'v', 'visual': v:false}, 18617e1652c6SBram Moolenaar \g:event) 18627e1652c6SBram Moolenaar norm "bdiw 18637e1652c6SBram Moolenaar call assert_equal( 186437d1673cSBram Moolenaar \{'regcontents': ['bar'], 'regname': 'b', 'operator': 'd', 'regtype': 'v', 'visual': v:false}, 18657e1652c6SBram Moolenaar \g:event) 18667e1652c6SBram Moolenaar 18677e1652c6SBram Moolenaar call assert_equal({}, v:event) 18687e1652c6SBram Moolenaar 1869fccbf068SBram Moolenaar if has('clipboard_working') && !has('gui_running') 1870fccbf068SBram Moolenaar " Test that when the visual selection is automatically copied to clipboard 1871fccbf068SBram Moolenaar " register a TextYankPost is emitted 1872fccbf068SBram Moolenaar call setline(1, ['foobar']) 1873fccbf068SBram Moolenaar 1874fccbf068SBram Moolenaar let @* = '' 1875fccbf068SBram Moolenaar set clipboard=autoselect 1876fccbf068SBram Moolenaar exe "norm! ggviw\<Esc>" 1877fccbf068SBram Moolenaar call assert_equal( 1878fccbf068SBram Moolenaar \{'regcontents': ['foobar'], 'regname': '*', 'operator': 'y', 'regtype': 'v', 'visual': v:true}, 1879fccbf068SBram Moolenaar \g:event) 1880fccbf068SBram Moolenaar 1881fccbf068SBram Moolenaar let @+ = '' 1882fccbf068SBram Moolenaar set clipboard=autoselectplus 1883fccbf068SBram Moolenaar exe "norm! ggviw\<Esc>" 1884fccbf068SBram Moolenaar call assert_equal( 1885fccbf068SBram Moolenaar \{'regcontents': ['foobar'], 'regname': '+', 'operator': 'y', 'regtype': 'v', 'visual': v:true}, 1886fccbf068SBram Moolenaar \g:event) 1887fccbf068SBram Moolenaar 1888fccbf068SBram Moolenaar set clipboard&vim 1889fccbf068SBram Moolenaar endif 1890fccbf068SBram Moolenaar 18917e1652c6SBram Moolenaar au! TextYankPost 18927e1652c6SBram Moolenaar unlet g:event 18937e1652c6SBram Moolenaar bwipe! 18947e1652c6SBram Moolenaarendfunc 18959bca805eSBram Moolenaar 18969a046fd0SBram Moolenaarfunc Test_autocommand_all_events() 18979a046fd0SBram Moolenaar call assert_fails('au * * bwipe', 'E1155:') 18989a046fd0SBram Moolenaar call assert_fails('au * x bwipe', 'E1155:') 18994fb921e3SBram Moolenaarendfunc 1900b7407d3fSBram Moolenaar 1901b7407d3fSBram Moolenaarfunction s:Before_test_dirchanged() 1902b7407d3fSBram Moolenaar augroup test_dirchanged 1903b7407d3fSBram Moolenaar autocmd! 1904b7407d3fSBram Moolenaar augroup END 1905b7407d3fSBram Moolenaar let s:li = [] 1906b7407d3fSBram Moolenaar let s:dir_this = getcwd() 19076a2c5a7dSBram Moolenaar let s:dir_foo = s:dir_this . '/Xfoo' 19082caad3fbSBram Moolenaar call mkdir(s:dir_foo) 19096a2c5a7dSBram Moolenaar let s:dir_bar = s:dir_this . '/Xbar' 19102caad3fbSBram Moolenaar call mkdir(s:dir_bar) 1911b7407d3fSBram Moolenaarendfunc 1912b7407d3fSBram Moolenaar 1913b7407d3fSBram Moolenaarfunction s:After_test_dirchanged() 19143503d7c9SBram Moolenaar call chdir(s:dir_this) 19152caad3fbSBram Moolenaar call delete(s:dir_foo, 'd') 19162caad3fbSBram Moolenaar call delete(s:dir_bar, 'd') 1917b7407d3fSBram Moolenaar augroup test_dirchanged 1918b7407d3fSBram Moolenaar autocmd! 1919b7407d3fSBram Moolenaar augroup END 1920b7407d3fSBram Moolenaarendfunc 1921b7407d3fSBram Moolenaar 1922b7407d3fSBram Moolenaarfunction Test_dirchanged_global() 1923b7407d3fSBram Moolenaar call s:Before_test_dirchanged() 1924b7407d3fSBram Moolenaar autocmd test_dirchanged DirChanged global call add(s:li, "cd:") 1925b7407d3fSBram Moolenaar autocmd test_dirchanged DirChanged global call add(s:li, expand("<afile>")) 19263503d7c9SBram Moolenaar call chdir(s:dir_foo) 19272caad3fbSBram Moolenaar call assert_equal(["cd:", s:dir_foo], s:li) 19283503d7c9SBram Moolenaar call chdir(s:dir_foo) 19292caad3fbSBram Moolenaar call assert_equal(["cd:", s:dir_foo], s:li) 19303503d7c9SBram Moolenaar exe 'lcd ' .. fnameescape(s:dir_bar) 19312caad3fbSBram Moolenaar call assert_equal(["cd:", s:dir_foo], s:li) 1932b7407d3fSBram Moolenaar call s:After_test_dirchanged() 1933b7407d3fSBram Moolenaarendfunc 1934b7407d3fSBram Moolenaar 1935b7407d3fSBram Moolenaarfunction Test_dirchanged_local() 1936b7407d3fSBram Moolenaar call s:Before_test_dirchanged() 1937b7407d3fSBram Moolenaar autocmd test_dirchanged DirChanged window call add(s:li, "lcd:") 1938b7407d3fSBram Moolenaar autocmd test_dirchanged DirChanged window call add(s:li, expand("<afile>")) 19393503d7c9SBram Moolenaar call chdir(s:dir_foo) 1940b7407d3fSBram Moolenaar call assert_equal([], s:li) 19413503d7c9SBram Moolenaar exe 'lcd ' .. fnameescape(s:dir_bar) 19422caad3fbSBram Moolenaar call assert_equal(["lcd:", s:dir_bar], s:li) 19433503d7c9SBram Moolenaar exe 'lcd ' .. fnameescape(s:dir_bar) 19442caad3fbSBram Moolenaar call assert_equal(["lcd:", s:dir_bar], s:li) 1945b7407d3fSBram Moolenaar call s:After_test_dirchanged() 1946b7407d3fSBram Moolenaarendfunc 1947b7407d3fSBram Moolenaar 1948b7407d3fSBram Moolenaarfunction Test_dirchanged_auto() 19496d91bcb4SBram Moolenaar CheckOption autochdir 1950b7407d3fSBram Moolenaar call s:Before_test_dirchanged() 1951b7407d3fSBram Moolenaar call test_autochdir() 1952b7407d3fSBram Moolenaar autocmd test_dirchanged DirChanged auto call add(s:li, "auto:") 1953b7407d3fSBram Moolenaar autocmd test_dirchanged DirChanged auto call add(s:li, expand("<afile>")) 1954b7407d3fSBram Moolenaar set acd 19553503d7c9SBram Moolenaar cd .. 1956b7407d3fSBram Moolenaar call assert_equal([], s:li) 19572caad3fbSBram Moolenaar exe 'edit ' . s:dir_foo . '/Xfile' 19582caad3fbSBram Moolenaar call assert_equal(s:dir_foo, getcwd()) 19592caad3fbSBram Moolenaar call assert_equal(["auto:", s:dir_foo], s:li) 1960b7407d3fSBram Moolenaar set noacd 1961b7407d3fSBram Moolenaar bwipe! 1962b7407d3fSBram Moolenaar call s:After_test_dirchanged() 1963b7407d3fSBram Moolenaarendfunc 19645a093437SBram Moolenaar 19655a093437SBram Moolenaar" Test TextChangedI and TextChangedP 19665a093437SBram Moolenaarfunc Test_ChangedP() 19675a093437SBram Moolenaar new 19685a093437SBram Moolenaar call setline(1, ['foo', 'bar', 'foobar']) 19695a093437SBram Moolenaar call test_override("char_avail", 1) 19705a093437SBram Moolenaar set complete=. completeopt=menuone 19715a093437SBram Moolenaar 19725a093437SBram Moolenaar func! TextChangedAutocmd(char) 19735a093437SBram Moolenaar let g:autocmd .= a:char 19745a093437SBram Moolenaar endfunc 19755a093437SBram Moolenaar 1976db3b4464SChristian Brabandt " TextChanged will not be triggered, only check that it isn't. 19775a093437SBram Moolenaar au! TextChanged <buffer> :call TextChangedAutocmd('N') 19785a093437SBram Moolenaar au! TextChangedI <buffer> :call TextChangedAutocmd('I') 19795a093437SBram Moolenaar au! TextChangedP <buffer> :call TextChangedAutocmd('P') 19805a093437SBram Moolenaar 19815a093437SBram Moolenaar call cursor(3, 1) 19825a093437SBram Moolenaar let g:autocmd = '' 19835a093437SBram Moolenaar call feedkeys("o\<esc>", 'tnix') 19845a093437SBram Moolenaar call assert_equal('I', g:autocmd) 19855a093437SBram Moolenaar 19865a093437SBram Moolenaar let g:autocmd = '' 19875a093437SBram Moolenaar call feedkeys("Sf", 'tnix') 19885a093437SBram Moolenaar call assert_equal('II', g:autocmd) 19895a093437SBram Moolenaar 19905a093437SBram Moolenaar let g:autocmd = '' 19915a093437SBram Moolenaar call feedkeys("Sf\<C-N>", 'tnix') 19925a093437SBram Moolenaar call assert_equal('IIP', g:autocmd) 19935a093437SBram Moolenaar 19945a093437SBram Moolenaar let g:autocmd = '' 19955a093437SBram Moolenaar call feedkeys("Sf\<C-N>\<C-N>", 'tnix') 19965a093437SBram Moolenaar call assert_equal('IIPP', g:autocmd) 19975a093437SBram Moolenaar 19985a093437SBram Moolenaar let g:autocmd = '' 19995a093437SBram Moolenaar call feedkeys("Sf\<C-N>\<C-N>\<C-N>", 'tnix') 20005a093437SBram Moolenaar call assert_equal('IIPPP', g:autocmd) 20015a093437SBram Moolenaar 20025a093437SBram Moolenaar let g:autocmd = '' 20035a093437SBram Moolenaar call feedkeys("Sf\<C-N>\<C-N>\<C-N>\<C-N>", 'tnix') 20045a093437SBram Moolenaar call assert_equal('IIPPPP', g:autocmd) 20055a093437SBram Moolenaar 20065a093437SBram Moolenaar call assert_equal(['foo', 'bar', 'foobar', 'foo'], getline(1, '$')) 20075a093437SBram Moolenaar " TODO: how should it handle completeopt=noinsert,noselect? 20085a093437SBram Moolenaar 20095a093437SBram Moolenaar " CleanUp 20105a093437SBram Moolenaar call test_override("char_avail", 0) 20115a093437SBram Moolenaar au! TextChanged 20125a093437SBram Moolenaar au! TextChangedI 20135a093437SBram Moolenaar au! TextChangedP 20145a093437SBram Moolenaar delfu TextChangedAutocmd 20155a093437SBram Moolenaar unlet! g:autocmd 20165a093437SBram Moolenaar set complete&vim completeopt&vim 20175a093437SBram Moolenaar 20185a093437SBram Moolenaar bw! 20195a093437SBram Moolenaarendfunc 20208c64a36eSBram Moolenaar 202191d2e783SBram Moolenaarlet g:setline_handled = v:false 20221e115360SBram Moolenaarfunc SetLineOne() 202391d2e783SBram Moolenaar if !g:setline_handled 202491d2e783SBram Moolenaar call setline(1, "(x)") 202591d2e783SBram Moolenaar let g:setline_handled = v:true 202691d2e783SBram Moolenaar endif 202791d2e783SBram Moolenaarendfunc 202891d2e783SBram Moolenaar 202991d2e783SBram Moolenaarfunc Test_TextChangedI_with_setline() 203091d2e783SBram Moolenaar new 203191d2e783SBram Moolenaar call test_override('char_avail', 1) 203291d2e783SBram Moolenaar autocmd TextChangedI <buffer> call SetLineOne() 203391d2e783SBram Moolenaar call feedkeys("i(\<CR>\<Esc>", 'tx') 203491d2e783SBram Moolenaar call assert_equal('(', getline(1)) 203591d2e783SBram Moolenaar call assert_equal('x)', getline(2)) 203691d2e783SBram Moolenaar undo 203791d2e783SBram Moolenaar call assert_equal('', getline(1)) 20389fa95068SBram Moolenaar call assert_equal('', getline(2)) 203991d2e783SBram Moolenaar 204091d2e783SBram Moolenaar call test_override('starting', 0) 204191d2e783SBram Moolenaar bwipe! 204291d2e783SBram Moolenaarendfunc 204391d2e783SBram Moolenaar 20448c64a36eSBram Moolenaarfunc Test_Changed_FirstTime() 20458c5a278fSBram Moolenaar CheckFeature terminal 20468c5a278fSBram Moolenaar CheckNotGui 20473cdcb090SBram Moolenaar " Starting a terminal to run Vim is always considered flaky. 204830d53e2cSBram Moolenaar let g:test_is_flaky = 1 20498c5a278fSBram Moolenaar 20508c64a36eSBram Moolenaar " Prepare file for TextChanged event. 20518c64a36eSBram Moolenaar call writefile([''], 'Xchanged.txt') 20528c64a36eSBram Moolenaar let buf = term_start([GetVimProg(), '--clean', '-c', 'set noswapfile'], {'term_rows': 3}) 20538c64a36eSBram Moolenaar call assert_equal('running', term_getstatus(buf)) 20541834d373SBram Moolenaar " Wait for the ruler (in the status line) to be shown. 2055aa5df7e3SBram Moolenaar " In ConPTY, there is additional character which is drawn up to the width of 2056aa5df7e3SBram Moolenaar " the screen. 2057aa5df7e3SBram Moolenaar if has('conpty') 2058aa5df7e3SBram Moolenaar call WaitForAssert({-> assert_match('\<All.*$', term_getline(buf, 3))}) 2059aa5df7e3SBram Moolenaar else 206050182fa8SBram Moolenaar call WaitForAssert({-> assert_match('\<All$', term_getline(buf, 3))}) 2061aa5df7e3SBram Moolenaar endif 20628c64a36eSBram Moolenaar " It's only adding autocmd, so that no event occurs. 20638c64a36eSBram Moolenaar call term_sendkeys(buf, ":au! TextChanged <buffer> call writefile(['No'], 'Xchanged.txt')\<cr>") 20648c64a36eSBram Moolenaar call term_sendkeys(buf, "\<C-\\>\<C-N>:qa!\<cr>") 206550182fa8SBram Moolenaar call WaitForAssert({-> assert_equal('finished', term_getstatus(buf))}) 20668c64a36eSBram Moolenaar call assert_equal([''], readfile('Xchanged.txt')) 20678c64a36eSBram Moolenaar 20688c64a36eSBram Moolenaar " clean up 20698c64a36eSBram Moolenaar call delete('Xchanged.txt') 20708c64a36eSBram Moolenaar bwipe! 20718c64a36eSBram Moolenaarendfunc 20720566e891SBram Moolenaar 2073eb93f3f0SBram Moolenaarfunc Test_autocmd_nested() 2074eb93f3f0SBram Moolenaar let g:did_nested = 0 2075eb93f3f0SBram Moolenaar augroup Testing 2076eb93f3f0SBram Moolenaar au WinNew * edit somefile 2077eb93f3f0SBram Moolenaar au BufNew * let g:did_nested = 1 2078eb93f3f0SBram Moolenaar augroup END 2079eb93f3f0SBram Moolenaar split 2080eb93f3f0SBram Moolenaar call assert_equal(0, g:did_nested) 2081eb93f3f0SBram Moolenaar close 2082eb93f3f0SBram Moolenaar bwipe! somefile 2083eb93f3f0SBram Moolenaar 2084eb93f3f0SBram Moolenaar " old nested argument still works 2085eb93f3f0SBram Moolenaar augroup Testing 2086eb93f3f0SBram Moolenaar au! 2087eb93f3f0SBram Moolenaar au WinNew * nested edit somefile 2088eb93f3f0SBram Moolenaar au BufNew * let g:did_nested = 1 2089eb93f3f0SBram Moolenaar augroup END 2090eb93f3f0SBram Moolenaar split 2091eb93f3f0SBram Moolenaar call assert_equal(1, g:did_nested) 2092eb93f3f0SBram Moolenaar close 2093eb93f3f0SBram Moolenaar bwipe! somefile 2094eb93f3f0SBram Moolenaar 2095eb93f3f0SBram Moolenaar " New ++nested argument works 2096eb93f3f0SBram Moolenaar augroup Testing 2097eb93f3f0SBram Moolenaar au! 2098eb93f3f0SBram Moolenaar au WinNew * ++nested edit somefile 2099eb93f3f0SBram Moolenaar au BufNew * let g:did_nested = 1 2100eb93f3f0SBram Moolenaar augroup END 2101eb93f3f0SBram Moolenaar split 2102eb93f3f0SBram Moolenaar call assert_equal(1, g:did_nested) 2103eb93f3f0SBram Moolenaar close 2104eb93f3f0SBram Moolenaar bwipe! somefile 2105eb93f3f0SBram Moolenaar 2106eb93f3f0SBram Moolenaar augroup Testing 2107eb93f3f0SBram Moolenaar au! 2108eb93f3f0SBram Moolenaar augroup END 2109eb93f3f0SBram Moolenaar 2110eb93f3f0SBram Moolenaar call assert_fails('au WinNew * ++nested ++nested echo bad', 'E983:') 2111eb93f3f0SBram Moolenaar call assert_fails('au WinNew * nested nested echo bad', 'E983:') 2112eb93f3f0SBram Moolenaarendfunc 2113eb93f3f0SBram Moolenaar 2114eb93f3f0SBram Moolenaarfunc Test_autocmd_once() 2115eb93f3f0SBram Moolenaar " Without ++once WinNew triggers twice 2116eb93f3f0SBram Moolenaar let g:did_split = 0 2117eb93f3f0SBram Moolenaar augroup Testing 2118eb93f3f0SBram Moolenaar au WinNew * let g:did_split += 1 2119eb93f3f0SBram Moolenaar augroup END 2120eb93f3f0SBram Moolenaar split 2121eb93f3f0SBram Moolenaar split 2122eb93f3f0SBram Moolenaar call assert_equal(2, g:did_split) 2123eb93f3f0SBram Moolenaar call assert_true(exists('#WinNew')) 2124eb93f3f0SBram Moolenaar close 2125eb93f3f0SBram Moolenaar close 2126eb93f3f0SBram Moolenaar 2127eb93f3f0SBram Moolenaar " With ++once WinNew triggers once 2128eb93f3f0SBram Moolenaar let g:did_split = 0 2129eb93f3f0SBram Moolenaar augroup Testing 2130eb93f3f0SBram Moolenaar au! 2131eb93f3f0SBram Moolenaar au WinNew * ++once let g:did_split += 1 2132eb93f3f0SBram Moolenaar augroup END 2133eb93f3f0SBram Moolenaar split 2134eb93f3f0SBram Moolenaar split 2135eb93f3f0SBram Moolenaar call assert_equal(1, g:did_split) 2136eb93f3f0SBram Moolenaar call assert_false(exists('#WinNew')) 2137eb93f3f0SBram Moolenaar close 2138eb93f3f0SBram Moolenaar close 2139eb93f3f0SBram Moolenaar 2140eb93f3f0SBram Moolenaar call assert_fails('au WinNew * ++once ++once echo bad', 'E983:') 2141eb93f3f0SBram Moolenaarendfunc 2142eb93f3f0SBram Moolenaar 2143a68e5959SBram Moolenaarfunc Test_autocmd_bufreadpre() 2144a68e5959SBram Moolenaar new 2145a68e5959SBram Moolenaar let b:bufreadpre = 1 2146ab505b1aSBram Moolenaar call append(0, range(1000)) 2147a68e5959SBram Moolenaar w! XAutocmdBufReadPre.txt 2148a68e5959SBram Moolenaar autocmd BufReadPre <buffer> :let b:bufreadpre += 1 2149ab505b1aSBram Moolenaar norm! 500gg 2150a68e5959SBram Moolenaar sp 2151ab505b1aSBram Moolenaar norm! 1000gg 2152a68e5959SBram Moolenaar wincmd p 2153a68e5959SBram Moolenaar let g:wsv1 = winsaveview() 2154a68e5959SBram Moolenaar wincmd p 2155a68e5959SBram Moolenaar let g:wsv2 = winsaveview() 2156a68e5959SBram Moolenaar " triggers BufReadPre, should not move the cursor in either window 2157a68e5959SBram Moolenaar " The topline may change one line in a large window. 2158a68e5959SBram Moolenaar edit 2159a68e5959SBram Moolenaar call assert_inrange(g:wsv2.topline - 1, g:wsv2.topline + 1, winsaveview().topline) 2160a68e5959SBram Moolenaar call assert_equal(g:wsv2.lnum, winsaveview().lnum) 2161a68e5959SBram Moolenaar call assert_equal(2, b:bufreadpre) 2162a68e5959SBram Moolenaar wincmd p 2163a68e5959SBram Moolenaar call assert_equal(g:wsv1.topline, winsaveview().topline) 2164a68e5959SBram Moolenaar call assert_equal(g:wsv1.lnum, winsaveview().lnum) 2165a68e5959SBram Moolenaar call assert_equal(2, b:bufreadpre) 2166a68e5959SBram Moolenaar " Now set the cursor position in an BufReadPre autocommand 2167a68e5959SBram Moolenaar " (even though the position will be invalid, this should make Vim reset the 2168a68e5959SBram Moolenaar " cursor position in the other window. 2169a68e5959SBram Moolenaar wincmd p 2170a68e5959SBram Moolenaar set cpo+=g 2171a68e5959SBram Moolenaar " won't do anything, but try to set the cursor on an invalid lnum 2172a68e5959SBram Moolenaar autocmd BufReadPre <buffer> :norm! 70gg 2173a68e5959SBram Moolenaar " triggers BufReadPre, should not move the cursor in either window 2174a68e5959SBram Moolenaar e 2175a68e5959SBram Moolenaar call assert_equal(1, winsaveview().topline) 2176a68e5959SBram Moolenaar call assert_equal(1, winsaveview().lnum) 2177a68e5959SBram Moolenaar call assert_equal(3, b:bufreadpre) 2178a68e5959SBram Moolenaar wincmd p 2179a68e5959SBram Moolenaar call assert_equal(g:wsv1.topline, winsaveview().topline) 2180a68e5959SBram Moolenaar call assert_equal(g:wsv1.lnum, winsaveview().lnum) 2181a68e5959SBram Moolenaar call assert_equal(3, b:bufreadpre) 2182a68e5959SBram Moolenaar close 2183a68e5959SBram Moolenaar close 2184a68e5959SBram Moolenaar call delete('XAutocmdBufReadPre.txt') 2185a68e5959SBram Moolenaar set cpo-=g 2186a68e5959SBram Moolenaarendfunc 2187a68e5959SBram Moolenaar 21885e66b42aSBram Moolenaar" FileChangedShell tested in test_filechanged.vim 218969ea5872SBram Moolenaar 219069ea5872SBram Moolenaar" Tests for the following autocommands: 219169ea5872SBram Moolenaar" - FileWritePre writing a compressed file 219269ea5872SBram Moolenaar" - FileReadPost reading a compressed file 219369ea5872SBram Moolenaar" - BufNewFile reading a file template 219469ea5872SBram Moolenaar" - BufReadPre decompressing the file to be read 219569ea5872SBram Moolenaar" - FilterReadPre substituting characters in the temp file 219669ea5872SBram Moolenaar" - FilterReadPost substituting characters after filtering 219769ea5872SBram Moolenaar" - FileReadPre set options for decompression 219869ea5872SBram Moolenaar" - FileReadPost decompress the file 219969ea5872SBram Moolenaarfunc Test_ReadWrite_Autocmds() 220069ea5872SBram Moolenaar " Run this test only on Unix-like systems and if gzip is available 22016d91bcb4SBram Moolenaar CheckUnix 22026d91bcb4SBram Moolenaar CheckExecutable gzip 220369ea5872SBram Moolenaar 220469ea5872SBram Moolenaar " Make $GZIP empty, "-v" would cause trouble. 220569ea5872SBram Moolenaar let $GZIP = "" 220669ea5872SBram Moolenaar 220769ea5872SBram Moolenaar " Use a FileChangedShell autocommand to avoid a prompt for 'Xtestfile.gz' 220869ea5872SBram Moolenaar " being modified outside of Vim (noticed on Solaris). 220969ea5872SBram Moolenaar au FileChangedShell * echo 'caught FileChangedShell' 221069ea5872SBram Moolenaar 221169ea5872SBram Moolenaar " Test for the FileReadPost, FileWritePre and FileWritePost autocmds 221269ea5872SBram Moolenaar augroup Test1 221369ea5872SBram Moolenaar au! 221469ea5872SBram Moolenaar au FileWritePre *.gz '[,']!gzip 221569ea5872SBram Moolenaar au FileWritePost *.gz undo 221669ea5872SBram Moolenaar au FileReadPost *.gz '[,']!gzip -d 221769ea5872SBram Moolenaar augroup END 221869ea5872SBram Moolenaar 221969ea5872SBram Moolenaar new 222069ea5872SBram Moolenaar set bin 222169ea5872SBram Moolenaar call append(0, [ 222269ea5872SBram Moolenaar \ 'line 2 Abcdefghijklmnopqrstuvwxyz', 222369ea5872SBram Moolenaar \ 'line 3 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 222469ea5872SBram Moolenaar \ 'line 4 Abcdefghijklmnopqrstuvwxyz', 222569ea5872SBram Moolenaar \ 'line 5 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 222669ea5872SBram Moolenaar \ 'line 6 Abcdefghijklmnopqrstuvwxyz', 222769ea5872SBram Moolenaar \ 'line 7 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 222869ea5872SBram Moolenaar \ 'line 8 Abcdefghijklmnopqrstuvwxyz', 222969ea5872SBram Moolenaar \ 'line 9 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 223069ea5872SBram Moolenaar \ 'line 10 Abcdefghijklmnopqrstuvwxyz' 223169ea5872SBram Moolenaar \ ]) 223269ea5872SBram Moolenaar 1,9write! Xtestfile.gz 223369ea5872SBram Moolenaar enew! | close 223469ea5872SBram Moolenaar 223569ea5872SBram Moolenaar new 223669ea5872SBram Moolenaar " Read and decompress the testfile 223769ea5872SBram Moolenaar 0read Xtestfile.gz 223869ea5872SBram Moolenaar call assert_equal([ 223969ea5872SBram Moolenaar \ 'line 2 Abcdefghijklmnopqrstuvwxyz', 224069ea5872SBram Moolenaar \ 'line 3 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 224169ea5872SBram Moolenaar \ 'line 4 Abcdefghijklmnopqrstuvwxyz', 224269ea5872SBram Moolenaar \ 'line 5 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 224369ea5872SBram Moolenaar \ 'line 6 Abcdefghijklmnopqrstuvwxyz', 224469ea5872SBram Moolenaar \ 'line 7 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 224569ea5872SBram Moolenaar \ 'line 8 Abcdefghijklmnopqrstuvwxyz', 224669ea5872SBram Moolenaar \ 'line 9 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 224769ea5872SBram Moolenaar \ 'line 10 Abcdefghijklmnopqrstuvwxyz' 224869ea5872SBram Moolenaar \ ], getline(1, 9)) 224969ea5872SBram Moolenaar enew! | close 225069ea5872SBram Moolenaar 225169ea5872SBram Moolenaar augroup Test1 225269ea5872SBram Moolenaar au! 225369ea5872SBram Moolenaar augroup END 225469ea5872SBram Moolenaar 225569ea5872SBram Moolenaar " Test for the FileAppendPre and FileAppendPost autocmds 225669ea5872SBram Moolenaar augroup Test2 225769ea5872SBram Moolenaar au! 225869ea5872SBram Moolenaar au BufNewFile *.c read Xtest.c 225969ea5872SBram Moolenaar au FileAppendPre *.out '[,']s/new/NEW/ 226069ea5872SBram Moolenaar au FileAppendPost *.out !cat Xtest.c >> test.out 226169ea5872SBram Moolenaar augroup END 226269ea5872SBram Moolenaar 226369ea5872SBram Moolenaar call writefile(['/*', ' * Here is a new .c file', ' */'], 'Xtest.c') 226469ea5872SBram Moolenaar new foo.c " should load Xtest.c 226569ea5872SBram Moolenaar call assert_equal(['/*', ' * Here is a new .c file', ' */'], getline(2, 4)) 226669ea5872SBram Moolenaar w! >> test.out " append it to the output file 226769ea5872SBram Moolenaar 226869ea5872SBram Moolenaar let contents = readfile('test.out') 226969ea5872SBram Moolenaar call assert_equal(' * Here is a NEW .c file', contents[2]) 227069ea5872SBram Moolenaar call assert_equal(' * Here is a new .c file', contents[5]) 227169ea5872SBram Moolenaar 227269ea5872SBram Moolenaar call delete('test.out') 227369ea5872SBram Moolenaar enew! | close 227469ea5872SBram Moolenaar augroup Test2 227569ea5872SBram Moolenaar au! 227669ea5872SBram Moolenaar augroup END 227769ea5872SBram Moolenaar 227869ea5872SBram Moolenaar " Test for the BufReadPre and BufReadPost autocmds 227969ea5872SBram Moolenaar augroup Test3 228069ea5872SBram Moolenaar au! 228169ea5872SBram Moolenaar " setup autocommands to decompress before reading and re-compress 228269ea5872SBram Moolenaar " afterwards 228369ea5872SBram Moolenaar au BufReadPre *.gz exe '!gzip -d ' . shellescape(expand("<afile>")) 228469ea5872SBram Moolenaar au BufReadPre *.gz call rename(expand("<afile>:r"), expand("<afile>")) 228569ea5872SBram Moolenaar au BufReadPost *.gz call rename(expand("<afile>"), expand("<afile>:r")) 228669ea5872SBram Moolenaar au BufReadPost *.gz exe '!gzip ' . shellescape(expand("<afile>:r")) 228769ea5872SBram Moolenaar augroup END 228869ea5872SBram Moolenaar 228969ea5872SBram Moolenaar e! Xtestfile.gz " Edit compressed file 229069ea5872SBram Moolenaar call assert_equal([ 229169ea5872SBram Moolenaar \ 'line 2 Abcdefghijklmnopqrstuvwxyz', 229269ea5872SBram Moolenaar \ 'line 3 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 229369ea5872SBram Moolenaar \ 'line 4 Abcdefghijklmnopqrstuvwxyz', 229469ea5872SBram Moolenaar \ 'line 5 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 229569ea5872SBram Moolenaar \ 'line 6 Abcdefghijklmnopqrstuvwxyz', 229669ea5872SBram Moolenaar \ 'line 7 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 229769ea5872SBram Moolenaar \ 'line 8 Abcdefghijklmnopqrstuvwxyz', 229869ea5872SBram Moolenaar \ 'line 9 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 229969ea5872SBram Moolenaar \ 'line 10 Abcdefghijklmnopqrstuvwxyz' 230069ea5872SBram Moolenaar \ ], getline(1, 9)) 230169ea5872SBram Moolenaar 230269ea5872SBram Moolenaar w! >> test.out " Append it to the output file 230369ea5872SBram Moolenaar 230469ea5872SBram Moolenaar augroup Test3 230569ea5872SBram Moolenaar au! 230669ea5872SBram Moolenaar augroup END 230769ea5872SBram Moolenaar 230869ea5872SBram Moolenaar " Test for the FilterReadPre and FilterReadPost autocmds. 230969ea5872SBram Moolenaar set shelltemp " need temp files here 231069ea5872SBram Moolenaar augroup Test4 231169ea5872SBram Moolenaar au! 231269ea5872SBram Moolenaar au FilterReadPre *.out call rename(expand("<afile>"), expand("<afile>") . ".t") 231369ea5872SBram Moolenaar au FilterReadPre *.out exe 'silent !sed s/e/E/ ' . shellescape(expand("<afile>")) . ".t >" . shellescape(expand("<afile>")) 231469ea5872SBram Moolenaar au FilterReadPre *.out exe 'silent !rm ' . shellescape(expand("<afile>")) . '.t' 231569ea5872SBram Moolenaar au FilterReadPost *.out '[,']s/x/X/g 231669ea5872SBram Moolenaar augroup END 231769ea5872SBram Moolenaar 231869ea5872SBram Moolenaar e! test.out " Edit the output file 231969ea5872SBram Moolenaar 1,$!cat 232069ea5872SBram Moolenaar call assert_equal([ 232169ea5872SBram Moolenaar \ 'linE 2 AbcdefghijklmnopqrstuvwXyz', 232269ea5872SBram Moolenaar \ 'linE 3 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', 232369ea5872SBram Moolenaar \ 'linE 4 AbcdefghijklmnopqrstuvwXyz', 232469ea5872SBram Moolenaar \ 'linE 5 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', 232569ea5872SBram Moolenaar \ 'linE 6 AbcdefghijklmnopqrstuvwXyz', 232669ea5872SBram Moolenaar \ 'linE 7 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', 232769ea5872SBram Moolenaar \ 'linE 8 AbcdefghijklmnopqrstuvwXyz', 232869ea5872SBram Moolenaar \ 'linE 9 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', 232969ea5872SBram Moolenaar \ 'linE 10 AbcdefghijklmnopqrstuvwXyz' 233069ea5872SBram Moolenaar \ ], getline(1, 9)) 233169ea5872SBram Moolenaar call assert_equal([ 233269ea5872SBram Moolenaar \ 'line 2 Abcdefghijklmnopqrstuvwxyz', 233369ea5872SBram Moolenaar \ 'line 3 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 233469ea5872SBram Moolenaar \ 'line 4 Abcdefghijklmnopqrstuvwxyz', 233569ea5872SBram Moolenaar \ 'line 5 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 233669ea5872SBram Moolenaar \ 'line 6 Abcdefghijklmnopqrstuvwxyz', 233769ea5872SBram Moolenaar \ 'line 7 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 233869ea5872SBram Moolenaar \ 'line 8 Abcdefghijklmnopqrstuvwxyz', 233969ea5872SBram Moolenaar \ 'line 9 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 234069ea5872SBram Moolenaar \ 'line 10 Abcdefghijklmnopqrstuvwxyz' 234169ea5872SBram Moolenaar \ ], readfile('test.out')) 234269ea5872SBram Moolenaar 234369ea5872SBram Moolenaar augroup Test4 234469ea5872SBram Moolenaar au! 234569ea5872SBram Moolenaar augroup END 234669ea5872SBram Moolenaar set shelltemp&vim 234769ea5872SBram Moolenaar 234869ea5872SBram Moolenaar " Test for the FileReadPre and FileReadPost autocmds. 234969ea5872SBram Moolenaar augroup Test5 235069ea5872SBram Moolenaar au! 235169ea5872SBram Moolenaar au FileReadPre *.gz exe 'silent !gzip -d ' . shellescape(expand("<afile>")) 235269ea5872SBram Moolenaar au FileReadPre *.gz call rename(expand("<afile>:r"), expand("<afile>")) 235369ea5872SBram Moolenaar au FileReadPost *.gz '[,']s/l/L/ 235469ea5872SBram Moolenaar augroup END 235569ea5872SBram Moolenaar 235669ea5872SBram Moolenaar new 235769ea5872SBram Moolenaar 0r Xtestfile.gz " Read compressed file 235869ea5872SBram Moolenaar call assert_equal([ 235969ea5872SBram Moolenaar \ 'Line 2 Abcdefghijklmnopqrstuvwxyz', 236069ea5872SBram Moolenaar \ 'Line 3 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 236169ea5872SBram Moolenaar \ 'Line 4 Abcdefghijklmnopqrstuvwxyz', 236269ea5872SBram Moolenaar \ 'Line 5 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 236369ea5872SBram Moolenaar \ 'Line 6 Abcdefghijklmnopqrstuvwxyz', 236469ea5872SBram Moolenaar \ 'Line 7 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 236569ea5872SBram Moolenaar \ 'Line 8 Abcdefghijklmnopqrstuvwxyz', 236669ea5872SBram Moolenaar \ 'Line 9 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 236769ea5872SBram Moolenaar \ 'Line 10 Abcdefghijklmnopqrstuvwxyz' 236869ea5872SBram Moolenaar \ ], getline(1, 9)) 236969ea5872SBram Moolenaar call assert_equal([ 237069ea5872SBram Moolenaar \ 'line 2 Abcdefghijklmnopqrstuvwxyz', 237169ea5872SBram Moolenaar \ 'line 3 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 237269ea5872SBram Moolenaar \ 'line 4 Abcdefghijklmnopqrstuvwxyz', 237369ea5872SBram Moolenaar \ 'line 5 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 237469ea5872SBram Moolenaar \ 'line 6 Abcdefghijklmnopqrstuvwxyz', 237569ea5872SBram Moolenaar \ 'line 7 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 237669ea5872SBram Moolenaar \ 'line 8 Abcdefghijklmnopqrstuvwxyz', 237769ea5872SBram Moolenaar \ 'line 9 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 237869ea5872SBram Moolenaar \ 'line 10 Abcdefghijklmnopqrstuvwxyz' 237969ea5872SBram Moolenaar \ ], readfile('Xtestfile.gz')) 238069ea5872SBram Moolenaar 238169ea5872SBram Moolenaar augroup Test5 238269ea5872SBram Moolenaar au! 238369ea5872SBram Moolenaar augroup END 238469ea5872SBram Moolenaar 238569ea5872SBram Moolenaar au! FileChangedShell 238669ea5872SBram Moolenaar call delete('Xtestfile.gz') 238769ea5872SBram Moolenaar call delete('Xtest.c') 238869ea5872SBram Moolenaar call delete('test.out') 238969ea5872SBram Moolenaarendfunc 239023b51392SBram Moolenaar 239123b51392SBram Moolenaarfunc Test_throw_in_BufWritePre() 239223b51392SBram Moolenaar new 239323b51392SBram Moolenaar call setline(1, ['one', 'two', 'three']) 239423b51392SBram Moolenaar call assert_false(filereadable('Xthefile')) 239523b51392SBram Moolenaar augroup throwing 239623b51392SBram Moolenaar au BufWritePre X* throw 'do not write' 239723b51392SBram Moolenaar augroup END 239823b51392SBram Moolenaar try 239923b51392SBram Moolenaar w Xthefile 240023b51392SBram Moolenaar catch 240123b51392SBram Moolenaar let caught = 1 240223b51392SBram Moolenaar endtry 240323b51392SBram Moolenaar call assert_equal(1, caught) 240423b51392SBram Moolenaar call assert_false(filereadable('Xthefile')) 240523b51392SBram Moolenaar 240623b51392SBram Moolenaar bwipe! 240723b51392SBram Moolenaar au! throwing 240823b51392SBram Moolenaarendfunc 2409cadbe1b1SBram Moolenaar 241040fa12aeSBram Moolenaarfunc Test_autocmd_in_try_block() 241140fa12aeSBram Moolenaar call mkdir('Xdir') 241240fa12aeSBram Moolenaar au BufEnter * let g:fname = expand('%') 241340fa12aeSBram Moolenaar try 241440fa12aeSBram Moolenaar edit Xdir/ 241540fa12aeSBram Moolenaar endtry 241640fa12aeSBram Moolenaar call assert_match('Xdir', g:fname) 241740fa12aeSBram Moolenaar 241840fa12aeSBram Moolenaar unlet g:fname 241940fa12aeSBram Moolenaar au! BufEnter 242040fa12aeSBram Moolenaar call delete('Xdir', 'rf') 242140fa12aeSBram Moolenaarendfunc 242240fa12aeSBram Moolenaar 2423cadbe1b1SBram Moolenaarfunc Test_autocmd_SafeState() 2424cadbe1b1SBram Moolenaar CheckRunVimInTerminal 2425f08b0eb8SBram Moolenaar let g:test_is_flaky = 1 2426cadbe1b1SBram Moolenaar 2427cadbe1b1SBram Moolenaar let lines =<< trim END 2428cadbe1b1SBram Moolenaar let g:safe = 0 2429cadbe1b1SBram Moolenaar let g:again = '' 2430cadbe1b1SBram Moolenaar au SafeState * let g:safe += 1 2431cadbe1b1SBram Moolenaar au SafeStateAgain * let g:again ..= 'x' 2432cadbe1b1SBram Moolenaar func CallTimer() 2433cadbe1b1SBram Moolenaar call timer_start(10, {id -> execute('let g:again ..= "t"')}) 2434cadbe1b1SBram Moolenaar endfunc 2435cadbe1b1SBram Moolenaar END 2436cadbe1b1SBram Moolenaar call writefile(lines, 'XSafeState') 2437cadbe1b1SBram Moolenaar let buf = RunVimInTerminal('-S XSafeState', #{rows: 6}) 2438cadbe1b1SBram Moolenaar 24398e7d6223SBram Moolenaar " Sometimes we loop to handle a K_IGNORE, SafeState may be triggered once or 24408fb1b47aSBram Moolenaar " more often. 2441cadbe1b1SBram Moolenaar call term_sendkeys(buf, ":echo g:safe\<CR>") 24428fb1b47aSBram Moolenaar call WaitForAssert({-> assert_match('^\d ', term_getline(buf, 6))}, 1000) 2443cadbe1b1SBram Moolenaar 24448fb1b47aSBram Moolenaar " SafeStateAgain should be invoked at least three times 2445cadbe1b1SBram Moolenaar call term_sendkeys(buf, ":echo g:again\<CR>") 24468fb1b47aSBram Moolenaar call WaitForAssert({-> assert_match('^xxx', term_getline(buf, 6))}, 1000) 2447cadbe1b1SBram Moolenaar 2448cadbe1b1SBram Moolenaar call term_sendkeys(buf, ":let g:again = ''\<CR>:call CallTimer()\<CR>") 24496a2c5a7dSBram Moolenaar call TermWait(buf, 50) 24500f6629a0SBram Moolenaar call term_sendkeys(buf, ":\<CR>") 24516a2c5a7dSBram Moolenaar call TermWait(buf, 50) 2452cadbe1b1SBram Moolenaar call term_sendkeys(buf, ":echo g:again\<CR>") 2453cadbe1b1SBram Moolenaar call WaitForAssert({-> assert_match('xtx', term_getline(buf, 6))}, 1000) 2454cadbe1b1SBram Moolenaar 2455cadbe1b1SBram Moolenaar call StopVimInTerminal(buf) 2456cadbe1b1SBram Moolenaar call delete('XSafeState') 2457cadbe1b1SBram Moolenaarendfunc 245823324a0bSBram Moolenaar 245923324a0bSBram Moolenaarfunc Test_autocmd_CmdWinEnter() 246023324a0bSBram Moolenaar CheckRunVimInTerminal 246121829c5fSBram Moolenaar CheckFeature cmdwin 246221829c5fSBram Moolenaar 246323324a0bSBram Moolenaar let lines =<< trim END 2464125ffd21SEgor Zvorykin augroup vimHints | au! | augroup END 246523324a0bSBram Moolenaar let b:dummy_var = 'This is a dummy' 246623324a0bSBram Moolenaar autocmd CmdWinEnter * quit 246723324a0bSBram Moolenaar let winnr = winnr('$') 246823324a0bSBram Moolenaar END 246923324a0bSBram Moolenaar let filename = 'XCmdWinEnter' 247023324a0bSBram Moolenaar call writefile(lines, filename) 247123324a0bSBram Moolenaar let buf = RunVimInTerminal('-S '.filename, #{rows: 6}) 247223324a0bSBram Moolenaar 247323324a0bSBram Moolenaar call term_sendkeys(buf, "q:") 24746a2c5a7dSBram Moolenaar call TermWait(buf) 247523324a0bSBram Moolenaar call term_sendkeys(buf, ":echo b:dummy_var\<cr>") 2476353c351bSBram Moolenaar call WaitForAssert({-> assert_match('^This is a dummy', term_getline(buf, 6))}, 2000) 247723324a0bSBram Moolenaar call term_sendkeys(buf, ":echo &buftype\<cr>") 247823324a0bSBram Moolenaar call WaitForAssert({-> assert_notmatch('^nofile', term_getline(buf, 6))}, 1000) 247923324a0bSBram Moolenaar call term_sendkeys(buf, ":echo winnr\<cr>") 248023324a0bSBram Moolenaar call WaitForAssert({-> assert_match('^1', term_getline(buf, 6))}, 1000) 248123324a0bSBram Moolenaar 248223324a0bSBram Moolenaar " clean up 248323324a0bSBram Moolenaar call StopVimInTerminal(buf) 248423324a0bSBram Moolenaar call delete(filename) 248523324a0bSBram Moolenaarendfunc 2486ec66c41dSBram Moolenaar 2487ec66c41dSBram Moolenaarfunc Test_autocmd_was_using_freed_memory() 24885a4c3082SBram Moolenaar CheckFeature quickfix 24895a4c3082SBram Moolenaar 2490ec66c41dSBram Moolenaar pedit xx 2491ec66c41dSBram Moolenaar n x 249292bb83e4SBram Moolenaar augroup winenter 249392bb83e4SBram Moolenaar au WinEnter * if winnr('$') > 2 | quit | endif 249492bb83e4SBram Moolenaar augroup END 2495ec66c41dSBram Moolenaar split 249692bb83e4SBram Moolenaar 249792bb83e4SBram Moolenaar augroup winenter 2498ec66c41dSBram Moolenaar au! WinEnter 249992bb83e4SBram Moolenaar augroup END 250092bb83e4SBram Moolenaar 250192bb83e4SBram Moolenaar bwipe xx 250292bb83e4SBram Moolenaar bwipe x 250392bb83e4SBram Moolenaar pclose 2504ec66c41dSBram Moolenaarendfunc 2505f4a1d1c0SBram Moolenaar 2506f4a1d1c0SBram Moolenaarfunc Test_BufWrite_lockmarks() 2507f08b0eb8SBram Moolenaar let g:test_is_flaky = 1 2508f4a1d1c0SBram Moolenaar edit! Xtest 2509f4a1d1c0SBram Moolenaar call setline(1, ['a', 'b', 'c', 'd']) 2510f4a1d1c0SBram Moolenaar 2511f4a1d1c0SBram Moolenaar " :lockmarks preserves the marks 2512f4a1d1c0SBram Moolenaar call SetChangeMarks(2, 3) 2513f4a1d1c0SBram Moolenaar lockmarks write 2514f4a1d1c0SBram Moolenaar call assert_equal([2, 3], [line("'["), line("']")]) 2515f4a1d1c0SBram Moolenaar 2516f4a1d1c0SBram Moolenaar " *WritePre autocmds get the correct line range, but lockmarks preserves the 2517f4a1d1c0SBram Moolenaar " original values for the user 2518f4a1d1c0SBram Moolenaar augroup lockmarks 2519f4a1d1c0SBram Moolenaar au! 2520f4a1d1c0SBram Moolenaar au BufWritePre,FilterWritePre * call assert_equal([1, 4], [line("'["), line("']")]) 2521f4a1d1c0SBram Moolenaar au FileWritePre * call assert_equal([3, 4], [line("'["), line("']")]) 2522f4a1d1c0SBram Moolenaar augroup END 2523f4a1d1c0SBram Moolenaar 2524f4a1d1c0SBram Moolenaar lockmarks write 2525f4a1d1c0SBram Moolenaar call assert_equal([2, 3], [line("'["), line("']")]) 2526f4a1d1c0SBram Moolenaar 2527f4a1d1c0SBram Moolenaar if executable('cat') 2528f4a1d1c0SBram Moolenaar lockmarks %!cat 2529f4a1d1c0SBram Moolenaar call assert_equal([2, 3], [line("'["), line("']")]) 2530f4a1d1c0SBram Moolenaar endif 2531f4a1d1c0SBram Moolenaar 2532f4a1d1c0SBram Moolenaar lockmarks 3,4write Xtest2 2533f4a1d1c0SBram Moolenaar call assert_equal([2, 3], [line("'["), line("']")]) 2534f4a1d1c0SBram Moolenaar 2535f4a1d1c0SBram Moolenaar au! lockmarks 2536f4a1d1c0SBram Moolenaar augroup! lockmarks 2537f4a1d1c0SBram Moolenaar call delete('Xtest') 2538f4a1d1c0SBram Moolenaar call delete('Xtest2') 2539f4a1d1c0SBram Moolenaarendfunc 2540ce6db027SBram Moolenaar 2541ce6db027SBram Moolenaarfunc Test_FileType_spell() 2542ce6db027SBram Moolenaar if !isdirectory('/tmp') 2543ce6db027SBram Moolenaar throw "Skipped: requires /tmp directory" 2544ce6db027SBram Moolenaar endif 2545ce6db027SBram Moolenaar 2546ce6db027SBram Moolenaar " this was crashing with an invalid free() 2547ce6db027SBram Moolenaar setglobal spellfile=/tmp/en.utf-8.add 2548ce6db027SBram Moolenaar augroup crash 2549ce6db027SBram Moolenaar autocmd! 2550ce6db027SBram Moolenaar autocmd BufNewFile,BufReadPost crashfile setf somefiletype 2551ce6db027SBram Moolenaar autocmd BufNewFile,BufReadPost crashfile set ft=anotherfiletype 2552ce6db027SBram Moolenaar autocmd FileType anotherfiletype setlocal spell 2553ce6db027SBram Moolenaar augroup END 2554ce6db027SBram Moolenaar func! NoCrash() abort 2555ce6db027SBram Moolenaar edit /tmp/crashfile 2556ce6db027SBram Moolenaar endfunc 2557ce6db027SBram Moolenaar call NoCrash() 2558ce6db027SBram Moolenaar 2559ce6db027SBram Moolenaar au! crash 2560ce6db027SBram Moolenaar setglobal spellfile= 2561ce6db027SBram Moolenaarendfunc 2562bc2b71d4SBram Moolenaar 2563406cd90fSBram Moolenaar" Test closing a window or editing another buffer from a FileChangedRO handler 2564406cd90fSBram Moolenaar" in a readonly buffer 2565406cd90fSBram Moolenaarfunc Test_FileChangedRO_winclose() 256662cd26a2SBram Moolenaar call test_override('ui_delay', 10) 256762cd26a2SBram Moolenaar 2568406cd90fSBram Moolenaar augroup FileChangedROTest 2569406cd90fSBram Moolenaar au! 2570406cd90fSBram Moolenaar autocmd FileChangedRO * quit 2571406cd90fSBram Moolenaar augroup END 2572406cd90fSBram Moolenaar new 2573406cd90fSBram Moolenaar set readonly 2574406cd90fSBram Moolenaar call assert_fails('normal i', 'E788:') 2575406cd90fSBram Moolenaar close 2576406cd90fSBram Moolenaar augroup! FileChangedROTest 2577406cd90fSBram Moolenaar 2578406cd90fSBram Moolenaar augroup FileChangedROTest 2579406cd90fSBram Moolenaar au! 2580406cd90fSBram Moolenaar autocmd FileChangedRO * edit Xfile 2581406cd90fSBram Moolenaar augroup END 2582406cd90fSBram Moolenaar new 2583406cd90fSBram Moolenaar set readonly 2584406cd90fSBram Moolenaar call assert_fails('normal i', 'E788:') 2585406cd90fSBram Moolenaar close 2586406cd90fSBram Moolenaar augroup! FileChangedROTest 258762cd26a2SBram Moolenaar call test_override('ALL', 0) 2588406cd90fSBram Moolenaarendfunc 2589406cd90fSBram Moolenaar 25900c81d1b1SBram Moolenaarfunc LogACmd() 25910c81d1b1SBram Moolenaar call add(g:logged, line('$')) 25920c81d1b1SBram Moolenaarendfunc 25930c81d1b1SBram Moolenaar 25940c81d1b1SBram Moolenaarfunc Test_TermChanged() 2595d28e0b36SBram Moolenaar CheckNotGui 2596d28e0b36SBram Moolenaar 25970c81d1b1SBram Moolenaar enew! 25980c81d1b1SBram Moolenaar tabnew 25990c81d1b1SBram Moolenaar call setline(1, ['a', 'b', 'c', 'd']) 26000c81d1b1SBram Moolenaar $ 26010c81d1b1SBram Moolenaar au TermChanged * call LogACmd() 26020c81d1b1SBram Moolenaar let g:logged = [] 26030c81d1b1SBram Moolenaar let term_save = &term 26040c81d1b1SBram Moolenaar set term=xterm 26050c81d1b1SBram Moolenaar call assert_equal([1, 4], g:logged) 26060c81d1b1SBram Moolenaar 26070c81d1b1SBram Moolenaar au! TermChanged 26080c81d1b1SBram Moolenaar let &term = term_save 26090c81d1b1SBram Moolenaar bwipe! 26100c81d1b1SBram Moolenaarendfunc 26110c81d1b1SBram Moolenaar 2612e3284878SBram Moolenaar" Test for FileReadCmd autocmd 2613e3284878SBram Moolenaarfunc Test_autocmd_FileReadCmd() 2614e3284878SBram Moolenaar func ReadFileCmd() 2615e3284878SBram Moolenaar call append(line('$'), "v:cmdarg = " .. v:cmdarg) 2616e3284878SBram Moolenaar endfunc 2617e3284878SBram Moolenaar augroup FileReadCmdTest 2618e3284878SBram Moolenaar au! 2619e3284878SBram Moolenaar au FileReadCmd Xtest call ReadFileCmd() 2620e3284878SBram Moolenaar augroup END 2621e3284878SBram Moolenaar 2622e3284878SBram Moolenaar new 2623e3284878SBram Moolenaar read ++bin Xtest 2624e3284878SBram Moolenaar read ++nobin Xtest 2625e3284878SBram Moolenaar read ++edit Xtest 2626e3284878SBram Moolenaar read ++bad=keep Xtest 2627e3284878SBram Moolenaar read ++bad=drop Xtest 2628e3284878SBram Moolenaar read ++bad=- Xtest 2629e3284878SBram Moolenaar read ++ff=unix Xtest 2630e3284878SBram Moolenaar read ++ff=dos Xtest 2631e3284878SBram Moolenaar read ++ff=mac Xtest 2632e3284878SBram Moolenaar read ++enc=utf-8 Xtest 2633e3284878SBram Moolenaar 2634e3284878SBram Moolenaar call assert_equal(['', 2635e3284878SBram Moolenaar \ 'v:cmdarg = ++bin', 2636e3284878SBram Moolenaar \ 'v:cmdarg = ++nobin', 2637e3284878SBram Moolenaar \ 'v:cmdarg = ++edit', 2638e3284878SBram Moolenaar \ 'v:cmdarg = ++bad=keep', 2639e3284878SBram Moolenaar \ 'v:cmdarg = ++bad=drop', 2640e3284878SBram Moolenaar \ 'v:cmdarg = ++bad=-', 2641e3284878SBram Moolenaar \ 'v:cmdarg = ++ff=unix', 2642e3284878SBram Moolenaar \ 'v:cmdarg = ++ff=dos', 2643e3284878SBram Moolenaar \ 'v:cmdarg = ++ff=mac', 2644e3284878SBram Moolenaar \ 'v:cmdarg = ++enc=utf-8'], getline(1, '$')) 2645e3284878SBram Moolenaar 2646e3284878SBram Moolenaar close! 2647e3284878SBram Moolenaar augroup FileReadCmdTest 2648e3284878SBram Moolenaar au! 2649e3284878SBram Moolenaar augroup END 2650e3284878SBram Moolenaar delfunc ReadFileCmd 2651e3284878SBram Moolenaarendfunc 2652e3284878SBram Moolenaar 2653ee4e0c1eSBram Moolenaar" Test for passing invalid arguments to autocmd 2654ee4e0c1eSBram Moolenaarfunc Test_autocmd_invalid_args() 2655ee4e0c1eSBram Moolenaar " Additional character after * for event 2656ee4e0c1eSBram Moolenaar call assert_fails('autocmd *a Xfile set ff=unix', 'E215:') 2657ee4e0c1eSBram Moolenaar augroup Test 2658ee4e0c1eSBram Moolenaar augroup END 2659ee4e0c1eSBram Moolenaar " Invalid autocmd event 2660ee4e0c1eSBram Moolenaar call assert_fails('autocmd Bufabc Xfile set ft=vim', 'E216:') 2661ee4e0c1eSBram Moolenaar " Invalid autocmd event in a autocmd group 2662ee4e0c1eSBram Moolenaar call assert_fails('autocmd Test Bufabc Xfile set ft=vim', 'E216:') 2663ee4e0c1eSBram Moolenaar augroup! Test 2664ee4e0c1eSBram Moolenaar " Execute all autocmds 2665ee4e0c1eSBram Moolenaar call assert_fails('doautocmd * BufEnter', 'E217:') 2666ee4e0c1eSBram Moolenaar call assert_fails('augroup! x1a2b3', 'E367:') 2667ee4e0c1eSBram Moolenaar call assert_fails('autocmd BufNew <buffer=999> pwd', 'E680:') 2668531be47aSBram Moolenaar call assert_fails('autocmd BufNew \) set ff=unix', 'E55:') 2669ee4e0c1eSBram Moolenaarendfunc 2670ee4e0c1eSBram Moolenaar 2671ee4e0c1eSBram Moolenaar" Test for deep nesting of autocmds 2672ee4e0c1eSBram Moolenaarfunc Test_autocmd_deep_nesting() 2673ee4e0c1eSBram Moolenaar autocmd BufEnter Xfile doautocmd BufEnter Xfile 2674ee4e0c1eSBram Moolenaar call assert_fails('doautocmd BufEnter Xfile', 'E218:') 2675ee4e0c1eSBram Moolenaar autocmd! BufEnter Xfile 2676ee4e0c1eSBram Moolenaarendfunc 2677ee4e0c1eSBram Moolenaar 2678be5ee868SBram Moolenaar" Tests for SigUSR1 autocmd event, which is only available on posix systems. 2679be5ee868SBram Moolenaarfunc Test_autocmd_sigusr1() 2680be5ee868SBram Moolenaar CheckUnix 268162cd26a2SBram Moolenaar CheckExecutable /bin/kill 2682be5ee868SBram Moolenaar 2683be5ee868SBram Moolenaar let g:sigusr1_passed = 0 2684be5ee868SBram Moolenaar au SigUSR1 * let g:sigusr1_passed = 1 2685be5ee868SBram Moolenaar call system('/bin/kill -s usr1 ' . getpid()) 2686be5ee868SBram Moolenaar call WaitForAssert({-> assert_true(g:sigusr1_passed)}) 2687be5ee868SBram Moolenaar 2688be5ee868SBram Moolenaar au! SigUSR1 2689be5ee868SBram Moolenaar unlet g:sigusr1_passed 2690be5ee868SBram Moolenaarendfunc 2691be5ee868SBram Moolenaar 2692b340baedSBram Moolenaar" Test for BufReadPre autocmd deleting the file 2693b340baedSBram Moolenaarfunc Test_BufReadPre_delfile() 2694b340baedSBram Moolenaar augroup TestAuCmd 2695b340baedSBram Moolenaar au! 2696b340baedSBram Moolenaar autocmd BufReadPre Xfile call delete('Xfile') 2697b340baedSBram Moolenaar augroup END 2698b340baedSBram Moolenaar call writefile([], 'Xfile') 2699b340baedSBram Moolenaar call assert_fails('new Xfile', 'E200:') 2700b340baedSBram Moolenaar call assert_equal('Xfile', @%) 2701b340baedSBram Moolenaar call assert_equal(1, &readonly) 2702b340baedSBram Moolenaar call delete('Xfile') 2703b340baedSBram Moolenaar augroup TestAuCmd 2704b340baedSBram Moolenaar au! 2705b340baedSBram Moolenaar augroup END 2706b340baedSBram Moolenaar close! 2707b340baedSBram Moolenaarendfunc 2708b340baedSBram Moolenaar 2709b340baedSBram Moolenaar" Test for BufReadPre autocmd changing the current buffer 2710b340baedSBram Moolenaarfunc Test_BufReadPre_changebuf() 2711b340baedSBram Moolenaar augroup TestAuCmd 2712b340baedSBram Moolenaar au! 2713b340baedSBram Moolenaar autocmd BufReadPre Xfile edit Xsomeotherfile 2714b340baedSBram Moolenaar augroup END 2715b340baedSBram Moolenaar call writefile([], 'Xfile') 2716b340baedSBram Moolenaar call assert_fails('new Xfile', 'E201:') 2717b340baedSBram Moolenaar call assert_equal('Xsomeotherfile', @%) 2718b340baedSBram Moolenaar call assert_equal(1, &readonly) 2719b340baedSBram Moolenaar call delete('Xfile') 2720b340baedSBram Moolenaar augroup TestAuCmd 2721b340baedSBram Moolenaar au! 2722b340baedSBram Moolenaar augroup END 2723b340baedSBram Moolenaar close! 2724b340baedSBram Moolenaarendfunc 2725b340baedSBram Moolenaar 2726b340baedSBram Moolenaar" Test for BufWipeouti autocmd changing the current buffer when reading a file 2727b340baedSBram Moolenaar" in an empty buffer with 'f' flag in 'cpo' 2728b340baedSBram Moolenaarfunc Test_BufDelete_changebuf() 2729b340baedSBram Moolenaar new 2730b340baedSBram Moolenaar augroup TestAuCmd 2731b340baedSBram Moolenaar au! 2732b340baedSBram Moolenaar autocmd BufWipeout * let bufnr = bufadd('somefile') | exe "b " .. bufnr 2733b340baedSBram Moolenaar augroup END 2734b340baedSBram Moolenaar let save_cpo = &cpo 2735b340baedSBram Moolenaar set cpo+=f 27369b7bf9e9SBram Moolenaar call assert_fails('r Xfile', ['E812:', 'E484:']) 2737b340baedSBram Moolenaar call assert_equal('somefile', @%) 2738b340baedSBram Moolenaar let &cpo = save_cpo 2739b340baedSBram Moolenaar augroup TestAuCmd 2740b340baedSBram Moolenaar au! 2741b340baedSBram Moolenaar augroup END 2742b340baedSBram Moolenaar close! 2743b340baedSBram Moolenaarendfunc 2744b340baedSBram Moolenaar 27450fe937fdSBram Moolenaar" Test for the temporary internal window used to execute autocmds 27460fe937fdSBram Moolenaarfunc Test_autocmd_window() 27470fe937fdSBram Moolenaar %bw! 27480fe937fdSBram Moolenaar edit one.txt 27490fe937fdSBram Moolenaar tabnew two.txt 275041cd8033SBram Moolenaar vnew three.txt 275141cd8033SBram Moolenaar tabnew four.txt 275241cd8033SBram Moolenaar tabprevious 27530fe937fdSBram Moolenaar let g:blist = [] 2754832adf9bSBram Moolenaar augroup aucmd_win_test1 27550fe937fdSBram Moolenaar au! 27560fe937fdSBram Moolenaar au BufEnter * call add(g:blist, [expand('<afile>'), 27570fe937fdSBram Moolenaar \ win_gettype(bufwinnr(expand('<afile>')))]) 27580fe937fdSBram Moolenaar augroup END 27590fe937fdSBram Moolenaar 27600fe937fdSBram Moolenaar doautoall BufEnter 276141cd8033SBram Moolenaar call assert_equal([ 276241cd8033SBram Moolenaar \ ['one.txt', 'autocmd'], 276341cd8033SBram Moolenaar \ ['two.txt', ''], 276441cd8033SBram Moolenaar \ ['four.txt', 'autocmd'], 276541cd8033SBram Moolenaar \ ['three.txt', ''], 276641cd8033SBram Moolenaar \ ], g:blist) 27670fe937fdSBram Moolenaar 2768832adf9bSBram Moolenaar augroup aucmd_win_test1 27690fe937fdSBram Moolenaar au! 27700fe937fdSBram Moolenaar augroup END 2771832adf9bSBram Moolenaar augroup! aucmd_win_test1 2772832adf9bSBram Moolenaar %bw! 2773832adf9bSBram Moolenaarendfunc 2774832adf9bSBram Moolenaar 2775832adf9bSBram Moolenaar" Test for trying to close the temporary window used for executing an autocmd 2776832adf9bSBram Moolenaarfunc Test_close_autocmd_window() 2777832adf9bSBram Moolenaar %bw! 2778832adf9bSBram Moolenaar edit one.txt 2779832adf9bSBram Moolenaar tabnew two.txt 2780832adf9bSBram Moolenaar augroup aucmd_win_test2 2781832adf9bSBram Moolenaar au! 2782832adf9bSBram Moolenaar au BufEnter * if expand('<afile>') == 'one.txt' | 1close | endif 2783832adf9bSBram Moolenaar augroup END 2784832adf9bSBram Moolenaar 2785832adf9bSBram Moolenaar call assert_fails('doautoall BufEnter', 'E813:') 2786832adf9bSBram Moolenaar 2787832adf9bSBram Moolenaar augroup aucmd_win_test2 2788832adf9bSBram Moolenaar au! 2789832adf9bSBram Moolenaar augroup END 2790832adf9bSBram Moolenaar augroup! aucmd_win_test2 2791cf844170SBram Moolenaar %bwipe! 2792cf844170SBram Moolenaarendfunc 2793cf844170SBram Moolenaar 2794cf844170SBram Moolenaar" Test for trying to close the tab that has the temporary window for exeucing 2795cf844170SBram Moolenaar" an autocmd. 2796cf844170SBram Moolenaarfunc Test_close_autocmd_tab() 2797cf844170SBram Moolenaar edit one.txt 2798cf844170SBram Moolenaar tabnew two.txt 2799cf844170SBram Moolenaar augroup aucmd_win_test 2800cf844170SBram Moolenaar au! 2801cf844170SBram Moolenaar au BufEnter * if expand('<afile>') == 'one.txt' | tabfirst | tabonly | endif 2802cf844170SBram Moolenaar augroup END 2803cf844170SBram Moolenaar 2804cf844170SBram Moolenaar call assert_fails('doautoall BufEnter', 'E813:') 2805cf844170SBram Moolenaar 2806cf844170SBram Moolenaar tabonly 2807cf844170SBram Moolenaar augroup aucmd_win_test 2808cf844170SBram Moolenaar au! 2809cf844170SBram Moolenaar augroup END 2810cf844170SBram Moolenaar augroup! aucmd_win_test 2811cf844170SBram Moolenaar %bwipe! 28120fe937fdSBram Moolenaarendfunc 28130fe937fdSBram Moolenaar 28146bcb877eSBram Moolenaar" This was using freed memory. 28156bcb877eSBram Moolenaarfunc Test_BufNew_arglocal() 28166bcb877eSBram Moolenaar arglocal 28176bcb877eSBram Moolenaar au BufNew * arglocal 28186bcb877eSBram Moolenaar call assert_fails('drop xx', 'E1156:') 28196bcb877eSBram Moolenaar 28206bcb877eSBram Moolenaar au! BufNew 28216bcb877eSBram Moolenaarendfunc 28226bcb877eSBram Moolenaar 28238ab37570SBram Moolenaarfunc Test_autocmd_closes_window() 28248ab37570SBram Moolenaar au BufNew,BufWinLeave * e %e 28258ab37570SBram Moolenaar file yyy 28268ab37570SBram Moolenaar au BufNew,BufWinLeave * ball 2827aad5f9d7SBram Moolenaar n xxx 28288ab37570SBram Moolenaar 2829aad5f9d7SBram Moolenaar %bwipe 28308ab37570SBram Moolenaar au! BufNew 28318ab37570SBram Moolenaar au! BufWinLeave 28328ab37570SBram Moolenaarendfunc 28338ab37570SBram Moolenaar 283492bb83e4SBram Moolenaarfunc Test_autocmd_quit_psearch() 283592bb83e4SBram Moolenaar sn aa bb 283692bb83e4SBram Moolenaar augroup aucmd_win_test 283792bb83e4SBram Moolenaar au! 283892bb83e4SBram Moolenaar au BufEnter,BufLeave,BufNew,WinEnter,WinLeave,WinNew * if winnr('$') > 1 | q | endif 283992bb83e4SBram Moolenaar augroup END 284092bb83e4SBram Moolenaar ps / 284192bb83e4SBram Moolenaar 284292bb83e4SBram Moolenaar augroup aucmd_win_test 284392bb83e4SBram Moolenaar au! 284492bb83e4SBram Moolenaar augroup END 284592bb83e4SBram Moolenaarendfunc 284692bb83e4SBram Moolenaar 2847aad5f9d7SBram Moolenaar" Fuzzer found some strange combination that caused a crash. 2848aad5f9d7SBram Moolenaarfunc Test_autocmd_normal_mess() 2849dd07c022SBram Moolenaar " For unknown reason this hangs on MS-Windows 2850dd07c022SBram Moolenaar CheckNotMSWindows 2851dd07c022SBram Moolenaar 2852aad5f9d7SBram Moolenaar augroup aucmd_normal_test 2853aad5f9d7SBram Moolenaar au BufLeave,BufWinLeave,BufHidden,BufUnload,BufDelete,BufWipeout * norm 7q/qc 2854aad5f9d7SBram Moolenaar augroup END 2855983d83ffSBram Moolenaar call assert_fails('o4', 'E1159') 2856aad5f9d7SBram Moolenaar silent! H 2857983d83ffSBram Moolenaar call assert_fails('e xx', 'E1159') 2858aad5f9d7SBram Moolenaar normal G 2859aad5f9d7SBram Moolenaar 2860aad5f9d7SBram Moolenaar augroup aucmd_normal_test 2861aad5f9d7SBram Moolenaar au! 2862aad5f9d7SBram Moolenaar augroup END 2863aad5f9d7SBram Moolenaarendfunc 2864aad5f9d7SBram Moolenaar 28658c6951faSBram Moolenaarfunc Test_autocmd_closing_cmdwin() 2866dd07c022SBram Moolenaar " For unknown reason this hangs on MS-Windows 2867dd07c022SBram Moolenaar CheckNotMSWindows 2868dd07c022SBram Moolenaar 28698c6951faSBram Moolenaar au BufWinLeave * nested q 28708c6951faSBram Moolenaar call assert_fails("norm 7q?\n", 'E855:') 28718c6951faSBram Moolenaar 28728c6951faSBram Moolenaar au! BufWinLeave 28738c6951faSBram Moolenaar new 28748c6951faSBram Moolenaar only 28758c6951faSBram Moolenaarendfunc 28768c6951faSBram Moolenaar 28772c7080bfSBram Moolenaarfunc Test_autocmd_vimgrep() 28782c7080bfSBram Moolenaar augroup aucmd_vimgrep 28792c7080bfSBram Moolenaar au QuickfixCmdPre,BufNew,BufDelete,BufReadCmd * sb 28802c7080bfSBram Moolenaar au QuickfixCmdPre,BufNew,BufDelete,BufReadCmd * q9 28812c7080bfSBram Moolenaar augroup END 2882983d83ffSBram Moolenaar %bwipe! 2883dd07c022SBram Moolenaar call assert_fails('lv ?a? foo', 'E926:') 28842c7080bfSBram Moolenaar 28852c7080bfSBram Moolenaar augroup aucmd_vimgrep 28862c7080bfSBram Moolenaar au! 28872c7080bfSBram Moolenaar augroup END 28882c7080bfSBram Moolenaarendfunc 28892c7080bfSBram Moolenaar 289073b8b0aeSBram Moolenaarfunc Test_autocmd_with_block() 289173b8b0aeSBram Moolenaar augroup block_testing 289273b8b0aeSBram Moolenaar au BufReadPost *.xml { 289373b8b0aeSBram Moolenaar setlocal matchpairs+=<:> 289473b8b0aeSBram Moolenaar /<start 289573b8b0aeSBram Moolenaar } 289663b91736SBram Moolenaar au CursorHold * { 289763b91736SBram Moolenaar autocmd BufReadPre * ++once echo 'one' | echo 'two' 289863b91736SBram Moolenaar g:gotSafeState = 77 289963b91736SBram Moolenaar } 290073b8b0aeSBram Moolenaar augroup END 290173b8b0aeSBram Moolenaar 290273b8b0aeSBram Moolenaar let expected = "\n--- Autocommands ---\nblock_testing BufRead\n *.xml {^@ setlocal matchpairs+=<:>^@ /<start^@ }" 290373b8b0aeSBram Moolenaar call assert_equal(expected, execute('au BufReadPost *.xml')) 290473b8b0aeSBram Moolenaar 290563b91736SBram Moolenaar doautocmd CursorHold 290663b91736SBram Moolenaar call assert_equal(77, g:gotSafeState) 290763b91736SBram Moolenaar unlet g:gotSafeState 290863b91736SBram Moolenaar 290973b8b0aeSBram Moolenaar augroup block_testing 291073b8b0aeSBram Moolenaar au! 291173b8b0aeSBram Moolenaar augroup END 291273b8b0aeSBram Moolenaarendfunc 291373b8b0aeSBram Moolenaar 2914db3b4464SChristian Brabandt" Test TextChangedI and TextChanged 2915db3b4464SChristian Brabandtfunc Test_Changed_ChangedI() 2916db3b4464SChristian Brabandt new 2917db3b4464SChristian Brabandt call test_override("char_avail", 1) 2918db3b4464SChristian Brabandt let [g:autocmd_i, g:autocmd_n] = ['',''] 2919db3b4464SChristian Brabandt 2920db3b4464SChristian Brabandt func! TextChangedAutocmdI(char) 2921db3b4464SChristian Brabandt let g:autocmd_{tolower(a:char)} = a:char .. b:changedtick 2922db3b4464SChristian Brabandt endfunc 2923db3b4464SChristian Brabandt 2924db3b4464SChristian Brabandt augroup Test_TextChanged 2925db3b4464SChristian Brabandt au! 2926db3b4464SChristian Brabandt au TextChanged <buffer> :call TextChangedAutocmdI('N') 2927db3b4464SChristian Brabandt au TextChangedI <buffer> :call TextChangedAutocmdI('I') 2928db3b4464SChristian Brabandt augroup END 2929db3b4464SChristian Brabandt 2930db3b4464SChristian Brabandt call feedkeys("ifoo\<esc>", 'tnix') 2931db3b4464SChristian Brabandt " TODO: Test test does not seem to trigger TextChanged autocommand, this 2932db3b4464SChristian Brabandt " requires running Vim in a terminal window. 2933db3b4464SChristian Brabandt " call assert_equal('N3', g:autocmd_n) 2934db3b4464SChristian Brabandt call assert_equal('I3', g:autocmd_i) 2935db3b4464SChristian Brabandt 2936db3b4464SChristian Brabandt call feedkeys("yyp", 'tnix') 2937db3b4464SChristian Brabandt " TODO: Test test does not seem to trigger TextChanged autocommand. 2938db3b4464SChristian Brabandt " call assert_equal('N4', g:autocmd_n) 2939db3b4464SChristian Brabandt call assert_equal('I3', g:autocmd_i) 2940db3b4464SChristian Brabandt 2941db3b4464SChristian Brabandt " CleanUp 2942db3b4464SChristian Brabandt call test_override("char_avail", 0) 2943db3b4464SChristian Brabandt au! TextChanged <buffer> 2944db3b4464SChristian Brabandt au! TextChangedI <buffer> 2945db3b4464SChristian Brabandt augroup! Test_TextChanged 2946db3b4464SChristian Brabandt delfu TextChangedAutocmdI 2947db3b4464SChristian Brabandt unlet! g:autocmd_i g:autocmd_n 2948db3b4464SChristian Brabandt 2949db3b4464SChristian Brabandt bw! 2950db3b4464SChristian Brabandtendfunc 29512c7080bfSBram Moolenaar 2952bc2b71d4SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab 2953