Add support for multiple filetypes in filetype aliasing

This commit is contained in:
valtermro 2017-04-11 17:10:08 -03:00
parent 8b890caa31
commit 475dd2e76a
3 changed files with 41 additions and 16 deletions

View File

@ -174,26 +174,25 @@ function! ale#linter#Define(filetype, linter) abort
call add(s:linters[a:filetype], l:new_linter)
endfunction
function! ale#linter#GetAll(filetype) abort
if a:filetype ==# ''
" Empty filetype? Nothing to be done about that.
return []
endif
function! ale#linter#GetAll(filetypes) abort
let l:combined_linters = []
if has_key(s:linters, a:filetype)
" We already loaded the linter files for this filetype, so stop here.
return s:linters[a:filetype]
endif
for l:filetype in a:filetypes
" Haven't we loaded the linter files for this filetype yet?
if !has_key(s:linters, l:filetype)
" So load it
execute 'silent! runtime! ale_linters/' . l:filetype . '/*.vim'
" Load all linters for a given filetype.
execute 'silent! runtime! ale_linters/' . a:filetype . '/*.vim'
" Still don't have the linter files? There must be occured an error
if !has_key(s:linters, l:filetype)
let s:linters[l:filetype] = []
endif
endif
if !has_key(s:linters, a:filetype)
" If we couldn't load any linters, let everyone know.
let s:linters[a:filetype] = []
endif
call extend(l:combined_linters, get(s:linters, l:filetype, []))
endfor
return s:linters[a:filetype]
return l:combined_linters
endfunction
function! ale#linter#ResolveFiletype(original_filetype) abort
@ -209,6 +208,10 @@ function! ale#linter#ResolveFiletype(original_filetype) abort
\ )
\)
if type(l:filetype) != type([])
return [l:filetype]
endif
return l:filetype
endfunction

View File

@ -380,6 +380,14 @@ g:ale_linter_aliases *g:ale_linter_aliases*
not the aliased type (`'php'`). This allows an aliased type to run a
different set of linters from the type it is being mapped to.
Passing a list of filetypes is also supported. Say you want to lint
javascript and css embedded in HTML (using linters that support that).
You could alias `html` like so:
`let g:ale_linter_aliases = {'html': ['html', 'javascript', 'css']}`
Note that `html` itself was included as an alias. That is because aliases
will override the original linters for the aliased filetepe.
g:ale_linters *g:ale_linters*

View File

@ -39,5 +39,19 @@ Execute (Define multiple linters for different filetypes):
Then (Linters for dot-seperated filetypes should be properly handled):
AssertEqual [g:testlinter1, g:testlinter2], ale#linter#Get('testft1.testft2')
Execute (Define multiple aliases for a filetype):
call ale#linter#Define('testft1', g:testlinter1)
call ale#linter#Define('testft2', g:testlinter2)
let ale_linter_aliases = {'testft3': ['testft1', 'testft2']}
Then (Linters should be transparently aliased):
AssertEqual [g:testlinter1, g:testlinter2], ale#linter#Get('testft3')
Execute (Alias a filetype to itself plus another one):
call ale#linter#Define('testft1', g:testlinter1)
call ale#linter#Define('testft2', g:testlinter2)
let ale_linter_aliases = {'testft1': ['testft1', 'testft2']}
Then (The original linters should still be there):
AssertEqual [g:testlinter1, g:testlinter2], ale#linter#Get('testft1')
Execute (Try to load a linter from disk):
AssertEqual [{'name': 'testlinter', 'output_stream': 'stdout', 'executable': 'testlinter', 'command': 'testlinter', 'callback': 'testCB', 'read_buffer': 1, 'lint_file': 0}], ale#linter#Get('testft')