diff --git a/autoload/ale/job.vim b/autoload/ale/job.vim index 0117c7dd..1af95049 100644 --- a/autoload/ale/job.vim +++ b/autoload/ale/job.vim @@ -11,6 +11,12 @@ " A setting for wrapping commands. let g:ale_command_wrapper = get(g:, 'ale_command_wrapper', '') +" A setting for the shell used to execute commands +let g:ale_shell = get(g:, 'ale_shell', v:null) + +" A setting for the arguments we pass to the shell when executing commands +let g:ale_shell_arguments = get(g:, 'ale_shell_arguments', v:null) + if !has_key(s:, 'job_map') let s:job_map = {} endif @@ -184,15 +190,27 @@ function! ale#job#PrepareCommand(buffer, command) abort " NeoVim handles this issue automatically if the command is a String, " but we'll do this explicitly, so we use the same exact command for both " versions. - if has('win32') - return 'cmd /s/c "' . l:command . '"' - endif + if g:ale_shell is v:null + if has('win32') + return 'cmd /s/c "' . l:command . '"' + endif - if &shell =~? 'fish$\|pwsh$' - return ['/bin/sh', '-c', l:command] - endif + if &shell =~? 'fish$\|pwsh$' + return ['/bin/sh', '-c', l:command] + endif - return split(&shell) + split(&shellcmdflag) + [l:command] + return split(&shell) + split(&shellcmdflag) + [l:command] + else + if has('win32') + return g:ale_shell . l:command . '"' + endif + + let l:shell_arguments = g:ale_shell_arguments is v:null + \ ? &shellcmdflag + \ : g:ale_shell_arguments + + return split(g:ale_shell) + split(l:shell_arguments) + [l:command] + endif endfunction " Start a job with options which are agnostic to Vim and NeoVim. diff --git a/doc/ale.txt b/doc/ale.txt index 99aa8f01..56669be6 100644 --- a/doc/ale.txt +++ b/doc/ale.txt @@ -2000,6 +2000,33 @@ g:ale_windows_node_executable_path *g:ale_windows_node_executable_path* scripts are executed with whatever executable is configured with this setting. +g:ale_shell *g:ale_shell* + + Type: |String| + Default: not set + + This variable is used to determine which shell ale will use to execute + commands. By default this variable is undefined, meaning that ALE will use + it's default behavior. Which is to run shells via the shell determined by + the `&shell` vim variable, with the arguments `&shellcmdflag`. Ale will fall + back to using `/bin/sh`if it detects the underlying `&shell`is either `fish` + or `pwsh`. However, if you set this variable ALE will no longer fall back to + other shells, meaning if you wanted to use `fish` you could do so via this + option. For example if `$SHELL == '/bin/bash'`, but you want to use zsh, + set `g:ale_shell = '/bin/zsh'. + + Please note - if you are using this option you should consider additionally + setting `g:ale``g:ale_shell_arguments` since the default values for that + option might be incompatable with the newly set shell. + +g:ale_shell_arguments *g:ale_shell_arguments* + + Type: |String| + Default: not set + + This variable is used to determine what commands vim will pass to the shell + to execute it's commands. If this command is not set, but g:ale_shell is + set, ale will use `&shellcmdflag` as command arguments. ------------------------------------------------------------------------------- 6.1. Highlights *ale-highlights* diff --git a/test/test_prepare_command.vader b/test/test_prepare_command.vader index 75e4c0c6..f90c881b 100644 --- a/test/test_prepare_command.vader +++ b/test/test_prepare_command.vader @@ -4,6 +4,7 @@ Before: After: Restore + let g:ale_shell = v:null Execute(sh should be used when the shell is fish): if !has('win32') @@ -43,6 +44,7 @@ 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 @@ -54,3 +56,10 @@ Execute(cmd /s/c as a string should be used on Windows): AssertEqual 'cmd /s/c "foobar"', ale#job#PrepareCommand(bufnr(''), 'foobar') endif + +Execute(Setting ale_shell should cause ale#job#PrepareCommand to use set shell): + if !has('win32') + let g:ale_shell = '/foo/bar' + + AssertEqual ['/foo/bar', '-c', 'foobar'], ale#job#PrepareCommand(bufnr(''), "foobar") + endif