Before: function! CheckAutocmd(group) call ale#autocmd#InitAuGroups() redir => l:output execute 'silent! autocmd ' . a:group redir END let l:matches = [] let l:header = '' " Some event names have aliases, and NeoVim and Vim produce " different output. The names are remapped to fix this. let l:event_name_corrections = { \ 'BufWrite': 'BufWritePre', \ 'BufRead': 'BufReadPost', \} " autocmd commands are split across two lines in output, so we " must merge the lines back into one simple line. for l:line in split(l:output, "\n") if l:line =~# '^ALE' && split(l:line)[0] ==# a:group let l:header = split(l:line)[1] let l:header = get(l:event_name_corrections, l:header, l:header) elseif !empty(l:header) " There's an extra line for buffer events, and we should only look " for the one matching the current buffer. if l:line =~# '' let l:header .= ' ' else call add(l:matches, join(split(l:header . l:line))) let l:header = '' endif endif endfor call sort(l:matches) return l:matches endfunction Save g:ale_enabled Save g:ale_lint_on_text_changed Save g:ale_lint_on_insert_leave Save g:ale_pattern_options_enabled Save g:ale_lint_on_enter Save g:ale_lint_on_filetype_changed Save g:ale_lint_on_save Save g:ale_echo_cursor Save g:ale_fix_on_save Save g:ale_completion_enabled After: delfunction CheckAutocmd Restore if g:ale_completion_enabled call ale#completion#Enable() else call ale#completion#Disable() endif call ale#autocmd#InitAuGroups() Execute (g:ale_lint_on_text_changed = 0 should bind no events): let g:ale_lint_on_text_changed = 0 AssertEqual [], CheckAutocmd('ALERunOnTextChangedGroup') Execute (g:ale_lint_on_text_changed = 1 bind both events): let g:ale_lint_on_text_changed = 1 AssertEqual [ \ 'TextChanged * call ale#Queue(g:ale_lint_delay)', \ 'TextChangedI * call ale#Queue(g:ale_lint_delay)' \], CheckAutocmd('ALERunOnTextChangedGroup') Execute (g:ale_lint_on_text_changed = 'always' should bind both events): let g:ale_lint_on_text_changed = 'always' AssertEqual [ \ 'TextChanged * call ale#Queue(g:ale_lint_delay)', \ 'TextChangedI * call ale#Queue(g:ale_lint_delay)' \], CheckAutocmd('ALERunOnTextChangedGroup') Execute (g:ale_lint_on_text_changed = 'normal' should bind only TextChanged): let g:ale_lint_on_text_changed = 'normal' AssertEqual [ \ 'TextChanged * call ale#Queue(g:ale_lint_delay)', \], CheckAutocmd('ALERunOnTextChangedGroup') Execute (g:ale_lint_on_text_changed = 'insert' should bind only TextChangedI): let g:ale_lint_on_text_changed = 'insert' AssertEqual [ \ 'TextChangedI * call ale#Queue(g:ale_lint_delay)', \], CheckAutocmd('ALERunOnTextChangedGroup') Execute (g:ale_lint_on_insert_leave = 1 should bind InsertLeave): let g:ale_lint_on_insert_leave = 1 AssertEqual [ \ 'InsertLeave * call ale#Queue(0)', \], CheckAutocmd('ALERunOnInsertLeave') Execute (g:ale_lint_on_insert_leave = 0 should bind no events): let g:ale_lint_on_insert_leave = 0 AssertEqual [], CheckAutocmd('ALERunOnInsertLeave') Execute (g:ale_pattern_options_enabled = 1 should bind BufReadPost and BufEnter): let g:ale_pattern_options_enabled = 1 AssertEqual [ \ 'BufEnter * call ale#pattern_options#SetOptions(str2nr(expand('''')))', \ 'BufReadPost * call ale#pattern_options#SetOptions(str2nr(expand('''')))', \], CheckAutocmd('ALEPatternOptionsGroup') Execute (g:ale_pattern_options_enabled = 0 should still bind events): let g:ale_pattern_options_enabled = 0 AssertEqual [ \ 'BufEnter * call ale#pattern_options#SetOptions(str2nr(expand('''')))', \ 'BufReadPost * call ale#pattern_options#SetOptions(str2nr(expand('''')))', \], CheckAutocmd('ALEPatternOptionsGroup') Execute (g:ale_enabled = 0 should still bind pattern events): let g:ale_enabled = 0 AssertEqual [ \ 'BufEnter * call ale#pattern_options#SetOptions(str2nr(expand('''')))', \ 'BufReadPost * call ale#pattern_options#SetOptions(str2nr(expand('''')))', \], CheckAutocmd('ALEPatternOptionsGroup') Execute (g:ale_lint_on_enter = 0 should bind only the BufEnter event): let g:ale_lint_on_enter = 0 AssertEqual \ ['BufEnter * call ale#events#EnterEvent(str2nr(expand('''')))'], \ CheckAutocmd('ALERunOnEnterGroup') Execute (g:ale_lint_on_enter = 1 should bind the required events): let g:ale_lint_on_enter = 1 AssertEqual [ \ 'BufEnter * call ale#events#EnterEvent(str2nr(expand('''')))', \ 'BufReadPost * call ale#Queue(0, ''lint_file'', str2nr(expand('''')))', \ 'BufWinEnter * call ale#Queue(0, ''lint_file'', str2nr(expand('''')))', \ 'FileChangedShellPost * call ale#events#FileChangedEvent(str2nr(expand('''')))', \], CheckAutocmd('ALERunOnEnterGroup') Execute (g:ale_lint_on_filetype_changed = 0 should bind no events): let g:ale_lint_on_filetype_changed = 0 AssertEqual [], CheckAutocmd('ALERunOnFiletypeChangeGroup') Execute (g:ale_lint_on_filetype_changed = 1 should bind the FileType event): let g:ale_lint_on_filetype_changed = 1 AssertEqual \ [ \ 'FileType * call ale#events#FileTypeEvent( ' \ . 'str2nr(expand('''')), ' \ . 'expand('''')' \ . ')', \ ], \ CheckAutocmd('ALERunOnFiletypeChangeGroup') Execute (The SaveEvent should always be bound): let g:ale_enabled = 0 let g:ale_lint_on_save = 0 let g:ale_fix_on_save = 0 AssertEqual [ \ 'BufWritePost * call ale#events#SaveEvent(str2nr(expand('''')))', \], CheckAutocmd('ALERunOnSaveGroup') Execute (g:ale_echo_cursor = 0 should bind no events): let g:ale_echo_cursor = 0 AssertEqual [], CheckAutocmd('ALECursorGroup') Execute (g:ale_echo_cursor = 1 should bind cursor events): let g:ale_echo_cursor = 1 AssertEqual [ \ 'CursorHold * call ale#cursor#EchoCursorWarningWithDelay()', \ 'CursorMoved * call ale#cursor#EchoCursorWarningWithDelay()', \ 'InsertLeave * call ale#cursor#EchoCursorWarning()', \], CheckAutocmd('ALECursorGroup') Execute (ALECleanupGroup should include the right commands): AssertEqual [ \ 'BufDelete * call ale#engine#Cleanup(str2nr(expand('''')))', \ 'QuitPre * call ale#events#QuitEvent(str2nr(expand('''')))', \], CheckAutocmd('ALECleanupGroup') Execute(Enabling completion should set up autocmd events correctly): let g:ale_completion_enabled = 0 call ale#completion#Enable() AssertEqual [ \ 'CompleteDone * call ale#completion#Done()', \ 'TextChangedI * call ale#completion#Queue()', \], CheckAutocmd('ALECompletionGroup') AssertEqual 1, g:ale_completion_enabled Execute(Disabling completion should remove autocmd events correctly): let g:ale_completion_enabled = 1 call ale#completion#Enable() call ale#completion#Disable() AssertEqual [], CheckAutocmd('ALECompletionGroup') AssertEqual 0, g:ale_completion_enabled