diff options
author | w0rp <devw0rp@gmail.com> | 2016-10-04 21:10:36 +0100 |
---|---|---|
committer | w0rp <devw0rp@gmail.com> | 2016-10-04 21:10:36 +0100 |
commit | 6754b9f1f8b0ea87f3896c0043a9f35d5e4d2052 (patch) | |
tree | e07504c66fdefabd3a630c415b351e1160dfa716 | |
parent | c6dc324add0d03cadd624bcd0f990207bdd4210a (diff) | |
download | ale-6754b9f1f8b0ea87f3896c0043a9f35d5e4d2052.zip |
Improve the signs feature so it can work with vim-gitgutter and possibly other plugins.
-rw-r--r-- | plugin/ale/aaflags.vim | 3 | ||||
-rw-r--r-- | plugin/ale/sign.vim | 65 | ||||
-rw-r--r-- | plugin/ale/zmain.vim | 2 |
3 files changed, 58 insertions, 12 deletions
diff --git a/plugin/ale/aaflags.vim b/plugin/ale/aaflags.vim index 6c0371cd..8670d8f9 100644 --- a/plugin/ale/aaflags.vim +++ b/plugin/ale/aaflags.vim @@ -33,7 +33,8 @@ endif " This flag can be set to 0 to disable setting signs. if !exists('g:ale_set_signs') - let g:ale_set_signs = 1 + " Enable the flag by default if the 'signs' feature exists. + let g:ale_set_signs = has('signs') endif " This flag can be set to 0 to disable echoing when the cursor moves. diff --git a/plugin/ale/sign.vim b/plugin/ale/sign.vim index 9ea4b2d1..3d74e821 100644 --- a/plugin/ale/sign.vim +++ b/plugin/ale/sign.vim @@ -26,17 +26,43 @@ endif " Global variables for signs let g:ale_sign_error = get(g:, 'ale_sign_error', '>>') let g:ale_sign_warning = get(g:, 'ale_sign_error', '--') +" An offset which can be set for sign IDs. +" This ID can be changed depending on what IDs are set for other plugins. +let g:ale_sign_offset = get(g:, 'ale_sign_offset', 1000000) +let g:ale_sign_dummy_id = get(g:, 'ale_sign_dummy_id', 10000000) " Signs show up on the left for error markers. execute 'sign define ALEErrorSign text=' . g:ale_sign_error - \ . ' texthl=ALEErrorSign' +\ . ' texthl=ALEErrorSign' execute 'sign define ALEWarningSign text=' . g:ale_sign_warning - \ . ' texthl=ALEWarningSign' +\ . ' texthl=ALEWarningSign' -" This function will set the signs which show up on the left. -function! ale#sign#SetSigns(buffer, loclist) - exec 'sign unplace * buffer=' . a:buffer +function! ale#sign#FindCurrentSigns(buffer) + " Matches output like : + " line=4 id=1 name=ALEErrorSign + let pattern = 'id=\(\d\+\) \+name=ALE\(Warning\|Error\)Sign' + + redir => output + silent exec 'sign place buffer=' . a:buffer + redir END + + let id_list = [] + + for line in split(output, "\n") + let match = matchlist(line, pattern) + + if len(match) > 0 + call add(id_list, match[1] + 0) + endif + endfor + + return id_list +endfunction +" Given a loclist, combine the loclist into a list of signs such that only +" one sign appears per line. Error lines will take precedence. +" The loclist will have been previously sorted. +function! ale#sign#CombineSigns(loclist) let signlist = [] for obj in a:loclist @@ -59,13 +85,31 @@ function! ale#sign#SetSigns(buffer, loclist) endif endfor + return signlist +endfunction + +" This function will set the signs which show up on the left. +function! ale#sign#SetSigns(buffer, loclist) + let signlist = ale#sign#CombineSigns(a:loclist) + + " Insert a dummy sign if one is missing. + " We will only insert the dummy sign at most once. call ale#sign#InsertDummy(len(signlist)) + " Find the current signs with the markers we use. + let current_id_list = ale#sign#FindCurrentSigns(a:buffer) + + " Remove those markers. + for current_id in current_id_list + exec 'sign unplace ' . current_id . ' buffer=' . a:buffer + endfor + + " Now set all of the signs. for i in range(0, len(signlist) - 1) let obj = signlist[i] let name = obj['type'] ==# 'W' ? 'ALEWarningSign' : 'ALEErrorSign' - let sign_line = 'sign place ' . (i + 1) + let sign_line = 'sign place ' . (i + g:ale_sign_offset) \. ' line=' . obj['lnum'] \. ' name=' . name \. ' buffer=' . a:buffer @@ -74,11 +118,14 @@ function! ale#sign#SetSigns(buffer, loclist) endfor endfunction -" Show signd gutter if there is no signs and g:ale_sign_column_alwas is set to 1 +" Show sign gutter if there are no signs and g:ale_sign_column_always is set to 1 function! ale#sign#InsertDummy(no_signs) if g:ale_sign_column_always == 1 && a:no_signs == 0 - sign define ale_keep_open_dummy - execute 'sign place 9999 line=1 name=ale_keep_open_dummy buffer=' . bufnr('') + sign define ALEDummySign + execute 'sign place ' + \ . g:ale_sign_dummy_id + \ . ' line=1 name=ALEDummySign buffer=' + \ . bufnr('') endif endfunction diff --git a/plugin/ale/zmain.vim b/plugin/ale/zmain.vim index 0bf6a1bb..d73bcbee 100644 --- a/plugin/ale/zmain.vim +++ b/plugin/ale/zmain.vim @@ -327,8 +327,6 @@ function! ALELint(delay) if a:delay > 0 let s:lint_timer = timer_start(a:delay, function('s:TimerHandler')) else - " Show empty gutter if g:ale_sign_column_always = 1 - call ale#sign#InsertDummy(0) call s:TimerHandler() endif endfunction |