diff options
Diffstat (limited to 'autoload/ale.vim')
-rw-r--r-- | autoload/ale.vim | 106 |
1 files changed, 34 insertions, 72 deletions
diff --git a/autoload/ale.vim b/autoload/ale.vim index 41d78753..dddb41db 100644 --- a/autoload/ale.vim +++ b/autoload/ale.vim @@ -10,8 +10,7 @@ let g:ale_echo_msg_warning_str = get(g:, 'ale_echo_msg_warning_str', 'Warning') let g:ale_linters_ignore = get(g:, 'ale_linters_ignore', {}) let s:lint_timer = -1 -let s:queued_buffer_number = -1 -let s:should_lint_file_for_buffer = {} +let s:getcmdwintype_exists = exists('*getcmdwintype') " Return 1 if a file is too large for ALE to handle. function! ale#FileTooLarge(buffer) abort @@ -20,8 +19,6 @@ function! ale#FileTooLarge(buffer) abort return l:max > 0 ? (line2byte(line('$') + 1) > l:max) : 0 endfunction -let s:getcmdwintype_exists = exists('*getcmdwintype') - " A function for checking various conditions whereby ALE just shouldn't " attempt to do anything, say if particular buffer types are open in Vim. function! ale#ShouldDoNothing(buffer) abort @@ -86,18 +83,39 @@ function! ale#ShouldDoNothing(buffer) abort return 0 endfunction +function! s:Lint(buffer, should_lint_file, timer_id) abort + " Use the filetype from the buffer + let l:filetype = getbufvar(a:buffer, '&filetype') + let l:linters = ale#linter#Get(l:filetype) + + " Apply ignore lists for linters only if needed. + let l:ignore_config = ale#Var(a:buffer, 'linters_ignore') + let l:linters = !empty(l:ignore_config) + \ ? ale#engine#ignore#Exclude(l:filetype, l:linters, l:ignore_config) + \ : l:linters + + " Don't set up buffer data and so on if there are no linters to run. + if !has_key(g:ale_buffer_info, a:buffer) && empty(l:linters) + return + endif + + " Clear lint_file linters, or only run them if the file exists. + let l:lint_file = empty(l:linters) + \ || (a:should_lint_file && filereadable(expand('#' . a:buffer . ':p'))) + + call ale#engine#RunLinters(a:buffer, l:linters, l:lint_file) +endfunction + " (delay, [linting_flag, buffer_number]) function! ale#Queue(delay, ...) abort if a:0 > 2 throw 'too many arguments!' endif - " Default linting_flag to '' - let l:linting_flag = get(a:000, 0, '') - let l:buffer = get(a:000, 1, bufnr('')) + let l:buffer = get(a:000, 1, v:null) - if l:linting_flag isnot# '' && l:linting_flag isnot# 'lint_file' - throw "linting_flag must be either '' or 'lint_file'" + if l:buffer is v:null + let l:buffer = bufnr('') endif if type(l:buffer) isnot v:t_number @@ -108,78 +126,22 @@ function! ale#Queue(delay, ...) abort return endif - " Remember that we want to check files for this buffer. - " We will remember this until we finally run the linters, via any event. - if l:linting_flag is# 'lint_file' - let s:should_lint_file_for_buffer[l:buffer] = 1 - endif + " Default linting_flag to '' + let l:should_lint_file = get(a:000, 0) is# 'lint_file' if s:lint_timer != -1 call timer_stop(s:lint_timer) let s:lint_timer = -1 endif - let l:linters = ale#linter#Get(getbufvar(l:buffer, '&filetype')) - - " Don't set up buffer data and so on if there are no linters to run. - if empty(l:linters) - " If we have some previous buffer data, then stop any jobs currently - " running and clear everything. - if has_key(g:ale_buffer_info, l:buffer) - call ale#engine#RunLinters(l:buffer, [], 1) - endif - - return - endif - if a:delay > 0 - let s:queued_buffer_number = l:buffer - let s:lint_timer = timer_start(a:delay, function('ale#Lint')) - else - call ale#Lint(-1, l:buffer) - endif -endfunction - -function! ale#Lint(...) abort - if a:0 > 1 - " Use the buffer number given as the optional second argument. - let l:buffer = a:2 - elseif a:0 > 0 && a:1 == s:lint_timer - " Use the buffer number for the buffer linting was queued for. - let l:buffer = s:queued_buffer_number + let s:lint_timer = timer_start( + \ a:delay, + \ function('s:Lint', [l:buffer, l:should_lint_file]) + \) else - " Use the current buffer number. - let l:buffer = bufnr('') - endif - - if ale#ShouldDoNothing(l:buffer) - return + call s:Lint(l:buffer, l:should_lint_file, 0) endif - - " Use the filetype from the buffer - let l:filetype = getbufvar(l:buffer, '&filetype') - let l:linters = ale#linter#Get(l:filetype) - let l:should_lint_file = 0 - - " Check if we previously requested checking the file. - if has_key(s:should_lint_file_for_buffer, l:buffer) - unlet s:should_lint_file_for_buffer[l:buffer] - " Lint files if they exist. - let l:should_lint_file = filereadable(expand('#' . l:buffer . ':p')) - endif - - " Apply ignore lists for linters only if needed. - let l:ignore_config = ale#Var(l:buffer, 'linters_ignore') - let l:linters = !empty(l:ignore_config) - \ ? ale#engine#ignore#Exclude(l:filetype, l:linters, l:ignore_config) - \ : l:linters - - call ale#engine#RunLinters(l:buffer, l:linters, l:should_lint_file) -endfunction - -" Reset flags indicating that files should be checked for all buffers. -function! ale#ResetLintFileMarkers() abort - let s:should_lint_file_for_buffer = {} endfunction let g:ale_has_override = get(g:, 'ale_has_override', {}) |