2016-11-14 08:19:06 -07:00
|
|
|
" Tests for autocommands
|
|
|
|
|
2017-03-21 02:15:22 -07:00
|
|
|
set belloff=all
|
|
|
|
|
2018-02-01 17:51:56 -07:00
|
|
|
func! s:cleanup_buffers() abort
|
2017-03-21 02:15:22 -07:00
|
|
|
for bnr in range(1, bufnr('$'))
|
|
|
|
if bufloaded(bnr) && bufnr('%') != bnr
|
|
|
|
execute 'bd! ' . bnr
|
|
|
|
endif
|
|
|
|
endfor
|
2018-02-01 17:51:56 -07:00
|
|
|
endfunc
|
2017-03-21 02:15:22 -07:00
|
|
|
|
2016-11-14 08:19:06 -07:00
|
|
|
func Test_vim_did_enter()
|
|
|
|
call assert_false(v:vim_did_enter)
|
|
|
|
|
|
|
|
" This script will never reach the main loop, can't check if v:vim_did_enter
|
|
|
|
" becomes one.
|
|
|
|
endfunc
|
2016-11-21 14:52:51 -07:00
|
|
|
|
2016-12-27 15:39:21 -07:00
|
|
|
if has('timers')
|
|
|
|
func ExitInsertMode(id)
|
|
|
|
call feedkeys("\<Esc>")
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
func Test_cursorhold_insert()
|
2017-03-21 02:19:01 -07:00
|
|
|
" Need to move the cursor.
|
|
|
|
call feedkeys("ggG", "xt")
|
|
|
|
|
2016-12-27 15:39:21 -07:00
|
|
|
let g:triggered = 0
|
|
|
|
au CursorHoldI * let g:triggered += 1
|
|
|
|
set updatetime=20
|
|
|
|
call timer_start(100, 'ExitInsertMode')
|
|
|
|
call feedkeys('a', 'x!')
|
|
|
|
call assert_equal(1, g:triggered)
|
2017-01-04 21:06:09 -07:00
|
|
|
au! CursorHoldI
|
2017-03-21 02:24:40 -07:00
|
|
|
set updatetime&
|
2016-12-27 15:39:21 -07:00
|
|
|
endfunc
|
|
|
|
|
|
|
|
func Test_cursorhold_insert_ctrl_x()
|
|
|
|
let g:triggered = 0
|
|
|
|
au CursorHoldI * let g:triggered += 1
|
|
|
|
set updatetime=20
|
|
|
|
call timer_start(100, 'ExitInsertMode')
|
|
|
|
" CursorHoldI does not trigger after CTRL-X
|
|
|
|
call feedkeys("a\<C-X>", 'x!')
|
|
|
|
call assert_equal(0, g:triggered)
|
2017-01-04 21:06:09 -07:00
|
|
|
au! CursorHoldI
|
2017-03-21 02:24:40 -07:00
|
|
|
set updatetime&
|
2016-12-27 15:39:21 -07:00
|
|
|
endfunc
|
2016-11-21 14:52:51 -07:00
|
|
|
endif
|
|
|
|
|
2018-02-01 17:51:56 -07:00
|
|
|
func Test_bufunload()
|
2016-12-27 15:39:21 -07:00
|
|
|
augroup test_bufunload_group
|
|
|
|
autocmd!
|
|
|
|
autocmd BufUnload * call add(s:li, "bufunload")
|
|
|
|
autocmd BufDelete * call add(s:li, "bufdelete")
|
|
|
|
autocmd BufWipeout * call add(s:li, "bufwipeout")
|
|
|
|
augroup END
|
2016-11-21 14:52:51 -07:00
|
|
|
|
2016-12-27 15:39:21 -07:00
|
|
|
let s:li=[]
|
|
|
|
new
|
|
|
|
setlocal bufhidden=
|
|
|
|
bunload
|
|
|
|
call assert_equal(["bufunload", "bufdelete"], s:li)
|
|
|
|
|
|
|
|
let s:li=[]
|
|
|
|
new
|
|
|
|
setlocal bufhidden=delete
|
|
|
|
bunload
|
|
|
|
call assert_equal(["bufunload", "bufdelete"], s:li)
|
|
|
|
|
|
|
|
let s:li=[]
|
|
|
|
new
|
|
|
|
setlocal bufhidden=unload
|
|
|
|
bwipeout
|
|
|
|
call assert_equal(["bufunload", "bufdelete", "bufwipeout"], s:li)
|
2016-11-21 14:52:51 -07:00
|
|
|
|
2017-01-04 21:06:09 -07:00
|
|
|
au! test_bufunload_group
|
2016-12-27 15:39:21 -07:00
|
|
|
augroup! test_bufunload_group
|
2016-11-21 14:52:51 -07:00
|
|
|
endfunc
|
2017-01-04 21:06:09 -07:00
|
|
|
|
2017-01-07 07:56:51 -07:00
|
|
|
" SEGV occurs in older versions. (At least 7.4.2005 or older)
|
2018-02-01 17:51:56 -07:00
|
|
|
func Test_autocmd_bufunload_with_tabnext()
|
2017-01-07 07:56:51 -07:00
|
|
|
tabedit
|
|
|
|
tabfirst
|
|
|
|
|
|
|
|
augroup test_autocmd_bufunload_with_tabnext_group
|
|
|
|
autocmd!
|
|
|
|
autocmd BufUnload <buffer> tabnext
|
|
|
|
augroup END
|
|
|
|
|
|
|
|
quit
|
|
|
|
call assert_equal(2, tabpagenr('$'))
|
|
|
|
|
2017-03-20 06:01:22 -07:00
|
|
|
autocmd! test_autocmd_bufunload_with_tabnext_group
|
2017-01-07 07:56:51 -07:00
|
|
|
augroup! test_autocmd_bufunload_with_tabnext_group
|
|
|
|
tablast
|
|
|
|
quit
|
|
|
|
endfunc
|
|
|
|
|
2018-02-01 17:51:56 -07:00
|
|
|
func Test_autocmd_bufwinleave_with_tabfirst()
|
2017-03-21 02:39:24 -07:00
|
|
|
tabedit
|
|
|
|
augroup sample
|
|
|
|
autocmd!
|
|
|
|
autocmd BufWinLeave <buffer> tabfirst
|
|
|
|
augroup END
|
|
|
|
call setline(1, ['a', 'b', 'c'])
|
|
|
|
edit! a.txt
|
|
|
|
tabclose
|
|
|
|
endfunc
|
|
|
|
|
2017-03-20 06:01:22 -07:00
|
|
|
" SEGV occurs in older versions. (At least 7.4.2321 or older)
|
2018-02-01 17:51:56 -07:00
|
|
|
func Test_autocmd_bufunload_avoiding_SEGV_01()
|
2017-03-20 06:01:22 -07:00
|
|
|
split aa.txt
|
|
|
|
let lastbuf = bufnr('$')
|
|
|
|
|
|
|
|
augroup test_autocmd_bufunload
|
|
|
|
autocmd!
|
|
|
|
exe 'autocmd BufUnload <buffer> ' . (lastbuf + 1) . 'bwipeout!'
|
|
|
|
augroup END
|
|
|
|
|
|
|
|
call assert_fails('edit bb.txt', 'E937:')
|
|
|
|
|
|
|
|
autocmd! test_autocmd_bufunload
|
|
|
|
augroup! test_autocmd_bufunload
|
|
|
|
bwipe! aa.txt
|
|
|
|
bwipe! bb.txt
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
" SEGV occurs in older versions. (At least 7.4.2321 or older)
|
2018-02-01 17:51:56 -07:00
|
|
|
func Test_autocmd_bufunload_avoiding_SEGV_02()
|
2017-03-20 06:01:22 -07:00
|
|
|
setlocal buftype=nowrite
|
|
|
|
let lastbuf = bufnr('$')
|
|
|
|
|
|
|
|
augroup test_autocmd_bufunload
|
|
|
|
autocmd!
|
|
|
|
exe 'autocmd BufUnload <buffer> ' . (lastbuf + 1) . 'bwipeout!'
|
|
|
|
augroup END
|
|
|
|
|
|
|
|
normal! i1
|
|
|
|
call assert_fails('edit a.txt', 'E517:')
|
|
|
|
call feedkeys("\<CR>")
|
|
|
|
|
|
|
|
autocmd! test_autocmd_bufunload
|
|
|
|
augroup! test_autocmd_bufunload
|
|
|
|
bwipe! a.txt
|
|
|
|
endfunc
|
|
|
|
|
2017-01-08 06:05:41 -07:00
|
|
|
func Test_win_tab_autocmd()
|
|
|
|
let g:record = []
|
|
|
|
|
|
|
|
augroup testing
|
|
|
|
au WinNew * call add(g:record, 'WinNew')
|
|
|
|
au WinEnter * call add(g:record, 'WinEnter')
|
|
|
|
au WinLeave * call add(g:record, 'WinLeave')
|
|
|
|
au TabNew * call add(g:record, 'TabNew')
|
2017-01-08 08:12:52 -07:00
|
|
|
au TabClosed * call add(g:record, 'TabClosed')
|
2017-01-08 06:05:41 -07:00
|
|
|
au TabEnter * call add(g:record, 'TabEnter')
|
|
|
|
au TabLeave * call add(g:record, 'TabLeave')
|
|
|
|
augroup END
|
|
|
|
|
|
|
|
split
|
|
|
|
tabnew
|
|
|
|
close
|
|
|
|
close
|
|
|
|
|
|
|
|
call assert_equal([
|
|
|
|
\ 'WinLeave', 'WinNew', 'WinEnter',
|
|
|
|
\ 'WinLeave', 'TabLeave', 'WinNew', 'WinEnter', 'TabNew', 'TabEnter',
|
2017-01-08 08:12:52 -07:00
|
|
|
\ 'WinLeave', 'TabLeave', 'TabClosed', 'WinEnter', 'TabEnter',
|
2017-01-08 06:05:41 -07:00
|
|
|
\ 'WinLeave', 'WinEnter'
|
|
|
|
\ ], g:record)
|
|
|
|
|
2017-01-08 08:12:52 -07:00
|
|
|
let g:record = []
|
|
|
|
tabnew somefile
|
|
|
|
tabnext
|
|
|
|
bwipe somefile
|
|
|
|
|
|
|
|
call assert_equal([
|
|
|
|
\ 'WinLeave', 'TabLeave', 'WinNew', 'WinEnter', 'TabNew', 'TabEnter',
|
|
|
|
\ 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter',
|
|
|
|
\ 'TabClosed'
|
|
|
|
\ ], g:record)
|
|
|
|
|
2017-01-08 06:05:41 -07:00
|
|
|
augroup testing
|
|
|
|
au!
|
|
|
|
augroup END
|
|
|
|
unlet g:record
|
|
|
|
endfunc
|
|
|
|
|
2017-01-04 21:06:09 -07:00
|
|
|
func s:AddAnAutocmd()
|
|
|
|
augroup vimBarTest
|
|
|
|
au BufReadCmd * echo 'hello'
|
|
|
|
augroup END
|
|
|
|
call assert_equal(3, len(split(execute('au vimBarTest'), "\n")))
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
func Test_early_bar()
|
|
|
|
" test that a bar is recognized before the {event}
|
|
|
|
call s:AddAnAutocmd()
|
|
|
|
augroup vimBarTest | au! | augroup END
|
|
|
|
call assert_equal(1, len(split(execute('au vimBarTest'), "\n")))
|
|
|
|
|
|
|
|
call s:AddAnAutocmd()
|
|
|
|
augroup vimBarTest| au!| augroup END
|
|
|
|
call assert_equal(1, len(split(execute('au vimBarTest'), "\n")))
|
|
|
|
|
|
|
|
" test that a bar is recognized after the {event}
|
|
|
|
call s:AddAnAutocmd()
|
|
|
|
augroup vimBarTest| au!BufReadCmd| augroup END
|
|
|
|
call assert_equal(1, len(split(execute('au vimBarTest'), "\n")))
|
|
|
|
|
|
|
|
" test that a bar is recognized after the {group}
|
|
|
|
call s:AddAnAutocmd()
|
|
|
|
au! vimBarTest|echo 'hello'
|
|
|
|
call assert_equal(1, len(split(execute('au vimBarTest'), "\n")))
|
|
|
|
endfunc
|
2017-01-08 17:41:45 -07:00
|
|
|
|
2017-01-08 20:00:56 -07:00
|
|
|
func RemoveGroup()
|
|
|
|
autocmd! StartOK
|
|
|
|
augroup! StartOK
|
|
|
|
endfunc
|
|
|
|
|
2017-01-08 17:41:45 -07:00
|
|
|
func Test_augroup_warning()
|
|
|
|
augroup TheWarning
|
|
|
|
au VimEnter * echo 'entering'
|
|
|
|
augroup END
|
|
|
|
call assert_true(match(execute('au VimEnter'), "TheWarning.*VimEnter") >= 0)
|
|
|
|
redir => res
|
|
|
|
augroup! TheWarning
|
|
|
|
redir END
|
|
|
|
call assert_true(match(res, "W19:") >= 0)
|
|
|
|
call assert_true(match(execute('au VimEnter'), "-Deleted-.*VimEnter") >= 0)
|
|
|
|
|
|
|
|
" check "Another" does not take the pace of the deleted entry
|
|
|
|
augroup Another
|
|
|
|
augroup END
|
|
|
|
call assert_true(match(execute('au VimEnter'), "-Deleted-.*VimEnter") >= 0)
|
2017-03-21 02:24:40 -07:00
|
|
|
augroup! Another
|
2017-01-08 20:00:56 -07:00
|
|
|
|
|
|
|
" no warning for postpone aucmd delete
|
|
|
|
augroup StartOK
|
|
|
|
au VimEnter * call RemoveGroup()
|
|
|
|
augroup END
|
|
|
|
call assert_true(match(execute('au VimEnter'), "StartOK.*VimEnter") >= 0)
|
|
|
|
redir => res
|
|
|
|
doautocmd VimEnter
|
|
|
|
redir END
|
|
|
|
call assert_true(match(res, "W19:") < 0)
|
2017-01-08 21:15:10 -07:00
|
|
|
au! VimEnter
|
2017-01-08 17:41:45 -07:00
|
|
|
endfunc
|
2017-01-08 21:01:50 -07:00
|
|
|
|
|
|
|
func Test_augroup_deleted()
|
2017-01-08 21:15:10 -07:00
|
|
|
" This caused a crash before E936 was introduced
|
2017-01-08 21:01:50 -07:00
|
|
|
augroup x
|
2017-01-08 21:15:10 -07:00
|
|
|
call assert_fails('augroup! x', 'E936:')
|
|
|
|
au VimEnter * echo
|
|
|
|
augroup end
|
2017-01-08 21:01:50 -07:00
|
|
|
augroup! x
|
2017-01-08 21:15:10 -07:00
|
|
|
call assert_true(match(execute('au VimEnter'), "-Deleted-.*VimEnter") >= 0)
|
|
|
|
au! VimEnter
|
2017-01-08 21:01:50 -07:00
|
|
|
endfunc
|
|
|
|
|
2017-03-20 06:01:22 -07:00
|
|
|
" Tests for autocommands on :close command.
|
|
|
|
" This used to be in test13.
|
|
|
|
func Test_three_windows()
|
2017-03-21 02:15:22 -07:00
|
|
|
" Clean up buffers, because in some cases this function fails.
|
|
|
|
call s:cleanup_buffers()
|
|
|
|
|
2017-03-20 06:01:22 -07:00
|
|
|
" Write three files and open them, each in a window.
|
|
|
|
" Then go to next window, with autocommand that deletes the previous one.
|
|
|
|
" Do this twice, writing the file.
|
|
|
|
e! Xtestje1
|
|
|
|
call setline(1, 'testje1')
|
|
|
|
w
|
|
|
|
sp Xtestje2
|
|
|
|
call setline(1, 'testje2')
|
|
|
|
w
|
|
|
|
sp Xtestje3
|
|
|
|
call setline(1, 'testje3')
|
|
|
|
w
|
|
|
|
wincmd w
|
|
|
|
au WinLeave Xtestje2 bwipe
|
|
|
|
wincmd w
|
|
|
|
call assert_equal('Xtestje1', expand('%'))
|
|
|
|
|
|
|
|
au WinLeave Xtestje1 bwipe Xtestje3
|
|
|
|
close
|
|
|
|
call assert_equal('Xtestje1', expand('%'))
|
|
|
|
|
|
|
|
" Test deleting the buffer on a Unload event. If this goes wrong there
|
|
|
|
" will be the ATTENTION prompt.
|
|
|
|
e Xtestje1
|
|
|
|
au!
|
|
|
|
au! BufUnload Xtestje1 bwipe
|
|
|
|
call assert_fails('e Xtestje3', 'E937:')
|
|
|
|
call assert_equal('Xtestje3', expand('%'))
|
|
|
|
|
|
|
|
e Xtestje2
|
|
|
|
sp Xtestje1
|
|
|
|
call assert_fails('e', 'E937:')
|
|
|
|
call assert_equal('Xtestje2', expand('%'))
|
|
|
|
|
|
|
|
" Test changing buffers in a BufWipeout autocommand. If this goes wrong
|
|
|
|
" there are ml_line errors and/or a Crash.
|
|
|
|
au!
|
|
|
|
only
|
|
|
|
e Xanother
|
|
|
|
e Xtestje1
|
|
|
|
bwipe Xtestje2
|
|
|
|
bwipe Xtestje3
|
|
|
|
au BufWipeout Xtestje1 buf Xtestje1
|
|
|
|
bwipe
|
|
|
|
call assert_equal('Xanother', expand('%'))
|
|
|
|
|
|
|
|
only
|
2017-03-21 17:19:13 -07:00
|
|
|
|
|
|
|
helptags ALL
|
2017-03-20 06:01:22 -07:00
|
|
|
help
|
|
|
|
wincmd w
|
|
|
|
1quit
|
|
|
|
call assert_equal('Xanother', expand('%'))
|
|
|
|
|
|
|
|
au!
|
2017-03-21 15:36:27 -07:00
|
|
|
enew
|
|
|
|
bwipe! Xtestje1
|
2017-03-20 06:01:22 -07:00
|
|
|
call delete('Xtestje1')
|
|
|
|
call delete('Xtestje2')
|
|
|
|
call delete('Xtestje3')
|
|
|
|
endfunc
|
|
|
|
|
2017-03-20 05:59:11 -07:00
|
|
|
func Test_BufEnter()
|
|
|
|
au! BufEnter
|
|
|
|
au Bufenter * let val = val . '+'
|
|
|
|
let g:val = ''
|
|
|
|
split NewFile
|
|
|
|
call assert_equal('+', g:val)
|
|
|
|
bwipe!
|
|
|
|
call assert_equal('++', g:val)
|
|
|
|
|
|
|
|
" Also get BufEnter when editing a directory
|
|
|
|
call mkdir('Xdir')
|
|
|
|
split Xdir
|
|
|
|
call assert_equal('+++', g:val)
|
2017-07-30 18:54:18 -07:00
|
|
|
|
|
|
|
" On MS-Windows we can't edit the directory, make sure we wipe the right
|
|
|
|
" buffer.
|
|
|
|
bwipe! Xdir
|
2017-03-20 05:59:11 -07:00
|
|
|
|
|
|
|
call delete('Xdir', 'd')
|
|
|
|
au! BufEnter
|
|
|
|
endfunc
|
|
|
|
|
2017-03-19 18:48:28 -07:00
|
|
|
" Closing a window might cause an endless loop
|
|
|
|
" E814 for older Vims
|
2018-02-01 17:51:56 -07:00
|
|
|
func Test_autocmd_bufwipe_in_SessLoadPost()
|
2017-03-19 18:48:28 -07:00
|
|
|
tabnew
|
|
|
|
set noswapfile
|
|
|
|
mksession!
|
|
|
|
|
2017-07-30 18:54:18 -07:00
|
|
|
let content = ['set nocp noswapfile',
|
2017-03-19 18:48:28 -07:00
|
|
|
\ 'let v:swapchoice="e"',
|
|
|
|
\ 'augroup test_autocmd_sessionload',
|
|
|
|
\ 'autocmd!',
|
2017-07-30 18:54:18 -07:00
|
|
|
\ 'autocmd SessionLoadPost * 4bw!',
|
2017-03-21 02:47:46 -07:00
|
|
|
\ 'augroup END',
|
2017-07-30 18:54:18 -07:00
|
|
|
\ '',
|
|
|
|
\ 'func WriteErrors()',
|
|
|
|
\ ' call writefile([execute("messages")], "Xerrors")',
|
|
|
|
\ 'endfunc',
|
|
|
|
\ 'au VimLeave * call WriteErrors()',
|
2017-03-19 18:48:28 -07:00
|
|
|
\ ]
|
|
|
|
call writefile(content, 'Xvimrc')
|
2017-07-30 18:54:18 -07:00
|
|
|
call system(v:progpath. ' --headless -i NONE -u Xvimrc --noplugins -S Session.vim -c cq')
|
|
|
|
let errors = join(readfile('Xerrors'))
|
|
|
|
call assert_match('E814', errors)
|
2017-03-19 18:48:28 -07:00
|
|
|
|
|
|
|
set swapfile
|
2017-07-30 18:54:18 -07:00
|
|
|
for file in ['Session.vim', 'Xvimrc', 'Xerrors']
|
2017-03-19 18:48:28 -07:00
|
|
|
call delete(file)
|
|
|
|
endfor
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
" SEGV occurs in older versions.
|
2018-02-01 17:51:56 -07:00
|
|
|
func Test_autocmd_bufwipe_in_SessLoadPost2()
|
2017-03-19 18:48:28 -07:00
|
|
|
tabnew
|
|
|
|
set noswapfile
|
|
|
|
mksession!
|
|
|
|
|
|
|
|
let content = ['set nocp noswapfile',
|
|
|
|
\ 'function! DeleteInactiveBufs()',
|
|
|
|
\ ' tabfirst',
|
|
|
|
\ ' let tabblist = []',
|
|
|
|
\ ' for i in range(1, tabpagenr(''$''))',
|
|
|
|
\ ' call extend(tabblist, tabpagebuflist(i))',
|
|
|
|
\ ' endfor',
|
|
|
|
\ ' for b in range(1, bufnr(''$''))',
|
|
|
|
\ ' if bufexists(b) && buflisted(b) && (index(tabblist, b) == -1 || bufname(b) =~# ''^$'')',
|
|
|
|
\ ' exec ''bwipeout '' . b',
|
|
|
|
\ ' endif',
|
|
|
|
\ ' endfor',
|
2017-07-30 18:54:18 -07:00
|
|
|
\ ' echomsg "SessionLoadPost DONE"',
|
2017-03-19 18:48:28 -07:00
|
|
|
\ 'endfunction',
|
2017-07-30 18:54:18 -07:00
|
|
|
\ 'au SessionLoadPost * call DeleteInactiveBufs()',
|
|
|
|
\ '',
|
|
|
|
\ 'func WriteErrors()',
|
|
|
|
\ ' call writefile([execute("messages")], "Xerrors")',
|
|
|
|
\ 'endfunc',
|
|
|
|
\ 'au VimLeave * call WriteErrors()',
|
|
|
|
\ ]
|
2017-03-19 18:48:28 -07:00
|
|
|
call writefile(content, 'Xvimrc')
|
2017-07-30 18:54:18 -07:00
|
|
|
call system(v:progpath. ' --headless -i NONE -u Xvimrc --noplugins -S Session.vim -c cq')
|
|
|
|
let errors = join(readfile('Xerrors'))
|
|
|
|
" This probably only ever matches on unix.
|
|
|
|
call assert_notmatch('Caught deadly signal SEGV', errors)
|
|
|
|
call assert_match('SessionLoadPost DONE', errors)
|
|
|
|
|
2017-03-19 18:48:28 -07:00
|
|
|
set swapfile
|
2017-07-30 18:54:18 -07:00
|
|
|
for file in ['Session.vim', 'Xvimrc', 'Xerrors']
|
2017-03-19 18:48:28 -07:00
|
|
|
call delete(file)
|
|
|
|
endfor
|
|
|
|
endfunc
|
2017-11-22 14:35:20 -07:00
|
|
|
|
|
|
|
func Test_Cmdline()
|
|
|
|
au! CmdlineEnter : let g:entered = expand('<afile>')
|
|
|
|
au! CmdlineLeave : let g:left = expand('<afile>')
|
|
|
|
let g:entered = 0
|
|
|
|
let g:left = 0
|
|
|
|
call feedkeys(":echo 'hello'\<CR>", 'xt')
|
|
|
|
call assert_equal(':', g:entered)
|
|
|
|
call assert_equal(':', g:left)
|
|
|
|
au! CmdlineEnter
|
|
|
|
au! CmdlineLeave
|
|
|
|
|
|
|
|
au! CmdlineEnter / let g:entered = expand('<afile>')
|
|
|
|
au! CmdlineLeave / let g:left = expand('<afile>')
|
|
|
|
let g:entered = 0
|
|
|
|
let g:left = 0
|
|
|
|
call feedkeys("/hello<CR>", 'xt')
|
|
|
|
call assert_equal('/', g:entered)
|
|
|
|
call assert_equal('/', g:left)
|
|
|
|
au! CmdlineEnter
|
|
|
|
au! CmdlineLeave
|
|
|
|
endfunc
|
2018-02-01 16:57:49 -07:00
|
|
|
|
|
|
|
" Test for Bufleave autocommand that deletes the buffer we are about to edit.
|
|
|
|
func Test_BufleaveWithDelete()
|
|
|
|
new | edit Xfile1
|
|
|
|
|
|
|
|
augroup test_bufleavewithdelete
|
|
|
|
autocmd!
|
|
|
|
autocmd BufLeave Xfile1 bwipe Xfile2
|
|
|
|
augroup END
|
|
|
|
|
|
|
|
call assert_fails('edit Xfile2', 'E143:')
|
|
|
|
call assert_equal('Xfile1', bufname('%'))
|
|
|
|
|
|
|
|
autocmd! test_bufleavewithdelete BufLeave Xfile1
|
|
|
|
augroup! test_bufleavewithdelete
|
|
|
|
|
|
|
|
new
|
|
|
|
bwipe! Xfile1
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Test for Bufleave autocommand that deletes the buffer we are about to edit.
|
|
|
|
func Test_BufleaveWithDelete()
|
|
|
|
new | edit Xfile1
|
|
|
|
|
|
|
|
augroup test_bufleavewithdelete
|
|
|
|
autocmd!
|
|
|
|
autocmd BufLeave Xfile1 bwipe Xfile2
|
|
|
|
augroup END
|
|
|
|
|
|
|
|
call assert_fails('edit Xfile2', 'E143:')
|
|
|
|
call assert_equal('Xfile1', bufname('%'))
|
|
|
|
|
|
|
|
autocmd! test_bufleavewithdelete BufLeave Xfile1
|
|
|
|
augroup! test_bufleavewithdelete
|
|
|
|
|
|
|
|
new
|
|
|
|
bwipe! Xfile1
|
|
|
|
endfunc
|
2018-02-01 17:42:17 -07:00
|
|
|
|
|
|
|
" Test for autocommand that changes the buffer list, when doing ":ball".
|
|
|
|
func Test_Acmd_BufAll()
|
|
|
|
enew!
|
|
|
|
%bwipe!
|
|
|
|
call writefile(['Test file Xxx1'], 'Xxx1')
|
|
|
|
call writefile(['Test file Xxx2'], 'Xxx2')
|
|
|
|
call writefile(['Test file Xxx3'], 'Xxx3')
|
|
|
|
|
|
|
|
" Add three files to the buffer list
|
|
|
|
split Xxx1
|
|
|
|
close
|
|
|
|
split Xxx2
|
|
|
|
close
|
|
|
|
split Xxx3
|
|
|
|
close
|
|
|
|
|
|
|
|
" Wipe the buffer when the buffer is opened
|
|
|
|
au BufReadPost Xxx2 bwipe
|
|
|
|
|
|
|
|
call append(0, 'Test file Xxx4')
|
|
|
|
ball
|
|
|
|
|
|
|
|
call assert_equal(2, winnr('$'))
|
|
|
|
call assert_equal('Xxx1', bufname(winbufnr(winnr('$'))))
|
|
|
|
wincmd t
|
|
|
|
|
|
|
|
au! BufReadPost
|
|
|
|
%bwipe!
|
|
|
|
call delete('Xxx1')
|
|
|
|
call delete('Xxx2')
|
|
|
|
call delete('Xxx3')
|
|
|
|
enew! | only
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Test for autocommand that changes current buffer on BufEnter event.
|
|
|
|
" Check if modelines are interpreted for the correct buffer.
|
|
|
|
func Test_Acmd_BufEnter()
|
|
|
|
%bwipe!
|
|
|
|
call writefile(['start of test file Xxx1',
|
|
|
|
\ "\<Tab>this is a test",
|
|
|
|
\ 'end of test file Xxx1'], 'Xxx1')
|
|
|
|
call writefile(['start of test file Xxx2',
|
|
|
|
\ 'vim: set noai :',
|
|
|
|
\ "\<Tab>this is a test",
|
|
|
|
\ 'end of test file Xxx2'], 'Xxx2')
|
|
|
|
|
|
|
|
au BufEnter Xxx2 brew
|
|
|
|
set ai modeline modelines=3
|
|
|
|
edit Xxx1
|
|
|
|
" edit Xxx2, autocmd will do :brew
|
|
|
|
edit Xxx2
|
|
|
|
exe "normal G?this is a\<CR>"
|
|
|
|
" Append text with autoindent to this file
|
|
|
|
normal othis should be auto-indented
|
|
|
|
call assert_equal("\<Tab>this should be auto-indented", getline('.'))
|
|
|
|
call assert_equal(3, line('.'))
|
|
|
|
" Remove autocmd and edit Xxx2 again
|
|
|
|
au! BufEnter Xxx2
|
|
|
|
buf! Xxx2
|
|
|
|
exe "normal G?this is a\<CR>"
|
|
|
|
" append text without autoindent to Xxx
|
|
|
|
normal othis should be in column 1
|
|
|
|
call assert_equal("this should be in column 1", getline('.'))
|
|
|
|
call assert_equal(4, line('.'))
|
|
|
|
|
|
|
|
%bwipe!
|
|
|
|
call delete('Xxx1')
|
|
|
|
call delete('Xxx2')
|
|
|
|
set ai&vim modeline&vim modelines&vim
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Test for issue #57
|
|
|
|
" do not move cursor on <c-o> when autoindent is set
|
|
|
|
func Test_ai_CTRL_O()
|
|
|
|
enew!
|
|
|
|
set ai
|
|
|
|
let save_fo = &fo
|
|
|
|
set fo+=r
|
|
|
|
exe "normal o# abcdef\<Esc>2hi\<CR>\<C-O>d0\<Esc>"
|
|
|
|
exe "normal o# abcdef\<Esc>2hi\<C-O>d0\<Esc>"
|
|
|
|
call assert_equal(['# abc', 'def', 'def'], getline(2, 4))
|
|
|
|
|
|
|
|
set ai&vim
|
|
|
|
let &fo = save_fo
|
|
|
|
enew!
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Test for autocommand that deletes the current buffer on BufLeave event.
|
|
|
|
" Also test deleting the last buffer, should give a new, empty buffer.
|
|
|
|
func Test_BufLeave_Wipe()
|
|
|
|
%bwipe!
|
|
|
|
let content = ['start of test file Xxx',
|
|
|
|
\ 'this is a test',
|
|
|
|
\ 'end of test file Xxx']
|
|
|
|
call writefile(content, 'Xxx1')
|
|
|
|
call writefile(content, 'Xxx2')
|
|
|
|
|
|
|
|
au BufLeave Xxx2 bwipe
|
|
|
|
edit Xxx1
|
|
|
|
split Xxx2
|
|
|
|
" delete buffer Xxx2, we should be back to Xxx1
|
|
|
|
bwipe
|
|
|
|
call assert_equal('Xxx1', bufname('%'))
|
|
|
|
call assert_equal(1, winnr('$'))
|
|
|
|
|
|
|
|
" Create an alternate buffer
|
|
|
|
%write! test.out
|
|
|
|
call assert_equal('test.out', bufname('#'))
|
|
|
|
" delete alternate buffer
|
|
|
|
bwipe test.out
|
|
|
|
call assert_equal('Xxx1', bufname('%'))
|
|
|
|
call assert_equal('', bufname('#'))
|
|
|
|
|
|
|
|
au BufLeave Xxx1 bwipe
|
|
|
|
" delete current buffer, get an empty one
|
|
|
|
bwipe!
|
|
|
|
call assert_equal(1, line('$'))
|
|
|
|
call assert_equal('', bufname('%'))
|
|
|
|
call assert_equal(1, len(getbufinfo()))
|
|
|
|
|
|
|
|
call delete('Xxx1')
|
|
|
|
call delete('Xxx2')
|
|
|
|
%bwipe
|
|
|
|
au! BufLeave
|
|
|
|
endfunc
|
2018-02-01 17:51:56 -07:00
|
|
|
|
|
|
|
func s:AutoCommandOptionSet(match)
|
|
|
|
let item = remove(g:options, 0)
|
|
|
|
let expected = printf("Option: <%s>, Oldval: <%s>, NewVal: <%s>, Scope: <%s>\n", item[0], item[1], item[2], item[3])
|
|
|
|
let actual = printf("Option: <%s>, Oldval: <%s>, NewVal: <%s>, Scope: <%s>\n", a:match, v:option_old, v:option_new, v:option_type)
|
|
|
|
let g:opt = [expected, actual]
|
|
|
|
"call assert_equal(expected, actual)
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
func Test_OptionSet()
|
|
|
|
if !has("eval") || !has("autocmd") || !exists("+autochdir")
|
|
|
|
return
|
|
|
|
endif
|
|
|
|
|
|
|
|
call test_override('starting', 1)
|
|
|
|
set nocp
|
|
|
|
au OptionSet * :call s:AutoCommandOptionSet(expand("<amatch>"))
|
|
|
|
|
|
|
|
" 1: Setting number option"
|
|
|
|
let g:options=[['number', 0, 1, 'global']]
|
|
|
|
set nu
|
|
|
|
call assert_equal([], g:options)
|
|
|
|
call assert_equal(g:opt[0], g:opt[1])
|
|
|
|
|
|
|
|
" 2: Setting local number option"
|
|
|
|
let g:options=[['number', 1, 0, 'local']]
|
|
|
|
setlocal nonu
|
|
|
|
call assert_equal([], g:options)
|
|
|
|
call assert_equal(g:opt[0], g:opt[1])
|
|
|
|
|
|
|
|
" 3: Setting global number option"
|
|
|
|
let g:options=[['number', 1, 0, 'global']]
|
|
|
|
setglobal nonu
|
|
|
|
call assert_equal([], g:options)
|
|
|
|
call assert_equal(g:opt[0], g:opt[1])
|
|
|
|
|
|
|
|
" 4: Setting local autoindent option"
|
|
|
|
let g:options=[['autoindent', 0, 1, 'local']]
|
|
|
|
setlocal ai
|
|
|
|
call assert_equal([], g:options)
|
|
|
|
call assert_equal(g:opt[0], g:opt[1])
|
|
|
|
|
|
|
|
" 5: Setting global autoindent option"
|
|
|
|
let g:options=[['autoindent', 0, 1, 'global']]
|
|
|
|
setglobal ai
|
|
|
|
call assert_equal([], g:options)
|
|
|
|
call assert_equal(g:opt[0], g:opt[1])
|
|
|
|
|
|
|
|
" 6: Setting global autoindent option"
|
|
|
|
let g:options=[['autoindent', 1, 0, 'global']]
|
|
|
|
set ai!
|
|
|
|
call assert_equal([], g:options)
|
|
|
|
call assert_equal(g:opt[0], g:opt[1])
|
|
|
|
|
|
|
|
" Should not print anything, use :noa
|
|
|
|
" 7: don't trigger OptionSet"
|
|
|
|
let g:options=[['invalid', 1, 1, 'invalid']]
|
|
|
|
noa set nonu
|
|
|
|
call assert_equal([['invalid', 1, 1, 'invalid']], g:options)
|
|
|
|
call assert_equal(g:opt[0], g:opt[1])
|
|
|
|
|
|
|
|
" 8: Setting several global list and number option"
|
|
|
|
let g:options=[['list', 0, 1, 'global'], ['number', 0, 1, 'global']]
|
|
|
|
set list nu
|
|
|
|
call assert_equal([], g:options)
|
|
|
|
call assert_equal(g:opt[0], g:opt[1])
|
|
|
|
|
|
|
|
" 9: don't trigger OptionSet"
|
|
|
|
let g:options=[['invalid', 1, 1, 'invalid'], ['invalid', 1, 1, 'invalid']]
|
|
|
|
noa set nolist nonu
|
|
|
|
call assert_equal([['invalid', 1, 1, 'invalid'], ['invalid', 1, 1, 'invalid']], g:options)
|
|
|
|
call assert_equal(g:opt[0], g:opt[1])
|
|
|
|
|
|
|
|
" 10: Setting global acd"
|
|
|
|
let g:options=[['autochdir', 0, 1, 'local']]
|
|
|
|
setlocal acd
|
|
|
|
call assert_equal([], g:options)
|
|
|
|
call assert_equal(g:opt[0], g:opt[1])
|
|
|
|
|
|
|
|
" 11: Setting global autoread (also sets local value)"
|
|
|
|
let g:options=[['autoread', 0, 1, 'global']]
|
|
|
|
set ar
|
|
|
|
call assert_equal([], g:options)
|
|
|
|
call assert_equal(g:opt[0], g:opt[1])
|
|
|
|
|
|
|
|
" 12: Setting local autoread"
|
|
|
|
let g:options=[['autoread', 1, 1, 'local']]
|
|
|
|
setlocal ar
|
|
|
|
call assert_equal([], g:options)
|
|
|
|
call assert_equal(g:opt[0], g:opt[1])
|
|
|
|
|
|
|
|
" 13: Setting global autoread"
|
|
|
|
let g:options=[['autoread', 1, 0, 'global']]
|
|
|
|
setglobal invar
|
|
|
|
call assert_equal([], g:options)
|
|
|
|
call assert_equal(g:opt[0], g:opt[1])
|
|
|
|
|
|
|
|
" 14: Setting option backspace through :let"
|
|
|
|
let g:options=[['backspace', '', 'eol,indent,start', 'global']]
|
|
|
|
let &bs="eol,indent,start"
|
|
|
|
call assert_equal([], g:options)
|
|
|
|
call assert_equal(g:opt[0], g:opt[1])
|
|
|
|
|
|
|
|
" 15: Setting option backspace through setbufvar()"
|
|
|
|
let g:options=[['backup', 0, 1, 'local']]
|
|
|
|
" try twice, first time, shouldn't trigger because option name is invalid,
|
|
|
|
" second time, it should trigger
|
|
|
|
call assert_fails("call setbufvar(1, '&l:bk', 1)", "E355")
|
|
|
|
" should trigger, use correct option name
|
|
|
|
call setbufvar(1, '&backup', 1)
|
|
|
|
call assert_equal([], g:options)
|
|
|
|
call assert_equal(g:opt[0], g:opt[1])
|
|
|
|
|
|
|
|
" 16: Setting number option using setwinvar"
|
|
|
|
let g:options=[['number', 0, 1, 'local']]
|
|
|
|
call setwinvar(0, '&number', 1)
|
|
|
|
call assert_equal([], g:options)
|
|
|
|
call assert_equal(g:opt[0], g:opt[1])
|
|
|
|
|
|
|
|
" 17: Setting key option, shouldn't trigger"
|
|
|
|
let g:options=[['key', 'invalid', 'invalid1', 'invalid']]
|
|
|
|
setlocal key=blah
|
|
|
|
setlocal key=
|
|
|
|
call assert_equal([['key', 'invalid', 'invalid1', 'invalid']], g:options)
|
|
|
|
call assert_equal(g:opt[0], g:opt[1])
|
|
|
|
|
|
|
|
" Cleanup
|
|
|
|
au! OptionSet
|
|
|
|
for opt in ['nu', 'ai', 'acd', 'ar', 'bs', 'backup', 'cul', 'cp']
|
|
|
|
exe printf(":set %s&vi", opt)
|
|
|
|
endfor
|
|
|
|
call test_override('starting', 0)
|
|
|
|
delfunc! AutoCommandOptionSet
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
func Test_OptionSet_diffmode()
|
|
|
|
call test_override('starting', 1)
|
|
|
|
" 18: Changing an option when enetering diff mode
|
|
|
|
new
|
|
|
|
au OptionSet diff :let &l:cul=v:option_new
|
|
|
|
|
|
|
|
call setline(1, ['buffer 1', 'line2', 'line3', 'line4'])
|
|
|
|
call assert_equal(0, &l:cul)
|
|
|
|
diffthis
|
|
|
|
call assert_equal(1, &l:cul)
|
|
|
|
|
|
|
|
vnew
|
|
|
|
call setline(1, ['buffer 2', 'line 2', 'line 3', 'line4'])
|
|
|
|
call assert_equal(0, &l:cul)
|
|
|
|
diffthis
|
|
|
|
call assert_equal(1, &l:cul)
|
|
|
|
|
|
|
|
diffoff
|
|
|
|
call assert_equal(0, &l:cul)
|
|
|
|
call assert_equal(1, getwinvar(2, '&l:cul'))
|
|
|
|
bw!
|
|
|
|
|
|
|
|
call assert_equal(1, &l:cul)
|
|
|
|
diffoff!
|
|
|
|
call assert_equal(0, &l:cul)
|
|
|
|
call assert_equal(0, getwinvar(1, '&l:cul'))
|
|
|
|
bw!
|
|
|
|
|
|
|
|
" Cleanup
|
|
|
|
au! OptionSet
|
|
|
|
call test_override('starting', 0)
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
func Test_OptionSet_diffmode_close()
|
|
|
|
call test_override('starting', 1)
|
|
|
|
" 19: Try to close the current window when entering diff mode
|
|
|
|
" should not segfault
|
|
|
|
new
|
|
|
|
au OptionSet diff close
|
|
|
|
|
|
|
|
call setline(1, ['buffer 1', 'line2', 'line3', 'line4'])
|
|
|
|
call assert_fails(':diffthis', 'E788')
|
|
|
|
call assert_equal(1, &diff)
|
|
|
|
vnew
|
|
|
|
call setline(1, ['buffer 2', 'line 2', 'line 3', 'line4'])
|
|
|
|
call assert_fails(':diffthis', 'E788')
|
|
|
|
call assert_equal(1, &diff)
|
|
|
|
bw!
|
|
|
|
call assert_fails(':diffoff!', 'E788')
|
|
|
|
bw!
|
|
|
|
|
|
|
|
" Cleanup
|
|
|
|
au! OptionSet
|
|
|
|
call test_override('starting', 0)
|
|
|
|
"delfunc! AutoCommandOptionSet
|
|
|
|
endfunc
|