Mercurial > vim
comparison src/testdir/test_autocmd.vim @ 28917:c5862dfaf0bd v8.2.4981
patch 8.2.4981: it is not possible to manipulate autocommands
Commit: https://github.com/vim/vim/commit/1755a91851f7022fdd3eecfbd2cc0b508a2f2a8f
Author: Yegappan Lakshmanan <yegappan@yahoo.com>
Date: Thu May 19 10:31:47 2022 +0100
patch 8.2.4981: it is not possible to manipulate autocommands
Problem: It is not possible to manipulate autocommands.
Solution: Add functions to add, get and set autocommands. (Yegappan
Lakshmanan, closes #10291)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Thu, 19 May 2022 11:45:05 +0200 |
parents | 2edad5db074c |
children | 3c3bdb8069f5 |
comparison
equal
deleted
inserted
replaced
28916:40a5b3396eb4 | 28917:c5862dfaf0bd |
---|---|
3208 | 3208 |
3209 au! test_noname_autocmd_group | 3209 au! test_noname_autocmd_group |
3210 augroup! test_noname_autocmd_group | 3210 augroup! test_noname_autocmd_group |
3211 endfunc | 3211 endfunc |
3212 | 3212 |
3213 " Test for the autocmd_get() function | |
3214 func Test_autocmd_get() | |
3215 augroup TestAutoCmdFns | |
3216 au! | |
3217 autocmd BufAdd *.vim echo "bufadd-vim" | |
3218 autocmd BufAdd *.py echo "bufadd-py" | |
3219 autocmd BufHidden *.vim echo "bufhidden" | |
3220 augroup END | |
3221 augroup TestAutoCmdFns2 | |
3222 autocmd BufAdd *.vim echo "bufadd-vim-2" | |
3223 autocmd BufRead *.a1b2c3 echo "bufadd-vim-2" | |
3224 augroup END | |
3225 | |
3226 let l = autocmd_get() | |
3227 call assert_true(l->len() > 0) | |
3228 | |
3229 " Test for getting all the autocmds in a group | |
3230 let expected = [ | |
3231 \ #{cmd: 'echo "bufadd-vim"', group: 'TestAutoCmdFns', | |
3232 \ pattern: '*.vim', nested: v:false, once: v:false, | |
3233 \ event: 'BufAdd'}, | |
3234 \ #{cmd: 'echo "bufadd-py"', group: 'TestAutoCmdFns', | |
3235 \ pattern: '*.py', nested: v:false, once: v:false, | |
3236 \ event: 'BufAdd'}, | |
3237 \ #{cmd: 'echo "bufhidden"', group: 'TestAutoCmdFns', | |
3238 \ pattern: '*.vim', nested: v:false, | |
3239 \ once: v:false, event: 'BufHidden'}] | |
3240 call assert_equal(expected, autocmd_get(#{group: 'TestAutoCmdFns'})) | |
3241 | |
3242 " Test for getting autocmds for all the patterns in a group | |
3243 call assert_equal(expected, autocmd_get(#{group: 'TestAutoCmdFns', | |
3244 \ event: '*'})) | |
3245 | |
3246 " Test for getting autocmds for an event in a group | |
3247 let expected = [ | |
3248 \ #{cmd: 'echo "bufadd-vim"', group: 'TestAutoCmdFns', | |
3249 \ pattern: '*.vim', nested: v:false, once: v:false, | |
3250 \ event: 'BufAdd'}, | |
3251 \ #{cmd: 'echo "bufadd-py"', group: 'TestAutoCmdFns', | |
3252 \ pattern: '*.py', nested: v:false, once: v:false, | |
3253 \ event: 'BufAdd'}] | |
3254 call assert_equal(expected, autocmd_get(#{group: 'TestAutoCmdFns', | |
3255 \ event: 'BufAdd'})) | |
3256 | |
3257 " Test for getting the autocmds for all the events in a group for particular | |
3258 " pattern | |
3259 call assert_equal([{'cmd': 'echo "bufadd-py"', 'group': 'TestAutoCmdFns', | |
3260 \ 'pattern': '*.py', 'nested': v:false, 'once': v:false, | |
3261 \ 'event': 'BufAdd'}], | |
3262 \ autocmd_get(#{group: 'TestAutoCmdFns', event: '*', pattern: '*.py'})) | |
3263 | |
3264 " Test for getting the autocmds for an events in a group for particular | |
3265 " pattern | |
3266 let l = autocmd_get(#{group: 'TestAutoCmdFns', event: 'BufAdd', | |
3267 \ pattern: '*.vim'}) | |
3268 call assert_equal([ | |
3269 \ #{cmd: 'echo "bufadd-vim"', group: 'TestAutoCmdFns', | |
3270 \ pattern: '*.vim', nested: v:false, once: v:false, | |
3271 \ event: 'BufAdd'}], l) | |
3272 | |
3273 " Test for getting the autocmds for a pattern in a group | |
3274 let l = autocmd_get(#{group: 'TestAutoCmdFns', pattern: '*.vim'}) | |
3275 call assert_equal([ | |
3276 \ #{cmd: 'echo "bufadd-vim"', group: 'TestAutoCmdFns', | |
3277 \ pattern: '*.vim', nested: v:false, once: v:false, | |
3278 \ event: 'BufAdd'}, | |
3279 \ #{cmd: 'echo "bufhidden"', group: 'TestAutoCmdFns', | |
3280 \ pattern: '*.vim', nested: v:false, | |
3281 \ once: v:false, event: 'BufHidden'}], l) | |
3282 | |
3283 " Test for getting the autocmds for a pattern in all the groups | |
3284 let l = autocmd_get(#{pattern: '*.a1b2c3'}) | |
3285 call assert_equal([{'cmd': 'echo "bufadd-vim-2"', 'group': 'TestAutoCmdFns2', | |
3286 \ 'pattern': '*.a1b2c3', 'nested': v:false, 'once': v:false, | |
3287 \ 'event': 'BufRead'}], l) | |
3288 | |
3289 " Test for getting autocmds for a pattern without any autocmds | |
3290 call assert_equal([], autocmd_get(#{group: 'TestAutoCmdFns', | |
3291 \ pattern: '*.abc'})) | |
3292 call assert_equal([], autocmd_get(#{group: 'TestAutoCmdFns', | |
3293 \ event: 'BufAdd', pattern: '*.abc'})) | |
3294 call assert_equal([], autocmd_get(#{group: 'TestAutoCmdFns', | |
3295 \ event: 'BufWipeout'})) | |
3296 call assert_fails("call autocmd_get(#{group: 'abc', event: 'BufAdd'})", | |
3297 \ 'E367:') | |
3298 let cmd = "echo autocmd_get(#{group: 'TestAutoCmdFns', event: 'abc'})" | |
3299 call assert_fails(cmd, 'E216:') | |
3300 call assert_fails("call autocmd_get(#{group: 'abc'})", 'E367:') | |
3301 call assert_fails("echo autocmd_get(#{event: 'abc'})", 'E216:') | |
3302 | |
3303 augroup TestAutoCmdFns | |
3304 au! | |
3305 augroup END | |
3306 call assert_equal([], autocmd_get(#{group: 'TestAutoCmdFns'})) | |
3307 | |
3308 " Test for nested and once autocmds | |
3309 augroup TestAutoCmdFns | |
3310 au! | |
3311 autocmd VimSuspend * ++nested echo "suspend" | |
3312 autocmd VimResume * ++once echo "resume" | |
3313 augroup END | |
3314 | |
3315 let expected = [ | |
3316 \ {'cmd': 'echo "suspend"', 'group': 'TestAutoCmdFns', 'pattern': '*', | |
3317 \ 'nested': v:true, 'once': v:false, 'event': 'VimSuspend'}, | |
3318 \ {'cmd': 'echo "resume"', 'group': 'TestAutoCmdFns', 'pattern': '*', | |
3319 \ 'nested': v:false, 'once': v:true, 'event': 'VimResume'}] | |
3320 call assert_equal(expected, autocmd_get(#{group: 'TestAutoCmdFns'})) | |
3321 | |
3322 " Test for buffer-local autocmd | |
3323 augroup TestAutoCmdFns | |
3324 au! | |
3325 autocmd TextYankPost <buffer> echo "textyankpost" | |
3326 augroup END | |
3327 | |
3328 let expected = [ | |
3329 \ {'cmd': 'echo "textyankpost"', 'group': 'TestAutoCmdFns', | |
3330 \ 'pattern': '<buffer=' .. bufnr() .. '>', 'nested': v:false, | |
3331 \ 'once': v:false, 'bufnr': bufnr(), 'event': 'TextYankPost'}] | |
3332 call assert_equal(expected, autocmd_get(#{group: 'TestAutoCmdFns'})) | |
3333 | |
3334 augroup TestAutoCmdFns | |
3335 au! | |
3336 augroup END | |
3337 augroup! TestAutoCmdFns | |
3338 augroup TestAutoCmdFns2 | |
3339 au! | |
3340 augroup END | |
3341 augroup! TestAutoCmdFns2 | |
3342 | |
3343 call assert_fails("echo autocmd_get(#{group: []})", 'E730:') | |
3344 call assert_fails("echo autocmd_get(#{event: {}})", 'E731:') | |
3345 call assert_fails("echo autocmd_get([])", 'E1206:') | |
3346 endfunc | |
3347 | |
3348 " Test for the autocmd_add() function | |
3349 func Test_autocmd_add() | |
3350 " Define a single autocmd in a group | |
3351 call autocmd_add([#{group: 'TestAcSet', event: 'BufAdd', pattern: '*.sh', | |
3352 \ cmd: 'echo "bufadd"', once: v:true, nested: v:true}]) | |
3353 call assert_equal([#{cmd: 'echo "bufadd"', group: 'TestAcSet', | |
3354 \ pattern: '*.sh', nested: v:true, once: v:true, | |
3355 \ event: 'BufAdd'}], autocmd_get(#{group: 'TestAcSet'})) | |
3356 | |
3357 " Define two autocmds in the same group | |
3358 call autocmd_delete([#{group: 'TestAcSet'}]) | |
3359 call autocmd_add([#{group: 'TestAcSet', event: 'BufAdd', pattern: '*.sh', | |
3360 \ cmd: 'echo "bufadd"'}, | |
3361 \ #{group: 'TestAcSet', event: 'BufEnter', pattern: '*.sh', | |
3362 \ cmd: 'echo "bufenter"'}]) | |
3363 call assert_equal([ | |
3364 \ #{cmd: 'echo "bufadd"', group: 'TestAcSet', pattern: '*.sh', | |
3365 \ nested: v:false, once: v:false, event: 'BufAdd'}, | |
3366 \ #{cmd: 'echo "bufenter"', group: 'TestAcSet', pattern: '*.sh', | |
3367 \ nested: v:false, once: v:false, event: 'BufEnter'}], | |
3368 \ autocmd_get(#{group: 'TestAcSet'})) | |
3369 | |
3370 " Define a buffer-local autocmd | |
3371 call autocmd_delete([#{group: 'TestAcSet'}]) | |
3372 call autocmd_add([#{group: 'TestAcSet', event: 'CursorHold', | |
3373 \ bufnr: bufnr(), cmd: 'echo "cursorhold"'}]) | |
3374 call assert_equal([ | |
3375 \ #{cmd: 'echo "cursorhold"', group: 'TestAcSet', | |
3376 \ pattern: '<buffer=' .. bufnr() .. '>', nested: v:false, | |
3377 \ once: v:false, bufnr: bufnr(), event: 'CursorHold'}], | |
3378 \ autocmd_get(#{group: 'TestAcSet'})) | |
3379 | |
3380 " Use an invalid buffer number | |
3381 call autocmd_delete([#{group: 'TestAcSet'}]) | |
3382 call autocmd_add([#{group: 'TestAcSet', event: 'BufEnter', | |
3383 \ bufnr: -1, cmd: 'echo "bufenter"'}]) | |
3384 let l = [#{group: 'TestAcSet', event: 'BufAdd', bufnr: 9999, | |
3385 \ cmd: 'echo "bufadd"'}] | |
3386 call assert_fails("echo autocmd_add(l)", 'E680:') | |
3387 let l = [#{group: 'TestAcSet', event: 'BufRead', bufnr: [], | |
3388 \ cmd: 'echo "bufread"'}] | |
3389 call assert_fails("echo autocmd_add(l)", 'E745:') | |
3390 call assert_equal([], autocmd_get(#{group: 'TestAcSet'})) | |
3391 | |
3392 " Add two commands to the same group, event and pattern | |
3393 call autocmd_delete([#{group: 'TestAcSet'}]) | |
3394 call autocmd_add([#{group: 'TestAcSet', event: 'BufUnload', | |
3395 \ pattern: 'abc', cmd: 'echo "cmd1"'}]) | |
3396 call autocmd_add([#{group: 'TestAcSet', event: 'BufUnload', | |
3397 \ pattern: 'abc', cmd: 'echo "cmd2"'}]) | |
3398 call assert_equal([ | |
3399 \ #{cmd: 'echo "cmd1"', group: 'TestAcSet', pattern: 'abc', | |
3400 \ nested: v:false, once: v:false, event: 'BufUnload'}, | |
3401 \ #{cmd: 'echo "cmd2"', group: 'TestAcSet', pattern: 'abc', | |
3402 \ nested: v:false, once: v:false, event: 'BufUnload'}], | |
3403 \ autocmd_get(#{group: 'TestAcSet'})) | |
3404 | |
3405 " When adding a new autocmd, if the autocmd 'group' is not specified, then | |
3406 " the current autocmd group should be used. | |
3407 call autocmd_delete([#{group: 'TestAcSet'}]) | |
3408 augroup TestAcSet | |
3409 call autocmd_add([#{event: 'BufHidden', pattern: 'abc', cmd: 'echo "abc"'}]) | |
3410 augroup END | |
3411 call assert_equal([ | |
3412 \ #{cmd: 'echo "abc"', group: 'TestAcSet', pattern: 'abc', | |
3413 \ nested: v:false, once: v:false, event: 'BufHidden'}], | |
3414 \ autocmd_get(#{group: 'TestAcSet'})) | |
3415 | |
3416 let l = [#{group: 'TestAcSet', event: 'abc', pattern: '*.sh', | |
3417 \ cmd: 'echo "bufadd"'}] | |
3418 call assert_fails('call autocmd_add(l)', 'E216:') | |
3419 | |
3420 call assert_fails("call autocmd_add({})", 'E1211:') | |
3421 call assert_equal(v:false, autocmd_add(test_null_list())) | |
3422 call assert_true(autocmd_add([[]])) | |
3423 call assert_true(autocmd_add([test_null_dict()])) | |
3424 | |
3425 augroup TestAcSet | |
3426 au! | |
3427 augroup END | |
3428 | |
3429 call autocmd_add([#{group: 'TestAcSet'}]) | |
3430 call autocmd_add([#{group: 'TestAcSet', event: 'BufAdd'}]) | |
3431 call autocmd_add([#{group: 'TestAcSet', pat: '*.sh'}]) | |
3432 call autocmd_add([#{group: 'TestAcSet', cmd: 'echo "a"'}]) | |
3433 call autocmd_add([#{group: 'TestAcSet', event: 'BufAdd', pat: '*.sh'}]) | |
3434 call autocmd_add([#{group: 'TestAcSet', event: 'BufAdd', cmd: 'echo "a"'}]) | |
3435 call autocmd_add([#{group: 'TestAcSet', pat: '*.sh', cmd: 'echo "a"'}]) | |
3436 call assert_equal([], autocmd_get(#{group: 'TestAcSet'})) | |
3437 | |
3438 augroup! TestAcSet | |
3439 endfunc | |
3440 | |
3441 " Test for deleting autocmd events and groups | |
3442 func Test_autocmd_delete() | |
3443 " Delete an event in an autocmd group | |
3444 augroup TestAcSet | |
3445 au! | |
3446 au BufAdd *.sh echo "bufadd" | |
3447 au BufEnter *.sh echo "bufenter" | |
3448 augroup END | |
3449 call autocmd_delete([#{group: 'TestAcSet', event: 'BufAdd'}]) | |
3450 call assert_equal([#{cmd: 'echo "bufenter"', group: 'TestAcSet', | |
3451 \ pattern: '*.sh', nested: v:false, once: v:false, | |
3452 \ event: 'BufEnter'}], autocmd_get(#{group: 'TestAcSet'})) | |
3453 | |
3454 " Delete all the events in an autocmd group | |
3455 augroup TestAcSet | |
3456 au BufAdd *.sh echo "bufadd" | |
3457 augroup END | |
3458 call autocmd_delete([#{group: 'TestAcSet', event: '*'}]) | |
3459 call assert_equal([], autocmd_get(#{group: 'TestAcSet'})) | |
3460 | |
3461 " Delete a non-existing autocmd group | |
3462 call assert_fails("call autocmd_delete([#{group: 'abc'}])", 'E367:') | |
3463 " Delete a non-existing autocmd event | |
3464 let l = [#{group: 'TestAcSet', event: 'abc'}] | |
3465 call assert_fails("call autocmd_delete(l)", 'E216:') | |
3466 " Delete a non-existing autocmd pattern | |
3467 let l = [#{group: 'TestAcSet', event: 'BufAdd', pat: 'abc'}] | |
3468 call assert_true(autocmd_delete(l)) | |
3469 | |
3470 " Delete an autocmd group | |
3471 augroup TestAcSet | |
3472 au! | |
3473 au BufAdd *.sh echo "bufadd" | |
3474 au BufEnter *.sh echo "bufenter" | |
3475 augroup END | |
3476 call autocmd_delete([#{group: 'TestAcSet'}]) | |
3477 call assert_fails("call autocmd_get(#{group: 'TestAcSet'})", 'E367:') | |
3478 | |
3479 call assert_true(autocmd_delete([[]])) | |
3480 call assert_true(autocmd_delete([test_null_dict()])) | |
3481 endfunc | |
3482 | |
3213 " vim: shiftwidth=2 sts=2 expandtab | 3483 " vim: shiftwidth=2 sts=2 expandtab |