Add options to facilitate linting only in normal mode (#425)

* [#420] Add options to facilitate linting only in normal mode

ale_lint_on_text_changed:
Allow setting to 'insert' or 'normal' to lint when text is changed only in
insert or normal mode respectively.

ale_lint_on_insert_leave:
This flag can be set to 1 to enable linting when leaving insert mode.

* [#420] Test updated global options

Ale should
- bind to TextChanged events when g:ale_lint_on_text_changed = 1
- bind to TextChanged events when g:ale_lint_on_text_changed = 'always'
- bind to InsertLeave event when g:ale_lint_on_insert_leave = 1
This commit is contained in:
taylorskalyo 2017-03-30 18:21:37 -04:00 committed by w0rp
parent 3a74d242f9
commit 36f9631512
5 changed files with 113 additions and 18 deletions

View File

@ -368,7 +368,7 @@ options off.
```vim ```vim
" Write this in your vimrc file " Write this in your vimrc file
let g:ale_lint_on_text_changed = 0 let g:ale_lint_on_text_changed = 'never'
" You can disable this option too " You can disable this option too
" if you don't want linters to run on opening a file " if you don't want linters to run on opening a file
let g:ale_lint_on_enter = 0 let g:ale_lint_on_enter = 0
@ -453,10 +453,10 @@ type, and this delay can be increased so linters are run less often. See
`:help g:ale_lint_delay` for more information. `:help g:ale_lint_delay` for more information.
If you don't wish to run linters while you type, you can disable that If you don't wish to run linters while you type, you can disable that
behaviour. Set `g:ale_lint_on_text_changed` to `0`. You won't get as frequent behaviour. Set `g:ale_lint_on_text_changed` to `never` or `normal`. You won't
error checking, but ALE shouldn't block your ability to edit a document after get as frequent error checking, but ALE shouldn't block your ability to edit a
you save a file, so the asynchronous nature of the plugin will still be an document after you save a file, so the asynchronous nature of the plugin will
advantage. still be an advantage.
If you are still concerned, you can turn the automatic linting off altogether, If you are still concerned, you can turn the automatic linting off altogether,
including the option `g:ale_lint_on_enter`, and you can run ALE manually with including the option `g:ale_lint_on_enter`, and you can run ALE manually with

View File

@ -286,7 +286,7 @@ g:ale_lint_delay *g:ale_lint_delay*
This variable controls the milliseconds delay after which the linters will This variable controls the milliseconds delay after which the linters will
be run after text is changed. This option is only meaningful with the be run after text is changed. This option is only meaningful with the
|g:ale_lint_on_text_changed| variable set to `1`. |g:ale_lint_on_text_changed| variable set to `always`, `insert`, or `normal`.
g:ale_lint_on_enter *g:ale_lint_on_enter* g:ale_lint_on_enter *g:ale_lint_on_enter*
@ -325,17 +325,27 @@ g:ale_lint_on_save *g:ale_lint_on_save*
g:ale_lint_on_text_changed *g:ale_lint_on_text_changed* g:ale_lint_on_text_changed *g:ale_lint_on_text_changed*
Type: |Number| Type: |String|
Default: `1` Default: `always`
By default, ALE will check files with the various supported programs when By default, ALE will check files with the various supported programs when
text is changed by using the |TextChanged| event. If this behaviour is not text is changed by using the |TextChanged| event. If this behaviour is not
desired, then this option can be disabled by setting it to 0. The desired, then this option can be disabled by setting it to `never`. The
|g:ale_lint_delay| variable will be used to set a |timer_start()| on a |g:ale_lint_delay| variable will be used to set a |timer_start()| on a
delay, and each change to a file will continue to call |timer_stop()| and delay, and each change to a file will continue to call |timer_stop()| and
|timer_start()| repeatedly until the timer ticks by, and the linters will be |timer_start()| repeatedly until the timer ticks by, and the linters will be
run. The checking of files will run in the background, so it should not run. The checking of files will run in the background, so it should not
inhibit editing files. inhibit editing files. This option can also be set to `insert` or `normal`
to lint when text is changed only in insert or normal mode respectively.
g:ale_lint_on_insert_leave *g:ale_lint_on_insert_leave*
Type: |Number|
Default: `0`
This option will make ALE run the linters whenever leaving insert mode when
it it set to `1` in your vimrc file.
g:ale_linter_aliases *g:ale_linter_aliases* g:ale_linter_aliases *g:ale_linter_aliases*

View File

@ -69,8 +69,13 @@ let g:ale_linter_aliases = get(g:, 'ale_linter_aliases', {})
" jobs for linting until enough time has passed after editing is done. " jobs for linting until enough time has passed after editing is done.
let g:ale_lint_delay = get(g:, 'ale_lint_delay', 200) let g:ale_lint_delay = get(g:, 'ale_lint_delay', 200)
" This flag can be set to 0 to disable linting when text is changed. " This flag can be set to 'never' to disable linting when text is changed.
let g:ale_lint_on_text_changed = get(g:, 'ale_lint_on_text_changed', 1) " This flag can also be set to 'insert' or 'normal' to lint when text is
" changed only in insert or normal mode respectively.
let g:ale_lint_on_text_changed = get(g:, 'ale_lint_on_text_changed', 'always')
" This flag can be set to 1 to enable linting when leaving insert mode.
let g:ale_lint_on_insert_leave = get(g:, 'ale_lint_on_insert_leave', 0)
" This flag can be set to 0 to disable linting when the buffer is entered. " This flag can be set to 0 to disable linting when the buffer is entered.
let g:ale_lint_on_enter = get(g:, 'ale_lint_on_enter', 1) let g:ale_lint_on_enter = get(g:, 'ale_lint_on_enter', 1)
@ -149,11 +154,17 @@ let g:ale_history_enabled = get(g:, 'ale_history_enabled', 1)
" A flag for storing the full output of commands in the history. " A flag for storing the full output of commands in the history.
let g:ale_history_log_output = get(g:, 'ale_history_log_output', 0) let g:ale_history_log_output = get(g:, 'ale_history_log_output', 0)
function! s:ALEInitAuGroups() abort function! ALEInitAuGroups() abort
augroup ALERunOnTextChangedGroup augroup ALERunOnTextChangedGroup
autocmd! autocmd!
if g:ale_enabled && g:ale_lint_on_text_changed if g:ale_enabled
autocmd TextChanged,TextChangedI * call ale#Queue(g:ale_lint_delay) if g:ale_lint_on_text_changed ==? 'always' || g:ale_lint_on_text_changed == 1
autocmd TextChanged,TextChangedI * call ale#Queue(g:ale_lint_delay)
elseif g:ale_lint_on_text_changed ==? 'normal'
autocmd TextChanged * call ale#Queue(g:ale_lint_delay)
elseif g:ale_lint_on_text_changed ==? 'insert'
autocmd TextChangedI * call ale#Queue(g:ale_lint_delay)
endif
endif endif
augroup END augroup END
@ -178,6 +189,13 @@ function! s:ALEInitAuGroups() abort
endif endif
augroup END augroup END
augroup ALERunOnInsertLeave
autocmd!
if g:ale_enabled && g:ale_lint_on_insert_leave
autocmd InsertLeave * call ale#Queue(0, 'lint_file')
endif
augroup END
augroup ALECursorGroup augroup ALECursorGroup
autocmd! autocmd!
if g:ale_enabled && g:ale_echo_cursor if g:ale_enabled && g:ale_echo_cursor
@ -193,6 +211,7 @@ function! s:ALEInitAuGroups() abort
augroup! ALERunOnTextChangedGroup augroup! ALERunOnTextChangedGroup
augroup! ALERunOnEnterGroup augroup! ALERunOnEnterGroup
augroup! ALERunOnSaveGroup augroup! ALERunOnSaveGroup
augroup! ALERunOnInsertLeave
augroup! ALECursorGroup augroup! ALECursorGroup
endif endif
endfunction endfunction
@ -219,10 +238,10 @@ function! s:ALEToggle() abort
endif endif
endif endif
call s:ALEInitAuGroups() call ALEInitAuGroups()
endfunction endfunction
call s:ALEInitAuGroups() call ALEInitAuGroups()
" Define commands for moving through warnings and errors. " Define commands for moving through warnings and errors.
command! -bar ALEPrevious :call ale#loclist_jumping#Jump('before', 0) command! -bar ALEPrevious :call ale#loclist_jumping#Jump('before', 0)

View File

@ -19,7 +19,7 @@ Before:
\ 'let g:ale_lint_delay = 200', \ 'let g:ale_lint_delay = 200',
\ 'let g:ale_lint_on_enter = 1', \ 'let g:ale_lint_on_enter = 1',
\ 'let g:ale_lint_on_save = 1', \ 'let g:ale_lint_on_save = 1',
\ 'let g:ale_lint_on_text_changed = 1', \ 'let g:ale_lint_on_text_changed = ''always''',
\ 'let g:ale_linter_aliases = {}', \ 'let g:ale_linter_aliases = {}',
\ 'let g:ale_linters = {}', \ 'let g:ale_linters = {}',
\ 'let g:ale_open_list = 0', \ 'let g:ale_open_list = 0',

View File

@ -0,0 +1,66 @@
Before:
Save g:ale_lint_on_text_changed
Save g:ale_lint_on_insert_leave
autocmd!
After:
Restore g:ale_lint_on_text_changed
Restore g:ale_lint_on_insert_leave
unlet! g:output
unlet! g:expected_autocmd
autocmd!
Execute (ALE should bind to TextChanged events when g:ale_lint_on_text_changed = 1):
let g:expected_autocmd = join([
\ '',
\ '--- Auto-Commands ---',
\ 'ALERunOnTextChangedGroup TextChanged',
\ ' * call ale#Queue(g:ale_lint_delay)',
\ 'ALERunOnTextChangedGroup TextChangedI',
\ ' * call ale#Queue(g:ale_lint_delay)',
\], "\n")
let g:ale_lint_on_text_changed = 1
call ALEInitAuGroups()
redir => g:output
autocmd ALERunOnTextChangedGroup TextChanged,TextChangedI *
redir END
AssertEqual g:expected_autocmd, g:output
Execute (ALE should bind to TextChanged events when g:ale_lint_on_text_changed = 'always'):
let g:expected_autocmd = join([
\ '',
\ '--- Auto-Commands ---',
\ 'ALERunOnTextChangedGroup TextChanged',
\ ' * call ale#Queue(g:ale_lint_delay)',
\ 'ALERunOnTextChangedGroup TextChangedI',
\ ' * call ale#Queue(g:ale_lint_delay)',
\], "\n")
let g:ale_lint_on_text_changed = 'always'
call ALEInitAuGroups()
redir => g:output
autocmd ALERunOnTextChangedGroup TextChanged,TextChangedI *
redir END
AssertEqual g:expected_autocmd, g:output
Execute (ALE should bind to InsertLeave event when g:ale_lint_on_insert_leave = 1):
let g:expected_autocmd = join([
\ "",
\ "--- Auto-Commands ---",
\ "ALERunOnInsertLeave InsertLeave",
\ " * call ale#Queue(0, 'lint_file')",
\], "\n")
let g:ale_lint_on_insert_leave = 1
call ALEInitAuGroups()
redir => g:output
autocmd ALERunOnInsertLeave InsertLeave *
redir END
AssertEqual g:expected_autocmd, g:output