Add support for shellcheck linting.

This commit is contained in:
w0rp 2016-10-03 13:18:27 +01:00
parent 23383ce547
commit c89c4fcef9
4 changed files with 74 additions and 31 deletions

View File

@ -29,7 +29,7 @@ name. That seems to be the fairest way to arrange this table.
| Language | Tools |
| -------- | ----- |
| Bash | [-n flag](https://www.gnu.org/software/bash/manual/bash.html#index-set) |
| Bourne Shell | [-n flag](http://linux.die.net/man/1/sh) |
| Bourne Shell | [-n flag](http://linux.die.net/man/1/sh), [shellcheck](https://www.shellcheck.net/) |
| C | [gcc](https://gcc.gnu.org/) |
| CoffeeScript | [coffeelint](https://www.npmjs.com/package/coffeelint) |
| D | [dmd](https://dlang.org/dmd-linux.html)^ |

View File

@ -9,35 +9,6 @@ if !exists('g:ale_c_gcc_options')
let g:ale_c_gcc_options = '-Wall'
endif
function! ale_linters#c#gcc#Handle(buffer, lines)
" Look for lines like the following.
"
" <stdin>:8:5: warning: conversion lacks type at end of format [-Wformat=]
" <stdin>:10:27: error: invalid operands to binary - (have int and char *)
let pattern = '^<stdin>:\(\d\+\):\(\d\+\): \(warning\|error\): \(.\+\)$'
let output = []
for line in a:lines
let l:match = matchlist(line, pattern)
if len(l:match) == 0
continue
endif
call add(output, {
\ 'bufnr': a:buffer,
\ 'lnum': l:match[1] + 0,
\ 'vcol': 0,
\ 'col': l:match[2] + 0,
\ 'text': l:match[4],
\ 'type': l:match[3] ==# 'warning' ? 'W' : 'E',
\ 'nr': -1,
\})
endfor
return output
endfunction
call ALEAddLinter('c', {
\ 'name': 'gcc',
\ 'output_stream': 'stderr',
@ -45,5 +16,5 @@ call ALEAddLinter('c', {
\ 'command': 'gcc -S -x c -fsyntax-only '
\ . g:ale_c_gcc_options
\ . ' -',
\ 'callback': 'ale_linters#c#gcc#Handle',
\ 'callback': 'ale#handlers#HandleGCCFormat',
\})

View File

@ -0,0 +1,32 @@
" Author: w0rp <devw0rp@gmail.com>
" Description: This file adds support for using the shellcheck linter with
" shell scripts.
if exists('g:loaded_ale_linters_sh_shellcheck')
finish
endif
let g:loaded_ale_linters_sh_shellcheck = 1
" This global variable can be set with a string of comma-seperated error
" codes to exclude from shellcheck. For example:
"
" let g:ale_linters_sh_shellcheck_exclusions = 'SC2002,SC2004'
if !exists('g:ale_linters_sh_shellcheck_exclusions')
let g:ale_linters_sh_shellcheck_exclusions = ''
endif
if g:ale_linters_sh_shellcheck_exclusions != ''
let s:exclude_option = '-e ' . g:ale_linters_sh_shellcheck_exclusions
else
let s:exclude_option = ''
endif
call ALEAddLinter('sh', {
\ 'name': 'shellcheck',
\ 'executable': 'shellcheck',
\ 'command': 'shellcheck ' . s:exclude_option . ' -f gcc -',
\ 'callback': 'ale#handlers#HandleGCCFormat',
\})
echo 'shellcheck' . s:exclude_option . '-f gcc -'

40
plugin/ale/handlers.vim Normal file
View File

@ -0,0 +1,40 @@
" Author: w0rp <devw0rp@gmail.com>
" Description: This file defines some standard error format handlers. Any
" linter which outputs warnings and errors in a format accepted by one of
" these functions can simply use one of these pre-defined error handlers.
if exists('g:loaded_ale_handlers')
finish
endif
let g:loaded_ale_handlers = 1
function! ale#handlers#HandleGCCFormat(buffer, lines)
" Look for lines like the following.
"
" <stdin>:8:5: warning: conversion lacks type at end of format [-Wformat=]
" <stdin>:10:27: error: invalid operands to binary - (have int and char *)
" -:189:7: note: $/${} is unnecessary on arithmetic variables. [SC2004]
let pattern = '^[^:]\+:\(\d\+\):\(\d\+\): \([^:]\+\): \(.\+\)$'
let output = []
for line in a:lines
let l:match = matchlist(line, pattern)
if len(l:match) == 0
continue
endif
call add(output, {
\ 'bufnr': a:buffer,
\ 'lnum': l:match[1] + 0,
\ 'vcol': 0,
\ 'col': l:match[2] + 0,
\ 'text': l:match[4],
\ 'type': l:match[3] ==# 'error' ? 'E' : 'W',
\ 'nr': -1,
\})
endfor
return output
endfunction