f49f615ef6
This PR first and formost implements support for dot-seperate filetypes, a very trivial change. This closes #132 But more importantly, this PR vastly improves the test quality for `ale#linter#Get`. It enables us to reset the state of ale's internal linter cache, to facilitate better testing, as well as making use of mocked linters instead of depending on linters on disk (which may change). In addition, a dummy linter is defined to test the autoloading behavior. Header guards were removed from all linters as: * A: ale won't try and load linters if they already exist in memory * B: we can't reset state for testing if they can't be loaded again
77 lines
2.3 KiB
VimL
77 lines
2.3 KiB
VimL
" Author: w0rp <devw0rp@gmail.com>
|
|
" Description: Lints sh files using bash -n
|
|
|
|
" This option can be changed to change the default shell when the shell
|
|
" cannot be taken from the hashbang line.
|
|
if !exists('g:ale_linters_sh_shell_default_shell')
|
|
let g:ale_linters_sh_shell_default_shell = fnamemodify($SHELL, ':t')
|
|
|
|
if g:ale_linters_sh_shell_default_shell ==# ''
|
|
let g:ale_linters_sh_shell_default_shell = 'bash'
|
|
endif
|
|
endif
|
|
|
|
function! ale_linters#sh#shell#GetExecutable(buffer)
|
|
let l:banglines = getbufline(a:buffer, 1)
|
|
|
|
" Take the shell executable from the hashbang, if we can.
|
|
if len(l:banglines) == 1 && l:banglines[0] =~# '^#!'
|
|
" Remove options like -e, etc.
|
|
let l:line = substitute(l:banglines[0], '--\?[a-zA-Z0-9]\+', '', 'g')
|
|
|
|
for l:possible_shell in ['bash', 'tcsh', 'csh', 'zsh', 'sh']
|
|
if l:line =~# l:possible_shell . '\s*$'
|
|
return l:possible_shell
|
|
endif
|
|
endfor
|
|
endif
|
|
|
|
return g:ale_linters_sh_shell_default_shell
|
|
endfunction
|
|
|
|
function! ale_linters#sh#shell#GetCommand(buffer)
|
|
return ale_linters#sh#shell#GetExecutable(a:buffer) . ' -n'
|
|
endfunction
|
|
|
|
function! ale_linters#sh#shell#Handle(buffer, lines)
|
|
" Matches patterns line the following:
|
|
"
|
|
" bash: line 13: syntax error near unexpected token `d'
|
|
" sh: 11: Syntax error: "(" unexpected
|
|
let l:pattern = '^[^:]\+: \%(\w\+ \|\)\(\d\+\): \(.\+\)'
|
|
let l:output = []
|
|
|
|
for l:line in a:lines
|
|
let l:match = matchlist(l:line, l:pattern)
|
|
|
|
if len(l:match) == 0
|
|
continue
|
|
endif
|
|
|
|
let l:line = l:match[1] + 0
|
|
let l:column = 1
|
|
let l:text = l:match[2]
|
|
let l:type = 'E'
|
|
|
|
" vcol is Needed to indicate that the column is a character.
|
|
call add(l:output, {
|
|
\ 'bufnr': a:buffer,
|
|
\ 'lnum': l:line,
|
|
\ 'vcol': 0,
|
|
\ 'col': l:column,
|
|
\ 'text': l:text,
|
|
\ 'type': l:type,
|
|
\ 'nr': -1,
|
|
\})
|
|
endfor
|
|
|
|
return l:output
|
|
endfunction
|
|
|
|
call ale#linter#Define('sh', {
|
|
\ 'name': 'shell',
|
|
\ 'output_stream': 'stderr',
|
|
\ 'executable_callback': 'ale_linters#sh#shell#GetExecutable',
|
|
\ 'command_callback': 'ale_linters#sh#shell#GetCommand',
|
|
\ 'callback': 'ale_linters#sh#shell#Handle',
|
|
\})
|