diff --git a/autoload/ale/events.vim b/autoload/ale/events.vim index 1992b1ee..a7f6b378 100644 --- a/autoload/ale/events.vim +++ b/autoload/ale/events.vim @@ -2,21 +2,26 @@ function! ale#events#QuitEvent(buffer) abort " Remember when ALE is quitting for BufWrite, etc. - call setbufvar(a:buffer, 'ale_quitting', 1) + call setbufvar(a:buffer, 'ale_quitting', ale#util#ClockMilliseconds()) +endfunction + +function! ale#events#QuitRecently(buffer) abort + let l:time = getbufvar(a:buffer, 'ale_quitting', 0) + + return l:time && ale#util#ClockMilliseconds() - l:time < 1000 endfunction function! ale#events#SaveEvent(buffer) abort call setbufvar(a:buffer, 'ale_save_event_fired', 1) let l:should_lint = ale#Var(a:buffer, 'enabled') \ && g:ale_lint_on_save - \ && !getbufvar(a:buffer, 'ale_quitting') if g:ale_fix_on_save let l:will_fix = ale#fix#Fix('save_file') let l:should_lint = l:should_lint && !l:will_fix endif - if l:should_lint + if l:should_lint && !ale#events#QuitRecently(a:buffer) call ale#Queue(0, 'lint_file', a:buffer) endif endfunction diff --git a/autoload/ale/fix.vim b/autoload/ale/fix.vim index 2b5387de..a9bb7d48 100644 --- a/autoload/ale/fix.vim +++ b/autoload/ale/fix.vim @@ -58,7 +58,7 @@ function! ale#fix#ApplyQueuedFixes() abort " fixing problems. if g:ale_enabled \&& l:should_lint - \&& !getbufvar(l:buffer, 'ale_quitting') + \&& !ale#events#QuitRecently(l:buffer) call ale#Queue(0, l:data.should_save ? 'lint_file' : '') endif endfunction diff --git a/test/test_no_linting_on_write_quit.vader b/test/test_no_linting_on_write_quit.vader index dc78ef75..271adf65 100644 --- a/test/test_no_linting_on_write_quit.vader +++ b/test/test_no_linting_on_write_quit.vader @@ -55,6 +55,19 @@ Execute(No linting should be done on :wq or :x): AssertEqual [], getloclist(0) +Execute(No linting should be for :w after :q fails): + let g:ale_lint_on_save = 1 + let g:ale_fix_on_save = 0 + + call ale#events#QuitEvent(bufnr('')) + + " Simulate 2 seconds passing. + let b:ale_quitting -= 1000 + + call ale#events#SaveEvent(bufnr('')) + + AssertEqual 1, len(getloclist(0)) + Execute(No linting should be done on :wq or :x after fixing files): let g:ale_lint_on_save = 0 let g:ale_fix_on_save = 1 @@ -69,3 +82,16 @@ Execute(No linting should be done on :wq or :x after fixing files): call ale#events#SaveEvent(bufnr('')) AssertEqual [], getloclist(0) + +Execute(Linting should be done after :q fails and fixing files): + let g:ale_lint_on_save = 0 + let g:ale_fix_on_save = 1 + + call ale#events#QuitEvent(bufnr('')) + + " Simulate 2 seconds passing. + let b:ale_quitting -= 1000 + + call ale#events#SaveEvent(bufnr('')) + + AssertEqual 1, len(getloclist(0)) diff --git a/test/test_quitting_variable.vader b/test/test_quitting_variable.vader index 80b0a8dd..bef344a8 100644 --- a/test/test_quitting_variable.vader +++ b/test/test_quitting_variable.vader @@ -8,11 +8,15 @@ After: Restore unlet! b:ale_quitting + unlet! b:time_before + +Execute(QuitEvent should set b:ale_quitting some time from the clock): + let b:time_before = ale#util#ClockMilliseconds() -Execute(QuitEvent should set b:ale_quitting to 1): call ale#events#QuitEvent(bufnr('')) - AssertEqual 1, b:ale_quitting + Assert b:ale_quitting >= b:time_before + Assert b:ale_quitting <= ale#util#ClockMilliseconds() Execute(EnterEvent should set b:ale_quitting to 0): let b:ale_quitting = 1 @@ -20,3 +24,16 @@ Execute(EnterEvent should set b:ale_quitting to 0): call ale#events#EnterEvent(bufnr('')) AssertEqual 0, b:ale_quitting + +Execute(The QuitRecently function should work when the variable isn't set): + AssertEqual 0, ale#events#QuitRecently(bufnr('')) + +Execute(The QuitRecently function should return 1 when ALE quit recently): + let b:ale_quitting = ale#util#ClockMilliseconds() + + AssertEqual 1, ale#events#QuitRecently(bufnr('')) + +Execute(The QuitRecently function should return 0 when a second has passed): + let b:ale_quitting = ale#util#ClockMilliseconds() - 1001 + + AssertEqual 0, ale#events#QuitRecently(bufnr(''))