summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEddie Lebow <elebow@users.noreply.github.com>2019-11-23 00:06:03 -0500
committerEddie Lebow <elebow@users.noreply.github.com>2019-11-23 00:34:40 -0500
commit1997a8f7e22a930e3d47b61a7f9ab948d04f2b92 (patch)
tree5d9e976f8bb58f47793da920f0d7f6c36aab9eae
parentb91d82bfaa395bb86b3ea51f63cc8cef05e90f98 (diff)
downloadale-1997a8f7e22a930e3d47b61a7f9ab948d04f2b92.zip
ShellDetect: fall back to filetype if no hashbang
Some files lack a hashbang line but still have an unambiguous filetype. For example, the file `.zshrc` has the filetype `zsh`. Augment ale#handlers#sh#GetShellType to fall back to the filetype if no hashbang line can be found.
-rw-r--r--autoload/ale/handlers/sh.vim17
-rw-r--r--test/test_shell_detection.vader10
2 files changed, 22 insertions, 5 deletions
diff --git a/autoload/ale/handlers/sh.vim b/autoload/ale/handlers/sh.vim
index 75eaf71f..1e50cb89 100644
--- a/autoload/ale/handlers/sh.vim
+++ b/autoload/ale/handlers/sh.vim
@@ -4,17 +4,24 @@
function! ale#handlers#sh#GetShellType(buffer) abort
let l:bang_line = get(getbufline(a:buffer, 1), 0, '')
+ let l:command = ''
+
" Take the shell executable from the hashbang, if we can.
if l:bang_line[:1] is# '#!'
" Remove options like -e, etc.
let l:command = substitute(l:bang_line, ' --\?[a-zA-Z0-9]\+', '', 'g')
+ endif
- for l:possible_shell in ['bash', 'dash', 'ash', 'tcsh', 'csh', 'zsh', 'ksh', 'sh']
- if l:command =~# l:possible_shell . '\s*$'
- return l:possible_shell
- endif
- endfor
+ " If we couldn't find a hashbang, try the filetype
+ if l:command is# ''
+ let l:command = &filetype
endif
+ for l:possible_shell in ['bash', 'dash', 'ash', 'tcsh', 'csh', 'zsh', 'ksh', 'sh']
+ if l:command =~# l:possible_shell . '\s*$'
+ return l:possible_shell
+ endif
+ endfor
+
return ''
endfunction
diff --git a/test/test_shell_detection.vader b/test/test_shell_detection.vader
index 88ee462d..b0b38aad 100644
--- a/test/test_shell_detection.vader
+++ b/test/test_shell_detection.vader
@@ -98,6 +98,16 @@ Execute(The ksh dialect should be used for shellcheck if b:is_kornshell is 1):
AssertEqual 'ksh', ale_linters#sh#shellcheck#GetDialectArgument(bufnr(''))
+Execute(The filetype should be used as the default shell type when there is no hashbang line):
+ set filetype=zsh
+ AssertEqual 'zsh', ale#handlers#sh#GetShellType(bufnr(''))
+
+ set filetype=tcsh
+ AssertEqual 'tcsh', ale#handlers#sh#GetShellType(bufnr(''))
+
+ set filetype=python
+ AssertEqual '', ale#handlers#sh#GetShellType(bufnr(''))
+
Given(A file with /bin/ash):
#!/bin/ash