Add ALEStartLint autocmd

This grew out of my work in #1193; to ensure the statusline was being
updated I had to add:

    fun! s:redraw(timer)
        redrawstatus
    endfun

    augroup ALEProgress
        autocmd!
        autocmd BufWritePost * call timer_start(100, function('s:redraw'))
        autocmd User ALELint redrawstatus
    augroup end

Which kind of works, but is ugly. With this, I can replace the
`BufWritePost` with:

    autocmd User ALEStartLint redrawstatus

Which is much better, IMHO.

Actually, this patch actually replaces adding a function, since you can
do:

    augroup ALEProgress
        autocmd!
        autocmd User ALEStartLint hi Statusline ctermfg=darkgrey
        autocmd User ALELint      hi Statusline ctermfg=NONE
    augroup end

or:

    let s:ale_running = 0
    let l:stl .= '%{s:ale_running ? "[linting]" : ""}'
    augroup ALEProgress
        autocmd!
        autocmd User ALEStartLint let s:ale_running = 1 | redrawstatus
        autocmd User ALELint      let s:ale_running = 0 | redrawstatus
    augroup end

Both seem to work very well in my testing.

No need to `ale#Statusline#IsRunning()` anymore, I think?
This commit is contained in:
Martin Tournoij 2017-12-07 15:26:20 +00:00
parent e2a8f759d8
commit d6bf13502a
No known key found for this signature in database
GPG Key ID: A6258419189EE585
4 changed files with 38 additions and 5 deletions

View File

@ -40,7 +40,7 @@ formatting tools, and some Language Server Protocol and `tsserver` features.
5. [How can I show errors or warnings in my statusline?](#faq-statusline) 5. [How can I show errors or warnings in my statusline?](#faq-statusline)
6. [How can I show errors or warnings in my lightline?](#faq-lightline) 6. [How can I show errors or warnings in my lightline?](#faq-lightline)
7. [How can I change the format for echo messages?](#faq-echo-format) 7. [How can I change the format for echo messages?](#faq-echo-format)
8. [How can I execute some code when ALE stops linting?](#faq-autocmd) 8. [How can I execute some code when ALE starts or stops linting?](#faq-autocmd)
9. [How can I navigate between errors quickly?](#faq-navigation) 9. [How can I navigate between errors quickly?](#faq-navigation)
10. [How can I run linters only when I save files?](#faq-lint-on-save) 10. [How can I run linters only when I save files?](#faq-lint-on-save)
11. [How can I use the quickfix list instead of the loclist?](#faq-quickfix) 11. [How can I use the quickfix list instead of the loclist?](#faq-quickfix)
@ -493,15 +493,17 @@ Will give you:
<a name="faq-autocmd"></a> <a name="faq-autocmd"></a>
### 5.viii. How can I execute some code when ALE stops linting? ### 5.viii. How can I execute some code when ALE starts or stops linting?
ALE runs its own [autocmd](http://vimdoc.sourceforge.net/htmldoc/autocmd.html) ALE runs its own [autocmd](http://vimdoc.sourceforge.net/htmldoc/autocmd.html)
event whenever has a linter has been successfully executed and processed. This events whenever has a linter is started and has been successfully executed and
autocmd event can be used to call arbitrary functions after ALE stops linting. processed. This autocmd event can be used to call arbitrary functions before and
after ALE stops linting.
```vim ```vim
augroup YourGroup augroup YourGroup
autocmd! autocmd!
autocmd User ALEStartLint call YourFunction()
autocmd User ALELint call YourFunction() autocmd User ALELint call YourFunction()
augroup END augroup END
``` ```

View File

@ -556,6 +556,8 @@ 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

View File

@ -2196,6 +2196,12 @@ ALELint *ALELint-autocmd*
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.
ALEStartLint *ALEStartLint-autocmd*
This |User| autocommand is triggered by ALE right after it started a new
linting job.
=============================================================================== ===============================================================================
10. Special Thanks *ale-special-thanks* 10. Special Thanks *ale-special-thanks*

View File

@ -1,18 +1,41 @@
Before: Before:
let g:start = 0
let g:success = 0 let g: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 ALELint let g:success = 1 autocmd User ALEStartLint let g:start = 1
autocmd User ALELint let g:success = 1
augroup end augroup end
call ale#Lint() call ale#Lint()
AssertEqual g:start, 1
AssertEqual g:success, 1 AssertEqual g:success, 1