Take sign information out of the buffer variables, and make it so dummy signs are set and removed more reliably.

This commit is contained in:
w0rp 2016-11-04 11:58:56 +00:00
parent ca18a80e3e
commit ec2845eefa
2 changed files with 31 additions and 24 deletions

View File

@ -23,12 +23,10 @@ endfunction
function! ale#engine#InitBufferInfo(buffer) abort
if !has_key(g:ale_buffer_info, a:buffer)
" job_list will hold the list of jobs
" dummy_sign_set will tell us if we previously created a dummy sign.
" loclist holds the loclist items after all jobs have completed.
" new_loclist holds loclist items while jobs are being run.
let g:ale_buffer_info[a:buffer] = {
\ 'job_list': [],
\ 'dummy_sign_set': 0,
\ 'loclist': [],
\ 'new_loclist': [],
\}

View File

@ -31,7 +31,7 @@ function! ale#sign#FindCurrentSigns(buffer) abort
" Matches output like :
" line=4 id=1 name=ALEErrorSign
" строка=1 id=1000001 имя=ALEErrorSign
let l:pattern = 'id=\(\d\+\).*=ALE\(Warning\|Error\)Sign'
let l:pattern = 'id=\(\d\+\).*=ALE\(Warning\|Error\|Dummy\)Sign'
redir => l:output
silent exec 'sign place buffer=' . a:buffer
@ -88,26 +88,36 @@ endfunction
function! ale#sign#SetSigns(buffer, loclist) abort
let l:signlist = ale#sign#CombineSigns(a:loclist)
if len(l:signlist) > 0 || g:ale_sign_column_always
if !g:ale_buffer_info[a:buffer].dummy_sign_set
" Insert a dummy sign if one is missing.
execute 'sign place ' . g:ale_sign_offset
\ . ' line=1 name=ALEDummySign buffer='
\ . a:buffer
let g:ale_buffer_info[a:buffer].dummy_sign_set = 1
endif
endif
" Find the current signs with the markers we use.
" Find the current markers
let l:current_id_list = ale#sign#FindCurrentSigns(a:buffer)
let l:dummy_sign_set = 0
" Remove those markers.
" Check if we set the dummy sign already.
for l:current_id in l:current_id_list
exec 'sign unplace ' . l:current_id . ' buffer=' . a:buffer
if l:current_id == g:ale_sign_offset
let l:dummy_sign_set = 1
endif
endfor
" Now set all of the signs.
" If we haven't already set a dummy sign, and we have some previous signs
" or always want a dummy sign, then set one, to keep the sign column open.
if !l:dummy_sign_set && (len(l:signlist) > 0 || g:ale_sign_column_always)
execute 'sign place ' . g:ale_sign_offset
\ . ' line=1 name=ALEDummySign buffer='
\ . a:buffer
let l:dummy_sign_set = 1
endif
" Now remove the previous signs. The dummy will hold the column open
" while we add the new signs, if we had signs before.
for l:current_id in l:current_id_list
if l:current_id != g:ale_sign_offset
exec 'sign unplace ' . l:current_id . ' buffer=' . a:buffer
endif
endfor
" Add the new signs,
for l:index in range(0, len(l:signlist) - 1)
let l:sign = l:signlist[l:index]
let l:type = l:sign['type'] ==# 'W' ? 'ALEWarningSign' : 'ALEErrorSign'
@ -120,11 +130,10 @@ function! ale#sign#SetSigns(buffer, loclist) abort
exec l:sign_line
endfor
if !g:ale_sign_column_always && len(l:signlist) > 0
if g:ale_buffer_info[a:buffer].dummy_sign_set
execute 'sign unplace ' . g:ale_sign_offset . ' buffer=' . a:buffer
let g:ale_buffer_info[a:buffer].dummy_sign_set = 0
endif
" Remove the dummy sign now we've updated the signs, unless we want
" to keep it, which will keep the sign column open even when there are
" no warnings or errors.
if l:dummy_sign_set && !g:ale_sign_column_always
execute 'sign unplace ' . g:ale_sign_offset . ' buffer=' . a:buffer
endif
endfunction