Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

569 support vim sign group and priority #2786

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 59 additions & 10 deletions autoload/ale/sign.vim
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ let g:ale_sign_style_error = get(g:, 'ale_sign_style_error', g:ale_sign_error)
let g:ale_sign_warning = get(g:, 'ale_sign_warning', '--')
let g:ale_sign_style_warning = get(g:, 'ale_sign_style_warning', g:ale_sign_warning)
let g:ale_sign_info = get(g:, 'ale_sign_info', g:ale_sign_warning)
let g:ale_sign_priority = get(g:, 'ale_sign_priority', 30)
" This variable sets an offset which can be set for sign IDs.
" This ID can be changed depending on what IDs are set for other plugins.
" The dummy sign will use the ID exactly equal to the offset.
Expand Down Expand Up @@ -147,24 +148,57 @@ function! ale#sign#GetSignName(sublist) abort
return 'ALEErrorSign'
endfunction

function! s:PriorityCmd() abort
if has('nvim-0.4.0') || (v:version >= 801 && has('patch614'))
return ' priority=' . g:ale_sign_priority . ' '
else
return ''
endif
endfunction

function! s:GroupCmd() abort
if has('nvim-0.4.0') || (v:version >= 801 && has('patch614'))
return ' group=ale '
else
return ' '
endif
endfunction

" Read sign data for a buffer to a list of lines.
function! ale#sign#ReadSigns(buffer) abort
redir => l:output
silent execute 'sign place buffer=' . a:buffer
silent execute 'sign place ' . s:GroupCmd() . s:PriorityCmd()
\ . ' buffer=' . a:buffer
redir end

return split(l:output, "\n")
endfunction

function! ale#sign#ParsePattern() abort
if has('nvim-0.4.0') || (v:version >= 801 && has('patch614'))
" Matches output like :
" line=4 id=1 group=ale name=ALEErrorSign
" строка=1 id=1000001 group=ale имя=ALEErrorSign
" 行=1 識別子=1000001 group=ale 名前=ALEWarningSign
" línea=12 id=1000001 group=ale nombre=ALEWarningSign
" riga=1 id=1000001 group=ale nome=ALEWarningSign
let l:pattern = '\v^.*\=(\d+).*\=(\d+).*group\=ale.*\=(ALE[a-zA-Z]+Sign)'
else
" Matches output like :
" line=4 id=1 name=ALEErrorSign
" строка=1 id=1000001 имя=ALEErrorSign
" 行=1 識別子=1000001 名前=ALEWarningSign
" línea=12 id=1000001 nombre=ALEWarningSign
" riga=1 id=1000001 nome=ALEWarningSign
let l:pattern = '\v^.*\=(\d+).*\=(\d+).*\=(ALE[a-zA-Z]+Sign)'
endif

return l:pattern
endfunction

" Given a list of lines for sign output, return a List of [line, id, group]
function! ale#sign#ParseSigns(line_list) abort
" Matches output like :
" line=4 id=1 name=ALEErrorSign
" строка=1 id=1000001 имя=ALEErrorSign
" 行=1 識別子=1000001 名前=ALEWarningSign
" línea=12 id=1000001 nombre=ALEWarningSign
" riga=1 id=1000001, nome=ALEWarningSign
let l:pattern = '\v^.*\=(\d+).*\=(\d+).*\=(ALE[a-zA-Z]+Sign)'
let l:pattern =ale#sign#ParsePattern()
let l:result = []
let l:is_dummy_sign_set = 0

Expand Down Expand Up @@ -319,8 +353,10 @@ function! ale#sign#GetSignCommands(buffer, was_sign_set, sign_map) abort
if !l:is_dummy_sign_set && (!empty(a:sign_map) || g:ale_sign_column_always)
call add(l:command_list, 'sign place '
\ . g:ale_sign_offset
\ . ' line=1 name=ALEDummySign buffer='
\ . a:buffer
\ . s:GroupCmd()
\ . s:PriorityCmd()
\ . ' line=1 name=ALEDummySign '
\ . ' buffer=' . a:buffer
\)
let l:is_dummy_sign_set = 1
endif
Expand All @@ -337,6 +373,8 @@ function! ale#sign#GetSignCommands(buffer, was_sign_set, sign_map) abort
if index(l:info.current_id_list, l:info.new_id) < 0
call add(l:command_list, 'sign place '
\ . (l:info.new_id)
\ . s:GroupCmd()
\ . s:PriorityCmd()
\ . ' line=' . l:line_str
\ . ' name=' . (l:info.new_name)
\ . ' buffer=' . a:buffer
Expand All @@ -351,6 +389,7 @@ function! ale#sign#GetSignCommands(buffer, was_sign_set, sign_map) abort
if l:current_id isnot l:info.new_id
call add(l:command_list, 'sign unplace '
\ . l:current_id
\ . s:GroupCmd()
\ . ' buffer=' . a:buffer
\)
endif
Expand All @@ -361,6 +400,7 @@ function! ale#sign#GetSignCommands(buffer, was_sign_set, sign_map) abort
if l:is_dummy_sign_set && !g:ale_sign_column_always
call add(l:command_list, 'sign unplace '
\ . g:ale_sign_offset
\ . s:GroupCmd()
hsanson marked this conversation as resolved.
Show resolved Hide resolved
\ . ' buffer=' . a:buffer
\)
endif
Expand Down Expand Up @@ -415,3 +455,12 @@ function! ale#sign#SetSigns(buffer, loclist) abort
highlight link SignColumn ALESignColumnWithoutErrors
endif
endfunction

" Remove all signs.
function! ale#sign#Clear() abort
if has('nvim-0.4.0') || (v:version >= 801 && has('patch614'))
sign unplace group=ale *
else
sign unplace *
endif
endfunction
10 changes: 10 additions & 0 deletions doc/ale.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1543,6 +1543,16 @@ g:ale_set_signs *g:ale_set_signs*
To limit the number of signs ALE will set, see |g:ale_max_signs|.


g:ale_sign_priority *g:ale_sign_priority*

Type: |Number|
Default: `30`

From Neovim 0.4.0 and Vim 8.1, ALE can set sign priority to all signs. The
larger this value is, the higher priority ALE signs have over other plugin
signs. See |sign-priority| for further details on how priority works.


g:ale_shell *g:ale_shell*

Type: |String|
Expand Down
14 changes: 9 additions & 5 deletions test/sign/test_linting_sets_signs.vader
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ Before:
let g:ale_set_highlights = 0
let g:ale_echo_cursor = 0

sign unplace *
call ale#sign#Clear()

function! TestCallback(buffer, output)
return [
Expand All @@ -32,16 +32,20 @@ Before:

function! CollectSigns()
redir => l:output
silent exec 'sign place'
if has('nvim-0.4.0') || (v:version >= 801 && has('patch614'))
silent exec 'sign place group=ale'
else
silent exec 'sign place'
endif
redir END

let l:actual_sign_list = []

for l:line in split(l:output, "\n")
let l:match = matchlist(l:line, '\v^.*\=(\d+).*\=\d+.*\=(ALE[a-zA-Z]+Sign)')
let l:match = matchlist(l:line, ale#sign#ParsePattern())

if len(l:match) > 0
call add(l:actual_sign_list, [l:match[1], l:match[2]])
call add(l:actual_sign_list, [l:match[1], l:match[3]])
endif
endfor

Expand All @@ -60,7 +64,7 @@ After:
delfunction CollectSigns

unlet! g:ale_run_synchronously_callbacks
sign unplace *
call ale#sign#Clear()
call ale#linter#Reset()

Execute(The signs should be updated after linting is done):
Expand Down
2 changes: 1 addition & 1 deletion test/sign/test_sign_column_highlighting.vader
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ After:
delfunction SetHighlight
unlet! g:sign_highlight

sign unplace *
call ale#sign#Clear()

Execute(The SignColumn highlight shouldn't be changed if the option is off):
let g:ale_change_sign_column_color = 0
Expand Down
2 changes: 1 addition & 1 deletion test/sign/test_sign_limits.vader
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ After:

delfunction SetNProblems

sign unplace *
call ale#sign#Clear()

Execute(There should be no limit on signs with negative numbers):
AssertEqual range(1, 42), SetNProblems(42)
Expand Down
92 changes: 67 additions & 25 deletions test/sign/test_sign_parsing.vader
Original file line number Diff line number Diff line change
@@ -1,35 +1,77 @@
Execute (Parsing English signs should work):
AssertEqual
\ [0, [[9, 1000001, 'ALEWarningSign']]],
\ ale#sign#ParseSigns([
\ 'Signs for app.js:',
\ ' line=9 id=1000001 name=ALEWarningSign',
\ ])
if has('nvim-0.4.0') || (v:version >= 801 && has('patch614'))
AssertEqual
\ [0, [[9, 1000001, 'ALEWarningSign']]],
\ ale#sign#ParseSigns([
\ 'Signs for app.js:',
\ ' line=9 id=1000001 group=ale name=ALEWarningSign',
\ ])
else
AssertEqual
\ [0, [[9, 1000001, 'ALEWarningSign']]],
\ ale#sign#ParseSigns([
\ 'Signs for app.js:',
\ ' line=9 id=1000001 name=ALEWarningSign',
\ ])
endif

Execute (Parsing Russian signs should work):
AssertEqual
\ [0, [[1, 1000001, 'ALEErrorSign']]],
\ ale#sign#ParseSigns([' строка=1 id=1000001 имя=ALEErrorSign'])
if has('nvim-0.4.0') || (v:version >= 801 && has('patch614'))
AssertEqual
\ [0, [[1, 1000001, 'ALEErrorSign']]],
\ ale#sign#ParseSigns([' строка=1 id=1000001 group=ale имя=ALEErrorSign'])
else
AssertEqual
\ [0, [[1, 1000001, 'ALEErrorSign']]],
\ ale#sign#ParseSigns([' строка=1 id=1000001 имя=ALEErrorSign'])
endif

Execute (Parsing Japanese signs should work):
AssertEqual
\ [0, [[1, 1000001, 'ALEWarningSign']]],
\ ale#sign#ParseSigns([' 行=1 識別子=1000001 名前=ALEWarningSign'])
if has('nvim-0.4.0') || (v:version >= 801 && has('patch614'))
AssertEqual
\ [0, [[1, 1000001, 'ALEWarningSign']]],
\ ale#sign#ParseSigns([' 行=1 識別子=1000001 group=ale 名前=ALEWarningSign'])
else
AssertEqual
\ [0, [[1, 1000001, 'ALEWarningSign']]],
\ ale#sign#ParseSigns([' 行=1 識別子=1000001 名前=ALEWarningSign'])
endif

Execute (Parsing Spanish signs should work):
AssertEqual
\ [0, [[12, 1000001, 'ALEWarningSign']]],
\ ale#sign#ParseSigns([' línea=12 id=1000001 nombre=ALEWarningSign'])
if has('nvim-0.4.0') || (v:version >= 801 && has('patch614'))
AssertEqual
\ [0, [[12, 1000001, 'ALEWarningSign']]],
\ ale#sign#ParseSigns([' línea=12 id=1000001 group=ale nombre=ALEWarningSign'])
else
AssertEqual
\ [0, [[12, 1000001, 'ALEWarningSign']]],
\ ale#sign#ParseSigns([' línea=12 id=1000001 nombre=ALEWarningSign'])
endif

Execute (Parsing Italian signs should work):
AssertEqual
\ [0, [[1, 1000001, 'ALEWarningSign']]],
\ ale#sign#ParseSigns([' riga=1 id=1000001, nome=ALEWarningSign'])
\
if has('nvim-0.4.0') || (v:version >= 801 && has('patch614'))
AssertEqual
\ [0, [[1, 1000001, 'ALEWarningSign']]],
\ ale#sign#ParseSigns([' riga=1 id=1000001, group=ale nome=ALEWarningSign'])
else
AssertEqual
\ [0, [[1, 1000001, 'ALEWarningSign']]],
\ ale#sign#ParseSigns([' riga=1 id=1000001, nome=ALEWarningSign'])
endif

Execute (The sign parser should indicate if the dummy sign is set):
AssertEqual
\ [1, [[1, 1000001, 'ALEErrorSign']]],
\ ale#sign#ParseSigns([
\ ' строка=1 id=1000001 имя=ALEErrorSign',
\ ' line=1 id=1000000 name=ALEDummySign',
\ ])
if has('nvim-0.4.0') || (v:version >= 801 && has('patch614'))
AssertEqual
\ [1, [[1, 1000001, 'ALEErrorSign']]],
\ ale#sign#ParseSigns([
\ ' строка=1 id=1000001 group=ale имя=ALEErrorSign',
\ ' line=1 id=1000000 group=ale name=ALEDummySign',
\ ])
else
AssertEqual
\ [1, [[1, 1000001, 'ALEErrorSign']]],
\ ale#sign#ParseSigns([
\ ' строка=1 id=1000001 имя=ALEErrorSign',
\ ' line=1 id=1000000 name=ALEDummySign',
\ ])
endif
39 changes: 28 additions & 11 deletions test/sign/test_sign_placement.vader
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ Before:
let g:ale_echo_cursor = 0

call ale#linter#Reset()
sign unplace *
call ale#sign#Clear()

function! GenerateResults(buffer, output)
return [
Expand Down Expand Up @@ -68,12 +68,16 @@ Before:

function! ParseSigns()
redir => l:output
silent sign place
if has('nvim-0.4.0') || (v:version >= 801 && has('patch614'))
silent sign place group=ale
else
silent sign place
endif
redir END

return map(
\ split(l:output, '\n')[2:],
\ 'matchlist(v:val, ''^.*=\(\d\+\).*=\(\d\+\).*=\(.*\)$'')[1:3]',
\ 'matchlist(v:val, ''' . ale#sign#ParsePattern() . ''')[1:3]',
\)
endfunction

Expand All @@ -92,7 +96,7 @@ After:
delfunction GenerateResults
delfunction ParseSigns
call ale#linter#Reset()
sign unplace *
call ale#sign#Clear()

Execute(ale#sign#GetSignName should return the right sign names):
AssertEqual 'ALEErrorSign', ale#sign#GetSignName([{'type': 'E'}])
Expand Down Expand Up @@ -148,9 +152,15 @@ Execute(The current signs should be set for running a job):
\ ParseSigns()

Execute(Loclist items with sign_id values should be kept):
exec 'sign place 1000347 line=3 name=ALEErrorSign buffer=' . bufnr('')
exec 'sign place 1000348 line=15 name=ALEErrorSign buffer=' . bufnr('')
exec 'sign place 1000349 line=16 name=ALEWarningSign buffer=' . bufnr('')
if has('nvim-0.4.0') || (v:version >= 801 && has('patch614'))
exec 'sign place 1000347 group=ale line=3 name=ALEErrorSign buffer=' . bufnr('')
exec 'sign place 1000348 group=ale line=15 name=ALEErrorSign buffer=' . bufnr('')
exec 'sign place 1000349 group=ale line=16 name=ALEWarningSign buffer=' . bufnr('')
else
exec 'sign place 1000347 line=3 name=ALEErrorSign buffer=' . bufnr('')
exec 'sign place 1000348 line=15 name=ALEErrorSign buffer=' . bufnr('')
exec 'sign place 1000349 line=16 name=ALEWarningSign buffer=' . bufnr('')
endif

let g:loclist = [
\ {'bufnr': bufnr(''), 'lnum': 1, 'col': 1, 'type': 'E', 'text': 'a', 'sign_id': 1000348},
Expand Down Expand Up @@ -287,10 +297,17 @@ Execute(No exceptions should be thrown when setting signs for invalid buffers):
Execute(Signs should be removed when lines have multiple sign IDs on them):
" We can fail to remove signs if there are multiple signs on one line,
" say after deleting lines in Vim, etc.
exec 'sign place 1000347 line=3 name=ALEErrorSign buffer=' . bufnr('')
exec 'sign place 1000348 line=3 name=ALEWarningSign buffer=' . bufnr('')
exec 'sign place 1000349 line=10 name=ALEErrorSign buffer=' . bufnr('')
exec 'sign place 1000350 line=10 name=ALEWarningSign buffer=' . bufnr('')
if has('nvim-0.4.0') || (v:version >= 801 && has('patch614'))
exec 'sign place 1000347 group=ale line=3 name=ALEErrorSign buffer=' . bufnr('')
exec 'sign place 1000348 group=ale line=3 name=ALEWarningSign buffer=' . bufnr('')
exec 'sign place 1000349 group=ale line=10 name=ALEErrorSign buffer=' . bufnr('')
exec 'sign place 1000350 group=ale line=10 name=ALEWarningSign buffer=' . bufnr('')
else
exec 'sign place 1000347 line=3 name=ALEErrorSign buffer=' . bufnr('')
exec 'sign place 1000348 line=3 name=ALEWarningSign buffer=' . bufnr('')
exec 'sign place 1000349 line=10 name=ALEErrorSign buffer=' . bufnr('')
exec 'sign place 1000350 line=10 name=ALEWarningSign buffer=' . bufnr('')
endif

call ale#sign#SetSigns(bufnr(''), [])
AssertEqual [], ParseSigns()
Loading