summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--autoload/ale/job.vim32
-rw-r--r--doc/ale.txt27
-rw-r--r--test/test_prepare_command.vader9
3 files changed, 61 insertions, 7 deletions
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