From 36f9631512fe164ae115c4a216d3cddbf81e6daa Mon Sep 17 00:00:00 2001 From: taylorskalyo Date: Thu, 30 Mar 2017 18:21:37 -0400 Subject: [PATCH] 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 --- README.md | 10 ++--- doc/ale.txt | 20 ++++++--- plugin/ale.vim | 33 +++++++++++---- test/test_ale_info.vader | 2 +- test/test_ale_init_au_groups.vader | 66 ++++++++++++++++++++++++++++++ 5 files changed, 113 insertions(+), 18 deletions(-) create mode 100644 test/test_ale_init_au_groups.vader diff --git a/README.md b/README.md index e9eaf3b..f7ec48b 100644 --- a/README.md +++ b/README.md @@ -368,7 +368,7 @@ options off. ```vim " 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 " if you don't want linters to run on opening a file 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. 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 -error checking, but ALE shouldn't block your ability to edit a document after -you save a file, so the asynchronous nature of the plugin will still be an -advantage. +behaviour. Set `g:ale_lint_on_text_changed` to `never` or `normal`. You won't +get as frequent error checking, but ALE shouldn't block your ability to edit a +document after you save a file, so the asynchronous nature of the plugin will +still be an advantage. 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 diff --git a/doc/ale.txt b/doc/ale.txt index af8e39d..4aac58c 100644 --- a/doc/ale.txt +++ b/doc/ale.txt @@ -286,7 +286,7 @@ g:ale_lint_delay *g:ale_lint_delay* This variable controls the milliseconds delay after which the linters will 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* @@ -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* - Type: |Number| - Default: `1` + Type: |String| + Default: `always` 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 - 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 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 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* diff --git a/plugin/ale.vim b/plugin/ale.vim index d728854..6c044e8 100644 --- a/plugin/ale.vim +++ b/plugin/ale.vim @@ -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. 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. -let g:ale_lint_on_text_changed = get(g:, 'ale_lint_on_text_changed', 1) +" This flag can be set to 'never' to disable linting when text is changed. +" 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. 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. let g:ale_history_log_output = get(g:, 'ale_history_log_output', 0) -function! s:ALEInitAuGroups() abort +function! ALEInitAuGroups() abort augroup ALERunOnTextChangedGroup autocmd! - if g:ale_enabled && g:ale_lint_on_text_changed - autocmd TextChanged,TextChangedI * call ale#Queue(g:ale_lint_delay) + if g:ale_enabled + 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 augroup END @@ -178,6 +189,13 @@ function! s:ALEInitAuGroups() abort endif 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 autocmd! if g:ale_enabled && g:ale_echo_cursor @@ -193,6 +211,7 @@ function! s:ALEInitAuGroups() abort augroup! ALERunOnTextChangedGroup augroup! ALERunOnEnterGroup augroup! ALERunOnSaveGroup + augroup! ALERunOnInsertLeave augroup! ALECursorGroup endif endfunction @@ -219,10 +238,10 @@ function! s:ALEToggle() abort endif endif - call s:ALEInitAuGroups() + call ALEInitAuGroups() endfunction -call s:ALEInitAuGroups() +call ALEInitAuGroups() " Define commands for moving through warnings and errors. command! -bar ALEPrevious :call ale#loclist_jumping#Jump('before', 0) diff --git a/test/test_ale_info.vader b/test/test_ale_info.vader index 6dd6afe..d5a8ed6 100644 --- a/test/test_ale_info.vader +++ b/test/test_ale_info.vader @@ -19,7 +19,7 @@ Before: \ 'let g:ale_lint_delay = 200', \ 'let g:ale_lint_on_enter = 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_linters = {}', \ 'let g:ale_open_list = 0', diff --git a/test/test_ale_init_au_groups.vader b/test/test_ale_init_au_groups.vader new file mode 100644 index 0000000..bcefabe --- /dev/null +++ b/test/test_ale_init_au_groups.vader @@ -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