diff options
-rw-r--r-- | autoload/ale/fix.vim | 32 | ||||
-rw-r--r-- | doc/ale.txt | 8 | ||||
-rw-r--r-- | test/fix/test_ale_fix.vader | 19 |
3 files changed, 50 insertions, 9 deletions
diff --git a/autoload/ale/fix.vim b/autoload/ale/fix.vim index 51df1458..1e056200 100644 --- a/autoload/ale/fix.vim +++ b/autoload/ale/fix.vim @@ -356,9 +356,21 @@ function! s:RunFixer(options) abort call ale#fix#ApplyFixes(l:buffer, l:input) endfunction -function! s:GetCallbacks(buffer, linters) abort - if len(a:linters) - let l:callback_list = a:linters +function! s:AddSubCallbacks(full_list, callbacks) abort + if type(a:callbacks) == type('') + call add(a:full_list, a:callbacks) + elseif type(a:callbacks) == type([]) + call extend(a:full_list, a:callbacks) + else + return 0 + endif + + return 1 +endfunction + +function! s:GetCallbacks(buffer, fixers) abort + if len(a:fixers) + let l:callback_list = a:fixers elseif type(get(b:, 'ale_fixers')) is type([]) " Lists can be used for buffer-local variables only let l:callback_list = b:ale_fixers @@ -367,16 +379,18 @@ function! s:GetCallbacks(buffer, linters) abort " callbacks to run. let l:fixers = ale#Var(a:buffer, 'fixers') let l:callback_list = [] + let l:matched = 0 for l:sub_type in split(&filetype, '\.') - let l:sub_type_callacks = get(l:fixers, l:sub_type, []) - - if type(l:sub_type_callacks) == type('') - call add(l:callback_list, l:sub_type_callacks) - else - call extend(l:callback_list, l:sub_type_callacks) + if s:AddSubCallbacks(l:callback_list, get(l:fixers, l:sub_type)) + let l:matched = 1 endif endfor + + " If we couldn't find fixers for a filetype, default to '*' fixers. + if !l:matched + call s:AddSubCallbacks(l:callback_list, get(l:fixers, '*')) + endif endif if empty(l:callback_list) diff --git a/doc/ale.txt b/doc/ale.txt index 5891debd..84989045 100644 --- a/doc/ale.txt +++ b/doc/ale.txt @@ -938,6 +938,14 @@ g:ale_fixers *g:ale_fixers* `b:ale_fixers` can be set to a |List| of callbacks instead, which can be more convenient. + A special `'*'` key be used as a wildcard filetype for configuring fixers + for every other type of file. For example: > + + " Fix Python files with 'bar'. + " Don't fix 'html' files. + " Fix everything else with 'foo'. + let g:ale_fixers = {'python': ['bar'], 'html': [], '*': ['foo']} +< g:ale_fix_on_save *g:ale_fix_on_save* b:ale_fix_on_save *b:ale_fix_on_save* diff --git a/test/fix/test_ale_fix.vader b/test/fix/test_ale_fix.vader index 3bd23672..417394c3 100644 --- a/test/fix/test_ale_fix.vader +++ b/test/fix/test_ale_fix.vader @@ -257,6 +257,25 @@ Expect(Only the second function should be applied): $b $c +Execute(The * fixers shouldn't be used if an empty list is set for fixers): + let g:ale_fixers.testft = [] + let g:ale_fixers['*'] = ['AddDollars'] + ALEFix + +Expect(Nothing should be changed): + a + b + c + +Execute(* fixers should be used if no filetype is matched): + let g:ale_fixers = {'*': ['AddDollars']} + ALEFix + +Expect(The file should be changed): + $a + $b + $c + Execute(ALEFix should allow commands to be run): if has('win32') " Just skip this test on Windows, we can't run it. |