Run before lint cycle, rename autocmds

This commit is contained in:
Martin Tournoij 2017-12-10 13:03:03 +00:00
parent d6bf13502a
commit 4825cce1cc
No known key found for this signature in database
GPG key ID: A6258419189EE585
4 changed files with 37 additions and 49 deletions

View file

@ -497,14 +497,14 @@ Will give you:
ALE runs its own [autocmd](http://vimdoc.sourceforge.net/htmldoc/autocmd.html) ALE runs its own [autocmd](http://vimdoc.sourceforge.net/htmldoc/autocmd.html)
events whenever has a linter is started and has been successfully executed and events whenever has a linter is started and has been successfully executed and
processed. This autocmd event can be used to call arbitrary functions before and processed. These events can be used to call arbitrary functions before and after
after ALE stops linting. ALE stops linting.
```vim ```vim
augroup YourGroup augroup YourGroup
autocmd! autocmd!
autocmd User ALEStartLint call YourFunction() autocmd User ALELintPre call YourFunction()
autocmd User ALELint call YourFunction() autocmd User ALELintPost call YourFunction()
augroup END augroup END
``` ```

View file

@ -321,6 +321,8 @@ function! ale#engine#SetResults(buffer, loclist) abort
call ale#engine#RemoveManagedFiles(a:buffer) call ale#engine#RemoveManagedFiles(a:buffer)
" Call user autocommands. This allows users to hook into ALE's lint cycle. " Call user autocommands. This allows users to hook into ALE's lint cycle.
silent doautocmd <nomodeline> User ALELintPost
" Old DEPRECATED name; call it for backwards compatibility.
silent doautocmd <nomodeline> User ALELint silent doautocmd <nomodeline> User ALELint
endif endif
endfunction endfunction
@ -556,8 +558,6 @@ function! s:RunJob(options) abort
\ 'output': [], \ 'output': [],
\ 'next_chain_index': l:next_chain_index, \ 'next_chain_index': l:next_chain_index,
\} \}
silent doautocmd <nomodeline> User ALEStartLint
endif endif
if g:ale_history_enabled if g:ale_history_enabled
@ -787,6 +787,8 @@ function! ale#engine#RunLinters(buffer, linters, should_lint_file) abort
" We can only clear the results if we aren't checking the buffer. " We can only clear the results if we aren't checking the buffer.
let l:can_clear_results = !ale#engine#IsCheckingBuffer(a:buffer) let l:can_clear_results = !ale#engine#IsCheckingBuffer(a:buffer)
silent doautocmd <nomodeline> User ALELintPre
for l:linter in a:linters for l:linter in a:linters
" Only run lint_file linters if we should. " Only run lint_file linters if we should.
if !l:linter.lint_file || a:should_lint_file if !l:linter.lint_file || a:should_lint_file

View file

@ -2048,7 +2048,7 @@ ale#linter#Define(filetype, linter) *ale#linter#Define()*
the file on disk, including |g:ale_lint_on_enter| the file on disk, including |g:ale_lint_on_enter|
and |g:ale_lint_on_save|. Linters with this option and |g:ale_lint_on_save|. Linters with this option
set to `1` will also be run when linters are run set to `1` will also be run when linters are run
manually, per |ALELint-autocmd|. manually, per |ALELintPost-autocmd|.
When this option is set to `1`, `read_buffer` will When this option is set to `1`, `read_buffer` will
be set automatically to `0`. The two options cannot be set automatically to `0`. The two options cannot
@ -2182,26 +2182,32 @@ ale#statusline#Count(buffer) *ale#statusline#Count()*
`total` -> The total number of problems. `total` -> The total number of problems.
ALELint *ALELint-autocmd* ALELintPre ALELintPost *ALELintPre-autocmd* *ALELintPost-autocmd*
This |User| autocommand is triggered by ALE every time it completes a lint These |User| autocommands are triggered before and after every lint cycle.
cycle. It can be used to update statuslines, send notifications, or It can be used to update statuslines, send notifications, etc.
complete any other operation that needs to be done after linting has been
performed.
For example, you can echo a message when linting is complete like so:
>
autocmd User ALELint unsilent echom 'ALE run!'
<
The autocmd commands are run with |:silent|, so |:unsilent| is required for The autocmd commands are run with |:silent|, so |:unsilent| is required for
echoing messges. echoing messges.
For example to change the color of the statusline while the linter is
ALEStartLint *ALEStartLint-autocmd* running:
>
This |User| autocommand is triggered by ALE right after it started a new augroup ALEProgress
linting job. autocmd!
autocmd User ALELintPre hi Statusline ctermfg=darkgrey
autocmd User ALELintPOST hi Statusline ctermfg=NONE
augroup end
<
Or to display the progress in the statusline:
>
let s:ale_running = 0
let l:stl .= '%{s:ale_running ? "[linting]" : ""}'
augroup ALEProgress
autocmd!
autocmd User ALELintPre let s:ale_running = 1 | redrawstatus
autocmd User ALELintPost let s:ale_running = 0 | redrawstatus
augroup end
<
=============================================================================== ===============================================================================
10. Special Thanks *ale-special-thanks* 10. Special Thanks *ale-special-thanks*

View file

@ -1,41 +1,21 @@
Before: Before:
let g:start = 0 let g:pre_success = 0
let g:success = 0 let g:post_success = 0
let g:ale_run_synchronously = 1 let g:ale_run_synchronously = 1
function! TestCallback(buffer, output)
return [{
\ 'lnum': 1,
\ 'col': 3,
\ 'text': 'baz boz',
\}]
endfunction
call ale#linter#Define('foobar', {
\ 'name': 'testlinter',
\ 'callback': 'TestCallback',
\ 'executable': has('win32') ? 'cmd' : 'true',
\ 'command': has('win32') ? 'echo' : 'true',
\})
"let g:ale_linters = {'foobar': ['lint_file_linter']}
After: After:
let g:ale_run_synchronously = 0 let g:ale_run_synchronously = 0
let g:ale_buffer_info = {} let g:ale_buffer_info = {}
let g:ale_linters = {}
call ale#linter#Reset()
delfunction TestCallback
augroup! VaderTest augroup! VaderTest
Execute (Run a lint cycle, and check that a variable is set in the autocmd): Execute (Run a lint cycle, and check that a variable is set in the autocmd):
set filetype=foobar
augroup VaderTest augroup VaderTest
autocmd! autocmd!
autocmd User ALEStartLint let g:start = 1 autocmd User ALELintPre let g:pre_success = 1
autocmd User ALELint let g:success = 1 autocmd User ALELintPost let g:post_success = 1
augroup end augroup end
call ale#Lint() call ale#Lint()
AssertEqual g:start, 1 AssertEqual g:pre_success, 1
AssertEqual g:success, 1 AssertEqual g:post_success, 1