From c7fbcb3c02131a4e168290005c1e550b953cb8f4 Mon Sep 17 00:00:00 2001 From: w0rp Date: Sun, 3 Sep 2017 19:44:00 +0100 Subject: [PATCH] Fix #899 - Make the quickfix and loclist windows close again --- autoload/ale/engine.vim | 4 ---- autoload/ale/list.vim | 39 +++++++++++++++++---------------- test/test_list_opening.vader | 20 ++--------------- test/test_set_list_timers.vader | 9 -------- 4 files changed, 22 insertions(+), 50 deletions(-) diff --git a/autoload/ale/engine.vim b/autoload/ale/engine.vim index 74ae0d9c..c49bc9b8 100644 --- a/autoload/ale/engine.vim +++ b/autoload/ale/engine.vim @@ -286,10 +286,6 @@ function! ale#engine#SetResults(buffer, loclist) abort if g:ale_set_quickfix || g:ale_set_loclist call ale#list#SetLists(a:buffer, a:loclist) - - if l:linting_is_done - call ale#list#CloseWindowIfNeeded(a:buffer) - endif endif if exists('*ale#statusline#Update') diff --git a/autoload/ale/list.vim b/autoload/ale/list.vim index 7b2bf2cb..fd8b62ef 100644 --- a/autoload/ale/list.vim +++ b/autoload/ale/list.vim @@ -56,6 +56,10 @@ function! s:FixList(list) abort return l:new_list endfunction +function! s:BufWinId(buffer) abort + return exists('*bufwinid') ? bufwinid(str2nr(a:buffer)) : 0 +endfunction + function! s:SetListsImpl(timer_id, buffer, loclist) abort let l:title = expand('#' . a:buffer . ':p') @@ -72,7 +76,7 @@ function! s:SetListsImpl(timer_id, buffer, loclist) abort " If windows support is off, bufwinid() may not exist. " We'll set result in the current window, which might not be correct, " but is better than nothing. - let l:win_id = exists('*bufwinid') ? bufwinid(str2nr(a:buffer)) : 0 + let l:win_id = s:BufWinId(a:buffer) if has('nvim') call setloclist(l:win_id, s:FixList(a:loclist), ' ', l:title) @@ -82,13 +86,11 @@ function! s:SetListsImpl(timer_id, buffer, loclist) abort endif endif - let l:keep_open = ale#Var(a:buffer, 'keep_list_window_open') - " Open a window to show the problems if we need to. " " We'll check if the current buffer's List is not empty here, so the " window will only be opened if the current buffer has problems. - if s:ShouldOpen(a:buffer) && (l:keep_open || !empty(a:loclist)) + if s:ShouldOpen(a:buffer) && !empty(a:loclist) let l:winnr = winnr() let l:mode = mode() let l:reset_visual_selection = l:mode is? 'v' || l:mode is# "\" @@ -117,6 +119,13 @@ function! s:SetListsImpl(timer_id, buffer, loclist) abort endif endif endif + + " If ALE isn't currently checking for more problems, close the window if + " needed now. This check happens inside of this timer function, so + " the window can be closed reliably. + if !ale#engine#IsCheckingBuffer(bufnr('')) + call s:CloseWindowIfNeeded(a:buffer) + endif endfunction function! ale#list#SetLists(buffer, loclist) abort @@ -131,7 +140,7 @@ function! ale#list#SetLists(buffer, loclist) abort endif endfunction -function! s:CloseWindowIfNeededImpl(timer_id, buffer) abort +function! s:CloseWindowIfNeeded(buffer) abort if ale#Var(a:buffer, 'keep_list_window_open') || !s:ShouldOpen(a:buffer) return endif @@ -143,22 +152,14 @@ function! s:CloseWindowIfNeededImpl(timer_id, buffer) abort if empty(getqflist()) cclose endif - elseif g:ale_set_loclist && empty(getloclist(0)) - lclose + else + let l:win_id = s:BufWinId(a:buffer) + + if g:ale_set_loclist && empty(getloclist(l:win_id)) + lclose + endif endif " Ignore 'Cannot close last window' errors. catch /E444/ endtry endfunction - -function! ale#list#CloseWindowIfNeeded(buffer) abort - if get(g:, 'ale_set_lists_synchronously') == 1 - call s:CloseWindowIfNeededImpl(-1, a:buffer) - else - call ale#util#StartPartialTimer( - \ 0, - \ function('s:CloseWindowIfNeededImpl'), - \ [a:buffer], - \) - endif -endfunction diff --git a/test/test_list_opening.vader b/test/test_list_opening.vader index 7d386d80..7dc5a79b 100644 --- a/test/test_list_opening.vader +++ b/test/test_list_opening.vader @@ -6,12 +6,14 @@ Before: Save g:ale_keep_list_window_open Save g:ale_list_window_size Save g:ale_buffer_info + Save g:ale_set_lists_synchronously let g:ale_set_loclist = 1 let g:ale_set_quickfix = 0 let g:ale_open_list = 0 let g:ale_keep_list_window_open = 0 let g:ale_list_window_size = 10 + let g:ale_set_lists_synchronously = 1 let g:loclist = [ \ {'bufnr': bufnr(''), 'lnum': 5, 'col': 5, 'text': 'x'}, @@ -70,17 +72,14 @@ Execute(The quickfix window should open for just the loclist): " It should not open for an empty list. call ale#list#SetLists(bufnr('%'), []) - call ale#list#CloseWindowIfNeeded(bufnr('')) Assert !ale#list#IsQuickfixOpen() " With a non-empty loclist, the window must open. call ale#list#SetLists(bufnr('%'), g:loclist) - call ale#list#CloseWindowIfNeeded(bufnr('')) Assert ale#list#IsQuickfixOpen() " Clear the list and it should close again. call ale#list#SetLists(bufnr('%'), []) - call ale#list#CloseWindowIfNeeded(bufnr('')) Assert !ale#list#IsQuickfixOpen() Execute(The quickfix window height should be correct for the loclist): @@ -88,7 +87,6 @@ Execute(The quickfix window height should be correct for the loclist): let g:ale_list_window_size = 7 call ale#list#SetLists(bufnr('%'), g:loclist) - call ale#list#CloseWindowIfNeeded(bufnr('')) AssertEqual 7, GetQuickfixHeight() @@ -97,7 +95,6 @@ Execute(The quickfix window height should be correct for the loclist with buffer let b:ale_list_window_size = 8 call ale#list#SetLists(bufnr('%'), g:loclist) - call ale#list#CloseWindowIfNeeded(bufnr('')) AssertEqual 8, GetQuickfixHeight() @@ -107,16 +104,13 @@ Execute(The quickfix window should stay open for just the loclist): " The window should stay open after even after it is made blank again. call ale#list#SetLists(bufnr('%'), g:loclist) - call ale#list#CloseWindowIfNeeded(bufnr('')) call ale#list#SetLists(bufnr('%'), []) - call ale#list#CloseWindowIfNeeded(bufnr('')) Assert ale#list#IsQuickfixOpen() Execute(The quickfix window should not open by default when quickfix is on): let g:ale_set_quickfix = 1 call ale#list#SetLists(bufnr('%'), g:loclist) - call ale#list#CloseWindowIfNeeded(bufnr('')) Assert !ale#list#IsQuickfixOpen() Execute(The quickfix window should open for the quickfix list): @@ -129,24 +123,20 @@ Execute(The quickfix window should open for the quickfix list): " It should not open for an empty list. call ale#list#SetLists(bufnr('%'), []) - call ale#list#CloseWindowIfNeeded(bufnr('')) Assert !ale#list#IsQuickfixOpen(), 'The quickfix window was opened when the list was empty' " With a non-empty quickfix list, the window must open. call ale#list#SetLists(bufnr('%'), g:loclist) - call ale#list#CloseWindowIfNeeded(bufnr('')) Assert ale#list#IsQuickfixOpen(), 'The quickfix window was closed when the list was not empty' " Clear this List. The window should stay open, as there are other items. let g:ale_buffer_info[bufnr('')].loclist = [] call ale#list#SetLists(bufnr('%'), []) - call ale#list#CloseWindowIfNeeded(bufnr('')) Assert ale#list#IsQuickfixOpen(), 'The quickfix window closed even though there are items in another buffer' " Clear the other List now. Now the window should close. call remove(g:ale_buffer_info, bufnr('') + 1) call ale#list#SetLists(bufnr('%'), []) - call ale#list#CloseWindowIfNeeded(bufnr('')) Assert !ale#list#IsQuickfixOpen(), 'The quickfix window was not closed' Execute(The quickfix window should stay open for the quickfix list): @@ -156,9 +146,7 @@ Execute(The quickfix window should stay open for the quickfix list): " The window should stay open after even after it is made blank again. call ale#list#SetLists(bufnr('%'), g:loclist) - call ale#list#CloseWindowIfNeeded(bufnr('')) call ale#list#SetLists(bufnr('%'), []) - call ale#list#CloseWindowIfNeeded(bufnr('')) Assert ale#list#IsQuickfixOpen() Execute(The quickfix window height should be correct for the quickfix list): @@ -167,7 +155,6 @@ Execute(The quickfix window height should be correct for the quickfix list): let g:ale_list_window_size = 7 call ale#list#SetLists(bufnr('%'), g:loclist) - call ale#list#CloseWindowIfNeeded(bufnr('')) AssertEqual 7, GetQuickfixHeight() @@ -177,7 +164,6 @@ Execute(The quickfix window height should be correct for the quickfix list with let b:ale_list_window_size = 8 call ale#list#SetLists(bufnr('%'), g:loclist) - call ale#list#CloseWindowIfNeeded(bufnr('')) AssertEqual 8, GetQuickfixHeight() @@ -192,9 +178,7 @@ Execute(The buffer ale_keep_list_window_open option should be respected): let b:ale_keep_list_window_open = 1 call ale#list#SetLists(bufnr('%'), g:loclist) - call ale#list#CloseWindowIfNeeded(bufnr('')) call ale#list#SetLists(bufnr('%'), []) - call ale#list#CloseWindowIfNeeded(bufnr('')) Assert ale#list#IsQuickfixOpen() diff --git a/test/test_set_list_timers.vader b/test/test_set_list_timers.vader index 90aacb55..f8fcb6a0 100644 --- a/test/test_set_list_timers.vader +++ b/test/test_set_list_timers.vader @@ -27,12 +27,3 @@ Execute(The SetLists function should work when run in a timer): \ 'type': 'E', \ 'pattern': '', \}], getloclist(0) - -Execute(The CloseWindowIfNeeded function should work when run in a timer): - let g:ale_open_list = 1 - lopen - - call ale#list#CloseWindowIfNeeded(bufnr('')) - sleep 1ms - - Assert !ale#list#IsQuickfixOpen(), 'The window was not closed!'