Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for ale option to override default shell used by ale #2167

Merged
merged 6 commits into from
Jan 3, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 25 additions & 7 deletions autoload/ale/job.vim
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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.
Expand Down
27 changes: 27 additions & 0 deletions doc/ale.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1990,6 +1990,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*
Expand Down
9 changes: 9 additions & 0 deletions test/test_prepare_command.vader
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand Down Expand Up @@ -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
Expand All @@ -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