Fix #899 - Make the quickfix and loclist windows close again
This commit is contained in:
parent
d482b8e3b7
commit
c7fbcb3c02
4 changed files with 22 additions and 50 deletions
|
@ -286,10 +286,6 @@ function! ale#engine#SetResults(buffer, loclist) abort
|
||||||
|
|
||||||
if g:ale_set_quickfix || g:ale_set_loclist
|
if g:ale_set_quickfix || g:ale_set_loclist
|
||||||
call ale#list#SetLists(a:buffer, a:loclist)
|
call ale#list#SetLists(a:buffer, a:loclist)
|
||||||
|
|
||||||
if l:linting_is_done
|
|
||||||
call ale#list#CloseWindowIfNeeded(a:buffer)
|
|
||||||
endif
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if exists('*ale#statusline#Update')
|
if exists('*ale#statusline#Update')
|
||||||
|
|
|
@ -56,6 +56,10 @@ function! s:FixList(list) abort
|
||||||
return l:new_list
|
return l:new_list
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function! s:BufWinId(buffer) abort
|
||||||
|
return exists('*bufwinid') ? bufwinid(str2nr(a:buffer)) : 0
|
||||||
|
endfunction
|
||||||
|
|
||||||
function! s:SetListsImpl(timer_id, buffer, loclist) abort
|
function! s:SetListsImpl(timer_id, buffer, loclist) abort
|
||||||
let l:title = expand('#' . a:buffer . ':p')
|
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.
|
" If windows support is off, bufwinid() may not exist.
|
||||||
" We'll set result in the current window, which might not be correct,
|
" We'll set result in the current window, which might not be correct,
|
||||||
" but is better than nothing.
|
" 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')
|
if has('nvim')
|
||||||
call setloclist(l:win_id, s:FixList(a:loclist), ' ', l:title)
|
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
|
||||||
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.
|
" 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
|
" 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.
|
" 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:winnr = winnr()
|
||||||
let l:mode = mode()
|
let l:mode = mode()
|
||||||
let l:reset_visual_selection = l:mode is? 'v' || l:mode is# "\<c-v>"
|
let l:reset_visual_selection = l:mode is? 'v' || l:mode is# "\<c-v>"
|
||||||
|
@ -117,6 +119,13 @@ function! s:SetListsImpl(timer_id, buffer, loclist) abort
|
||||||
endif
|
endif
|
||||||
endif
|
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
|
endfunction
|
||||||
|
|
||||||
function! ale#list#SetLists(buffer, loclist) abort
|
function! ale#list#SetLists(buffer, loclist) abort
|
||||||
|
@ -131,7 +140,7 @@ function! ale#list#SetLists(buffer, loclist) abort
|
||||||
endif
|
endif
|
||||||
endfunction
|
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)
|
if ale#Var(a:buffer, 'keep_list_window_open') || !s:ShouldOpen(a:buffer)
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
@ -143,22 +152,14 @@ function! s:CloseWindowIfNeededImpl(timer_id, buffer) abort
|
||||||
if empty(getqflist())
|
if empty(getqflist())
|
||||||
cclose
|
cclose
|
||||||
endif
|
endif
|
||||||
elseif g:ale_set_loclist && empty(getloclist(0))
|
else
|
||||||
lclose
|
let l:win_id = s:BufWinId(a:buffer)
|
||||||
|
|
||||||
|
if g:ale_set_loclist && empty(getloclist(l:win_id))
|
||||||
|
lclose
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
" Ignore 'Cannot close last window' errors.
|
" Ignore 'Cannot close last window' errors.
|
||||||
catch /E444/
|
catch /E444/
|
||||||
endtry
|
endtry
|
||||||
endfunction
|
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
|
|
||||||
|
|
|
@ -6,12 +6,14 @@ Before:
|
||||||
Save g:ale_keep_list_window_open
|
Save g:ale_keep_list_window_open
|
||||||
Save g:ale_list_window_size
|
Save g:ale_list_window_size
|
||||||
Save g:ale_buffer_info
|
Save g:ale_buffer_info
|
||||||
|
Save g:ale_set_lists_synchronously
|
||||||
|
|
||||||
let g:ale_set_loclist = 1
|
let g:ale_set_loclist = 1
|
||||||
let g:ale_set_quickfix = 0
|
let g:ale_set_quickfix = 0
|
||||||
let g:ale_open_list = 0
|
let g:ale_open_list = 0
|
||||||
let g:ale_keep_list_window_open = 0
|
let g:ale_keep_list_window_open = 0
|
||||||
let g:ale_list_window_size = 10
|
let g:ale_list_window_size = 10
|
||||||
|
let g:ale_set_lists_synchronously = 1
|
||||||
|
|
||||||
let g:loclist = [
|
let g:loclist = [
|
||||||
\ {'bufnr': bufnr(''), 'lnum': 5, 'col': 5, 'text': 'x'},
|
\ {'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.
|
" It should not open for an empty list.
|
||||||
call ale#list#SetLists(bufnr('%'), [])
|
call ale#list#SetLists(bufnr('%'), [])
|
||||||
call ale#list#CloseWindowIfNeeded(bufnr(''))
|
|
||||||
Assert !ale#list#IsQuickfixOpen()
|
Assert !ale#list#IsQuickfixOpen()
|
||||||
|
|
||||||
" With a non-empty loclist, the window must open.
|
" With a non-empty loclist, the window must open.
|
||||||
call ale#list#SetLists(bufnr('%'), g:loclist)
|
call ale#list#SetLists(bufnr('%'), g:loclist)
|
||||||
call ale#list#CloseWindowIfNeeded(bufnr(''))
|
|
||||||
Assert ale#list#IsQuickfixOpen()
|
Assert ale#list#IsQuickfixOpen()
|
||||||
|
|
||||||
" Clear the list and it should close again.
|
" Clear the list and it should close again.
|
||||||
call ale#list#SetLists(bufnr('%'), [])
|
call ale#list#SetLists(bufnr('%'), [])
|
||||||
call ale#list#CloseWindowIfNeeded(bufnr(''))
|
|
||||||
Assert !ale#list#IsQuickfixOpen()
|
Assert !ale#list#IsQuickfixOpen()
|
||||||
|
|
||||||
Execute(The quickfix window height should be correct for the loclist):
|
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
|
let g:ale_list_window_size = 7
|
||||||
|
|
||||||
call ale#list#SetLists(bufnr('%'), g:loclist)
|
call ale#list#SetLists(bufnr('%'), g:loclist)
|
||||||
call ale#list#CloseWindowIfNeeded(bufnr(''))
|
|
||||||
|
|
||||||
AssertEqual 7, GetQuickfixHeight()
|
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
|
let b:ale_list_window_size = 8
|
||||||
|
|
||||||
call ale#list#SetLists(bufnr('%'), g:loclist)
|
call ale#list#SetLists(bufnr('%'), g:loclist)
|
||||||
call ale#list#CloseWindowIfNeeded(bufnr(''))
|
|
||||||
|
|
||||||
AssertEqual 8, GetQuickfixHeight()
|
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.
|
" The window should stay open after even after it is made blank again.
|
||||||
call ale#list#SetLists(bufnr('%'), g:loclist)
|
call ale#list#SetLists(bufnr('%'), g:loclist)
|
||||||
call ale#list#CloseWindowIfNeeded(bufnr(''))
|
|
||||||
call ale#list#SetLists(bufnr('%'), [])
|
call ale#list#SetLists(bufnr('%'), [])
|
||||||
call ale#list#CloseWindowIfNeeded(bufnr(''))
|
|
||||||
Assert ale#list#IsQuickfixOpen()
|
Assert ale#list#IsQuickfixOpen()
|
||||||
|
|
||||||
Execute(The quickfix window should not open by default when quickfix is on):
|
Execute(The quickfix window should not open by default when quickfix is on):
|
||||||
let g:ale_set_quickfix = 1
|
let g:ale_set_quickfix = 1
|
||||||
|
|
||||||
call ale#list#SetLists(bufnr('%'), g:loclist)
|
call ale#list#SetLists(bufnr('%'), g:loclist)
|
||||||
call ale#list#CloseWindowIfNeeded(bufnr(''))
|
|
||||||
Assert !ale#list#IsQuickfixOpen()
|
Assert !ale#list#IsQuickfixOpen()
|
||||||
|
|
||||||
Execute(The quickfix window should open for the quickfix list):
|
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.
|
" It should not open for an empty list.
|
||||||
call ale#list#SetLists(bufnr('%'), [])
|
call ale#list#SetLists(bufnr('%'), [])
|
||||||
call ale#list#CloseWindowIfNeeded(bufnr(''))
|
|
||||||
Assert !ale#list#IsQuickfixOpen(), 'The quickfix window was opened when the list was empty'
|
Assert !ale#list#IsQuickfixOpen(), 'The quickfix window was opened when the list was empty'
|
||||||
|
|
||||||
" With a non-empty quickfix list, the window must open.
|
" With a non-empty quickfix list, the window must open.
|
||||||
call ale#list#SetLists(bufnr('%'), g:loclist)
|
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'
|
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.
|
" Clear this List. The window should stay open, as there are other items.
|
||||||
let g:ale_buffer_info[bufnr('')].loclist = []
|
let g:ale_buffer_info[bufnr('')].loclist = []
|
||||||
call ale#list#SetLists(bufnr('%'), [])
|
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'
|
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.
|
" Clear the other List now. Now the window should close.
|
||||||
call remove(g:ale_buffer_info, bufnr('') + 1)
|
call remove(g:ale_buffer_info, bufnr('') + 1)
|
||||||
call ale#list#SetLists(bufnr('%'), [])
|
call ale#list#SetLists(bufnr('%'), [])
|
||||||
call ale#list#CloseWindowIfNeeded(bufnr(''))
|
|
||||||
Assert !ale#list#IsQuickfixOpen(), 'The quickfix window was not closed'
|
Assert !ale#list#IsQuickfixOpen(), 'The quickfix window was not closed'
|
||||||
|
|
||||||
Execute(The quickfix window should stay open for the quickfix list):
|
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.
|
" The window should stay open after even after it is made blank again.
|
||||||
call ale#list#SetLists(bufnr('%'), g:loclist)
|
call ale#list#SetLists(bufnr('%'), g:loclist)
|
||||||
call ale#list#CloseWindowIfNeeded(bufnr(''))
|
|
||||||
call ale#list#SetLists(bufnr('%'), [])
|
call ale#list#SetLists(bufnr('%'), [])
|
||||||
call ale#list#CloseWindowIfNeeded(bufnr(''))
|
|
||||||
Assert ale#list#IsQuickfixOpen()
|
Assert ale#list#IsQuickfixOpen()
|
||||||
|
|
||||||
Execute(The quickfix window height should be correct for the quickfix list):
|
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
|
let g:ale_list_window_size = 7
|
||||||
|
|
||||||
call ale#list#SetLists(bufnr('%'), g:loclist)
|
call ale#list#SetLists(bufnr('%'), g:loclist)
|
||||||
call ale#list#CloseWindowIfNeeded(bufnr(''))
|
|
||||||
|
|
||||||
AssertEqual 7, GetQuickfixHeight()
|
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
|
let b:ale_list_window_size = 8
|
||||||
|
|
||||||
call ale#list#SetLists(bufnr('%'), g:loclist)
|
call ale#list#SetLists(bufnr('%'), g:loclist)
|
||||||
call ale#list#CloseWindowIfNeeded(bufnr(''))
|
|
||||||
|
|
||||||
AssertEqual 8, GetQuickfixHeight()
|
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
|
let b:ale_keep_list_window_open = 1
|
||||||
|
|
||||||
call ale#list#SetLists(bufnr('%'), g:loclist)
|
call ale#list#SetLists(bufnr('%'), g:loclist)
|
||||||
call ale#list#CloseWindowIfNeeded(bufnr(''))
|
|
||||||
call ale#list#SetLists(bufnr('%'), [])
|
call ale#list#SetLists(bufnr('%'), [])
|
||||||
call ale#list#CloseWindowIfNeeded(bufnr(''))
|
|
||||||
|
|
||||||
Assert ale#list#IsQuickfixOpen()
|
Assert ale#list#IsQuickfixOpen()
|
||||||
|
|
||||||
|
|
|
@ -27,12 +27,3 @@ Execute(The SetLists function should work when run in a timer):
|
||||||
\ 'type': 'E',
|
\ 'type': 'E',
|
||||||
\ 'pattern': '',
|
\ 'pattern': '',
|
||||||
\}], getloclist(0)
|
\}], 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!'
|
|
||||||
|
|
Reference in a new issue