Before: Save &shell Save &shellcmdflag Save g:ale_shell Save g:ale_shell_arguments Save b:ale_shell Save b:ale_shell_arguments unlet! b:ale_shell unlet! b:ale_shell_arguments unlet! g:ale_shell unlet! g:ale_shell_arguments After: Restore Execute(sh should be used when the shell is fish): if !has('win32') " Set something else, so we will replace that too. let &shellcmdflag = '-f' let &shell = 'fish' AssertEqual ['/bin/sh', '-c', 'foobar'], ale#job#PrepareCommand(bufnr(''), 'foobar') let &shell = '/usr/bin/fish' AssertEqual ['/bin/sh', '-c', 'foobar'], ale#job#PrepareCommand(bufnr(''), 'foobar') let &shell = '/usr/local/bin/fish' AssertEqual ['/bin/sh', '-c', 'foobar'], ale#job#PrepareCommand(bufnr(''), 'foobar') endif Execute(sh should be used when the shell is powershell): if !has('win32') " Set something else, so we will replace that too. let &shellcmdflag = '-f' let &shell = 'pwsh' AssertEqual ['/bin/sh', '-c', 'foobar'], ale#job#PrepareCommand(bufnr(''), 'foobar') let &shell = '/usr/bin/pwsh' AssertEqual ['/bin/sh', '-c', 'foobar'], ale#job#PrepareCommand(bufnr(''), 'foobar') let &shell = '/usr/local/bin/pwsh' AssertEqual ['/bin/sh', '-c', 'foobar'], ale#job#PrepareCommand(bufnr(''), 'foobar') endif Execute(Other shells should be used when set): if !has('win32') let &shell = '/bin/bash' let &shellcmdflag = '-c' let g:ale_shell = &shell AssertEqual ['/bin/bash', '-c', 'foobar'], ale#job#PrepareCommand(bufnr(''), 'foobar') endif Execute(cmd /s/c as a string should be used on Windows): if has('win32') let &shell = 'who cares' let &shellcmdflag = 'whatever' AssertEqual 'cmd /s/c "foobar"', ale#job#PrepareCommand(bufnr(''), 'foobar') endif Execute(Setting g:ale_shell should cause ale#job#PrepareCommand to use set shell): let g:ale_shell = '/foo/bar' if has('win32') AssertEqual ['/foo/bar', '/c', 'foobar'], ale#job#PrepareCommand(bufnr(''), "foobar") else AssertEqual ['/foo/bar', '-c', 'foobar'], ale#job#PrepareCommand(bufnr(''), "foobar") endif let g:ale_shell_arguments = '-x' AssertEqual ['/foo/bar', '-x', 'foobar'], ale#job#PrepareCommand(bufnr(''), "foobar") Execute(Setting b:ale_shell should cause ale#job#PrepareCommand to use set shell): let g:ale_shell = '/wrong/foo/bar' let b:ale_shell = '/foo/bar' if has('win32') AssertEqual ['/foo/bar', '/c', 'foobar'], ale#job#PrepareCommand(bufnr(''), "foobar") else AssertEqual ['/foo/bar', '-c', 'foobar'], ale#job#PrepareCommand(bufnr(''), "foobar") endif let g:ale_shell_arguments = '--verbose -x' let b:ale_shell_arguments = '-x' AssertEqual ['/foo/bar', '-x', 'foobar'], ale#job#PrepareCommand(bufnr(''), "foobar")