diff --git a/autoload/ale.vim b/autoload/ale.vim index 5efe15ab..aba3fda1 100644 --- a/autoload/ale.vim +++ b/autoload/ale.vim @@ -15,19 +15,19 @@ endfunction " 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() abort +function! ale#ShouldDoNothing(buffer) abort " Do nothing for blacklisted files " OR if ALE is running in the sandbox return index(g:ale_filetype_blacklist, &filetype) >= 0 \ || (exists('*getcmdwintype') && !empty(getcmdwintype())) \ || ale#util#InSandbox() - \ || !ale#Var(bufnr(''), 'enabled') + \ || !ale#Var(a:buffer, 'enabled') \ || ale#FileTooLarge() endfunction -" (delay, [linting_flag]) +" (delay, [linting_flag, buffer_number]) function! ale#Queue(delay, ...) abort - if len(a:0) > 1 + if a:0 > 2 throw 'too many arguments!' endif @@ -38,7 +38,13 @@ function! ale#Queue(delay, ...) abort throw "linting_flag must be either '' or 'lint_file'" endif - if ale#ShouldDoNothing() + let l:buffer = get(a:000, 1, bufnr('')) + + if type(l:buffer) != type(0) + throw 'buffer_number must be a Number' + endif + + if ale#ShouldDoNothing(l:buffer) return endif @@ -53,7 +59,6 @@ function! ale#Queue(delay, ...) abort let s:lint_timer = -1 endif - let l:buffer = bufnr('') 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. @@ -68,21 +73,26 @@ function! ale#Queue(delay, ...) abort endif if a:delay > 0 - let s:queued_buffer_number = bufnr('%') + let s:queued_buffer_number = l:buffer let s:lint_timer = timer_start(a:delay, function('ale#Lint')) else - call ale#Lint() + call ale#Lint(-1, l:buffer) endif endfunction function! ale#Lint(...) abort - " Get the buffer number linting was queued for. - " or else take the current one. - let l:buffer = len(a:0) > 1 && a:1 == s:lint_timer - \ ? s:queued_buffer_number - \ : bufnr('%') + 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 + else + " Use the current buffer number. + let l:buffer = bufnr('') + endif - if ale#ShouldDoNothing() + if ale#ShouldDoNothing(l:buffer) return endif diff --git a/autoload/ale/cursor.vim b/autoload/ale/cursor.vim index 3e19b6fc..0c6a8634 100644 --- a/autoload/ale/cursor.vim +++ b/autoload/ale/cursor.vim @@ -66,7 +66,7 @@ function! s:StopCursorTimer() abort endfunction function! ale#cursor#EchoCursorWarning(...) abort - if ale#ShouldDoNothing() + if ale#ShouldDoNothing(bufnr('')) return endif @@ -93,7 +93,7 @@ let s:cursor_timer = -1 let s:last_pos = [0, 0, 0] function! ale#cursor#EchoCursorWarningWithDelay() abort - if ale#ShouldDoNothing() + if ale#ShouldDoNothing(bufnr('')) return endif @@ -112,7 +112,7 @@ function! ale#cursor#EchoCursorWarningWithDelay() abort endfunction function! ale#cursor#ShowCursorDetail() abort - if ale#ShouldDoNothing() + if ale#ShouldDoNothing(bufnr('')) return endif diff --git a/autoload/ale/engine.vim b/autoload/ale/engine.vim index 76c529fb..52acfe7f 100644 --- a/autoload/ale/engine.vim +++ b/autoload/ale/engine.vim @@ -139,7 +139,7 @@ function! s:HandleLoclist(linter_name, buffer, loclist) abort " for efficient lookup of the messages in the cursor handler. call sort(g:ale_buffer_info[a:buffer].loclist, 'ale#util#LocItemCompare') - if ale#ShouldDoNothing() + if ale#ShouldDoNothing(a:buffer) return endif diff --git a/autoload/ale/events.vim b/autoload/ale/events.vim index f740fdaa..4722afa9 100644 --- a/autoload/ale/events.vim +++ b/autoload/ale/events.vim @@ -1,7 +1,7 @@ " Author: w0rp -function! ale#events#SaveEvent() abort - let l:should_lint = g:ale_enabled && g:ale_lint_on_save +function! ale#events#SaveEvent(buffer) abort + let l:should_lint = ale#Var(a:buffer, 'enabled') && g:ale_lint_on_save if g:ale_fix_on_save let l:will_fix = ale#fix#Fix('save_file') @@ -9,25 +9,27 @@ function! ale#events#SaveEvent() abort endif if l:should_lint - call ale#Queue(0, 'lint_file') + call ale#Queue(0, 'lint_file', a:buffer) endif endfunction -function! s:LintOnEnter() abort - if g:ale_enabled && g:ale_lint_on_enter && has_key(b:, 'ale_file_changed') +function! s:LintOnEnter(buffer) abort + if ale#Var(a:buffer, 'enabled') + \&& g:ale_lint_on_enter + \&& has_key(b:, 'ale_file_changed') call remove(b:, 'ale_file_changed') - call ale#Queue(0, 'lint_file') + call ale#Queue(0, 'lint_file', a:buffer) endif endfunction -function! ale#events#EnterEvent() abort - call s:LintOnEnter() +function! ale#events#EnterEvent(buffer) abort + call s:LintOnEnter(a:buffer) endfunction function! ale#events#FileChangedEvent(buffer) abort call setbufvar(a:buffer, 'ale_file_changed', 1) if bufnr('') == a:buffer - call s:LintOnEnter() + call s:LintOnEnter(a:buffer) endif endfunction diff --git a/plugin/ale.vim b/plugin/ale.vim index dc9b93ee..79e6836b 100644 --- a/plugin/ale.vim +++ b/plugin/ale.vim @@ -219,11 +219,11 @@ function! ALEInitAuGroups() abort augroup ALERunOnEnterGroup autocmd! if g:ale_enabled && g:ale_lint_on_enter - autocmd BufWinEnter,BufRead * call ale#Queue(300, 'lint_file') + autocmd BufWinEnter,BufRead * call ale#Queue(0, 'lint_file', str2nr(expand(''))) " Track when the file is changed outside of Vim. autocmd FileChangedShellPost * call ale#events#FileChangedEvent(str2nr(expand(''))) " If the file has been changed, then check it again on enter. - autocmd BufEnter * call ale#events#EnterEvent() + autocmd BufEnter * call ale#events#EnterEvent(str2nr(expand(''))) endif augroup END @@ -245,7 +245,7 @@ function! ALEInitAuGroups() abort augroup ALERunOnSaveGroup autocmd! if (g:ale_enabled && g:ale_lint_on_save) || g:ale_fix_on_save - autocmd BufWritePost * call ale#events#SaveEvent() + autocmd BufWritePost * call ale#events#SaveEvent(str2nr(expand(''))) endif augroup END diff --git a/test/test_ale_fix.vader b/test/test_ale_fix.vader index d7c3fb35..bafeee2b 100644 --- a/test/test_ale_fix.vader +++ b/test/test_ale_fix.vader @@ -246,7 +246,7 @@ Execute(ALEFix should save files on the save event): let g:ale_fixers.testft = ['AddDollars'] call SetUpLinters() - call ale#events#SaveEvent() + call ale#events#SaveEvent(bufnr('')) " We should save the file. AssertEqual ['$a', '$b', '$c'], readfile('fix_test_file') @@ -285,7 +285,7 @@ Execute(ALEFix should still lint with no linters to be applied): let g:ale_fixers.testft = [] call SetUpLinters() - call ale#events#SaveEvent() + call ale#events#SaveEvent(bufnr('')) Assert !filereadable('fix_test_file'), 'The file should not have been saved' @@ -317,7 +317,7 @@ Execute(ALEFix should still lint when nothing was fixed on save): let g:ale_fixers.testft = ['DoNothing'] call SetUpLinters() - call ale#events#SaveEvent() + call ale#events#SaveEvent(bufnr('')) Assert !filereadable('fix_test_file'), 'The file should not have been saved' diff --git a/test/test_ale_init_au_groups.vader b/test/test_ale_init_au_groups.vader index c20f4f97..e036343b 100644 --- a/test/test_ale_init_au_groups.vader +++ b/test/test_ale_init_au_groups.vader @@ -116,9 +116,9 @@ Execute (g:ale_lint_on_enter = 1 should bind the required events): let g:ale_lint_on_enter = 1 AssertEqual [ - \ 'BufEnter * call ale#events#EnterEvent()', - \ 'BufReadPost * call ale#Queue(300, ''lint_file'')', - \ 'BufWinEnter * call ale#Queue(300, ''lint_file'')', + \ 'BufEnter * call ale#events#EnterEvent(str2nr(expand('''')))', + \ 'BufReadPost * call ale#Queue(0, ''lint_file'', str2nr(expand('''')))', + \ 'BufWinEnter * call ale#Queue(0, ''lint_file'', str2nr(expand('''')))', \ 'FileChangedShellPost * call ale#events#FileChangedEvent(str2nr(expand('''')))', \], CheckAutocmd('ALERunOnEnterGroup') @@ -151,7 +151,7 @@ Execute (g:ale_lint_on_save = 1 should bind no events): let g:ale_fix_on_save = 0 AssertEqual [ - \ 'BufWritePost * call ale#events#SaveEvent()', + \ 'BufWritePost * call ale#events#SaveEvent(str2nr(expand('''')))', \], CheckAutocmd('ALERunOnSaveGroup') Execute (g:ale_lint_on_save = 0 and g:ale_fix_on_save = 1 should bind events): @@ -159,7 +159,7 @@ Execute (g:ale_lint_on_save = 0 and g:ale_fix_on_save = 1 should bind events): let g:ale_fix_on_save = 1 AssertEqual [ - \ 'BufWritePost * call ale#events#SaveEvent()', + \ 'BufWritePost * call ale#events#SaveEvent(str2nr(expand('''')))', \], CheckAutocmd('ALERunOnSaveGroup') Execute (g:ale_fix_on_save = 1 should bind events even when ALE is disabled): @@ -168,7 +168,7 @@ Execute (g:ale_fix_on_save = 1 should bind events even when ALE is disabled): let g:ale_fix_on_save = 1 AssertEqual [ - \ 'BufWritePost * call ale#events#SaveEvent()', + \ 'BufWritePost * call ale#events#SaveEvent(str2nr(expand('''')))', \], CheckAutocmd('ALERunOnSaveGroup') Execute (g:ale_echo_cursor = 0 should bind no events): diff --git a/test/test_lint_on_enter_when_file_changed.vader b/test/test_lint_on_enter_when_file_changed.vader index cfa53878..4d4f19cc 100644 --- a/test/test_lint_on_enter_when_file_changed.vader +++ b/test/test_lint_on_enter_when_file_changed.vader @@ -64,7 +64,7 @@ Execute(The buffer should be checked after entering it after the file has change let b:ale_file_changed = 1 set filetype=foobar - call ale#events#EnterEvent() + call ale#events#EnterEvent(bufnr('')) AssertEqual [{ \ 'bufnr': bufnr(''),