From 532686102ef3bdf00b00340964d2dfe4bb7f875e Mon Sep 17 00:00:00 2001 From: rhysd Date: Tue, 18 Sep 2018 15:41:33 +0900 Subject: [PATCH] shfmt: Use Vim's indent config as default indent width --- autoload/ale/fixers/shfmt.vim | 17 +++++++++- test/fixers/test_shfmt_fixer_callback.vader | 37 ++++++++++++++++++++- 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/autoload/ale/fixers/shfmt.vim b/autoload/ale/fixers/shfmt.vim index fc55f425..06e8da57 100644 --- a/autoload/ale/fixers/shfmt.vim +++ b/autoload/ale/fixers/shfmt.vim @@ -5,12 +5,27 @@ scriptencoding utf-8 call ale#Set('sh_shfmt_executable', 'shfmt') call ale#Set('sh_shfmt_options', '') +function! s:DefaultOption(buffer) abort + if getbufvar(a:buffer, '&expandtab') == 0 + " Tab is used by default + return '' + endif + + let l:tabsize = getbufvar(a:buffer, '&shiftwidth') + + if l:tabsize == 0 + let l:tabsize = getbufvar(a:buffer, '&tabstop') + endif + + return ' -i ' . l:tabsize +endfunction + function! ale#fixers#shfmt#Fix(buffer) abort let l:executable = ale#Var(a:buffer, 'sh_shfmt_executable') let l:options = ale#Var(a:buffer, 'sh_shfmt_options') return { \ 'command': ale#Escape(l:executable) - \ . (empty(l:options) ? '' : ' ' . l:options) + \ . (empty(l:options) ? s:DefaultOption(a:buffer) : ' ' . l:options) \} endfunction diff --git a/test/fixers/test_shfmt_fixer_callback.vader b/test/fixers/test_shfmt_fixer_callback.vader index 5dc6e863..99cb0987 100644 --- a/test/fixers/test_shfmt_fixer_callback.vader +++ b/test/fixers/test_shfmt_fixer_callback.vader @@ -1,17 +1,52 @@ Before: Save g:ale_sh_shfmt_executable Save g:ale_sh_shfmt_options + Save &l:expandtab + Save &l:shiftwidth + Save &l:tabstop After: Restore -Execute(The shfmt callback should return the correct default values): +Execute(The shfmt callback should return 'shfmt' as default command): + setlocal noexpandtab + Assert + \ ale#fixers#shfmt#Fix(bufnr('')).command =~# '^' . ale#Escape('shfmt'), + \ "Default command name is expected to be 'shfmt'" + +Execute(The shfmt callback should return the command with no option as default when noexpandtab is set): + let g:ale_sh_shfmt_executable = 'shfmt' + let g:ale_sh_shfmt_options = '' + setlocal noexpandtab AssertEqual \ { \ 'command': ale#Escape('shfmt'), \ }, \ ale#fixers#shfmt#Fix(bufnr('')) +Execute(The shfmt callback should return the command specifying indent width by looking shiftwidth as default): + let g:ale_sh_shfmt_executable = 'shfmt' + let g:ale_sh_shfmt_options = '' + setlocal expandtab + setlocal shiftwidth=4 + AssertEqual + \ { + \ 'command': ale#Escape('shfmt') . ' -i 4', + \ }, + \ ale#fixers#shfmt#Fix(bufnr('')) + +Execute(The shfmt callback should return the command specifying indent width by looking tabstop when shiftwidth is 0 as default): + let g:ale_sh_shfmt_executable = 'shfmt' + let g:ale_sh_shfmt_options = '' + setlocal expandtab + setlocal shiftwidth=0 + setlocal tabstop=8 + AssertEqual + \ { + \ 'command': ale#Escape('shfmt') . ' -i 8', + \ }, + \ ale#fixers#shfmt#Fix(bufnr('')) + Execute(The shfmt executable and options should be configurable): let g:ale_sh_shfmt_executable = 'foobar' let g:ale_sh_shfmt_options = '--some-option'