mirror of https://github.com/amix/vimrc.git
Read more here: https://github.com/w0rp/alepull/408/head
parent
37297ddae6
commit
7c643a2d9c
@ -0,0 +1,22 @@ |
||||
Copyright (c) 2016-2018, w0rp <devw0rp@gmail.com> |
||||
All rights reserved. |
||||
|
||||
Redistribution and use in source and binary forms, with or without |
||||
modification, are permitted provided that the following conditions are met: |
||||
|
||||
1. Redistributions of source code must retain the above copyright notice, this |
||||
list of conditions and the following disclaimer. |
||||
2. Redistributions in binary form must reproduce the above copyright notice, |
||||
this list of conditions and the following disclaimer in the documentation |
||||
and/or other materials provided with the distribution. |
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR |
||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
@ -0,0 +1,37 @@ |
||||
" Author: w0rp <devw0rp@gmail.com> |
||||
" Description: Follow-up checks for the plugin: warn about conflicting plugins. |
||||
|
||||
" A flag for ensuring that this is not run more than one time. |
||||
if exists('g:loaded_ale_after') |
||||
finish |
||||
endif |
||||
|
||||
" Set the flag so this file is not run more than one time. |
||||
let g:loaded_ale_after = 1 |
||||
|
||||
" Check if the flag is available and set to 0 to disable checking for and |
||||
" emitting conflicting plugin warnings. |
||||
if exists('g:ale_emit_conflict_warnings') && !g:ale_emit_conflict_warnings |
||||
finish |
||||
endif |
||||
|
||||
" Conflicting Plugins Checks |
||||
|
||||
function! s:GetConflictingPluginWarning(plugin_name) abort |
||||
return 'ALE conflicts with ' . a:plugin_name |
||||
\ . '. Uninstall it, or disable this warning with ' |
||||
\ . '`let g:ale_emit_conflict_warnings = 0` in your vimrc file, ' |
||||
\ . '*before* plugins are loaded.' |
||||
endfunction |
||||
|
||||
if exists('g:loaded_syntastic_plugin') |
||||
throw s:GetConflictingPluginWarning('Syntastic') |
||||
endif |
||||
|
||||
if exists('g:loaded_neomake') |
||||
throw s:GetConflictingPluginWarning('Neomake') |
||||
endif |
||||
|
||||
if exists('g:loaded_validator_plugin') |
||||
throw s:GetConflictingPluginWarning('Validator') |
||||
endif |
@ -0,0 +1,49 @@ |
||||
" Author: Bjorn Neergaard <bjorn@neersighted.com> |
||||
" Description: ansible-lint for ansible-yaml files |
||||
|
||||
function! ale_linters#ansible#ansible_lint#Handle(buffer, lines) abort |
||||
for l:line in a:lines[:10] |
||||
if match(l:line, '^Traceback') >= 0 |
||||
return [{ |
||||
\ 'lnum': 1, |
||||
\ 'text': 'An exception was thrown. See :ALEDetail', |
||||
\ 'detail': join(a:lines, "\n"), |
||||
\}] |
||||
endif |
||||
endfor |
||||
|
||||
" Matches patterns line the following: |
||||
" |
||||
" test.yml:35: [EANSIBLE0002] Trailing whitespace |
||||
let l:pattern = '\v^([a-zA-Z]?:?[^:]+):(\d+):?(\d+)?: \[?([[:alnum:]]+)\]? (.*)$' |
||||
let l:output = [] |
||||
|
||||
for l:match in ale#util#GetMatches(a:lines, l:pattern) |
||||
let l:code = l:match[4] |
||||
|
||||
if l:code is# 'EANSIBLE0002' |
||||
\&& !ale#Var(a:buffer, 'warn_about_trailing_whitespace') |
||||
" Skip warnings for trailing whitespace if the option is off. |
||||
continue |
||||
endif |
||||
|
||||
if ale#path#IsBufferPath(a:buffer, l:match[1]) |
||||
call add(l:output, { |
||||
\ 'lnum': l:match[2] + 0, |
||||
\ 'col': l:match[3] + 0, |
||||
\ 'text': l:match[5], |
||||
\ 'code': l:code, |
||||
\ 'type': l:code[:0] is# 'E' ? 'E' : 'W', |
||||
\}) |
||||
endif |
||||
endfor |
||||
|
||||
return l:output |
||||
endfunction |
||||
|
||||
call ale#linter#Define('ansible', { |
||||
\ 'name': 'ansible', |
||||
\ 'executable': 'ansible', |
||||
\ 'command': 'ansible-lint -p %t', |
||||
\ 'callback': 'ale_linters#ansible#ansible_lint#Handle', |
||||
\}) |
@ -0,0 +1,36 @@ |
||||
" Author: nametake https://nametake.github.io |
||||
" Description: apiblueprint parser |
||||
|
||||
function! ale_linters#apiblueprint#drafter#HandleErrors(buffer, lines) abort |
||||
" Matches patterns line the following: |
||||
" |
||||
" warning: (3) unable to parse response signature, expected 'response [<HTTP status code>] [(<media type>)]'; line 4, column 3k - line 4, column 22 |
||||
" warning: (10) message-body asset is expected to be a pre-formatted code block, separate it by a newline and indent every of its line by 12 spaces or 3 tabs; line 30, column 5 - line 30, column 9; line 31, column 9 - line 31, column 14; line 32, column 9 - line 32, column 14 |
||||
let l:pattern = '\(^.*\): (\d\+) \(.\{-\}\); line \(\d\+\), column \(\d\+\) - line \d\+, column \d\+\(.*; line \d\+, column \d\+ - line \(\d\+\), column \(\d\+\)\)\{-\}$' |
||||
let l:output = [] |
||||
|
||||
for l:match in ale#util#GetMatches(a:lines[2:], l:pattern) |
||||
let l:item = { |
||||
\ 'type': l:match[1] is# 'warning' ? 'W' : 'E', |
||||
\ 'text': l:match[2], |
||||
\ 'lnum': l:match[3] + 0, |
||||
\ 'col': l:match[4] + 0, |
||||
\} |
||||
if l:match[5] isnot# '' |
||||
let l:item.end_lnum = l:match[6] + 0 |
||||
let l:item.end_col = l:match[7] + 0 |
||||
endif |
||||
call add(l:output, l:item) |
||||
endfor |
||||
|
||||
return l:output |
||||
endfunction |
||||
|
||||
|
||||
call ale#linter#Define('apiblueprint', { |
||||
\ 'name': 'drafter', |
||||
\ 'output_stream': 'stderr', |
||||
\ 'executable': 'drafter', |
||||
\ 'command': 'drafter --use-line-num --validate %t', |
||||
\ 'callback': 'ale_linters#apiblueprint#drafter#HandleErrors', |
||||
\}) |
@ -0,0 +1,11 @@ |
||||
" Author: Johannes Wienke <languitar@semipol.de> |
||||
" Description: alex for asciidoc files |
||||
|
||||
call ale#linter#Define('help', { |
||||
\ 'name': 'alex', |
||||
\ 'executable': 'alex', |
||||
\ 'command': 'alex %s -t', |
||||
\ 'output_stream': 'stderr', |
||||
\ 'callback': 'ale#handlers#alex#Handle', |
||||
\ 'lint_file': 1, |
||||
\}) |
@ -0,0 +1,9 @@ |
||||
" Author: Daniel M. Capella https://github.com/polyzen |
||||
" Description: proselint for AsciiDoc files |
||||
|
||||
call ale#linter#Define('asciidoc', { |
||||
\ 'name': 'proselint', |
||||
\ 'executable': 'proselint', |
||||
\ 'command': 'proselint %t', |
||||
\ 'callback': 'ale#handlers#unix#HandleAsWarning', |
||||
\}) |
@ -0,0 +1,9 @@ |
||||
" Author: rhysd https://rhysd.github.io |
||||
" Description: Redpen, a proofreading tool (http://redpen.cc) |
||||
|
||||
call ale#linter#Define('asciidoc', { |
||||
\ 'name': 'redpen', |
||||
\ 'executable': 'redpen', |
||||
\ 'command': 'redpen -f asciidoc -r json %t', |
||||
\ 'callback': 'ale#handlers#redpen#HandleRedpenOutput', |
||||
\}) |
@ -0,0 +1,9 @@ |
||||
" Author: Sumner Evans <sumner.evans98@gmail.com> |
||||
" Description: write-good for AsciiDoc files |
||||
|
||||
call ale#linter#Define('asciidoc', { |
||||
\ 'name': 'write-good', |
||||
\ 'executable_callback': 'ale#handlers#writegood#GetExecutable', |
||||
\ 'command_callback': 'ale#handlers#writegood#GetCommand', |
||||
\ 'callback': 'ale#handlers#writegood#Handle', |
||||
\}) |
@ -0,0 +1,39 @@ |
||||
" Author: Lucas Kolstad <lkolstad@uw.edu> |
||||
" Description: gcc linter for asm files |
||||
|
||||
call ale#Set('asm_gcc_executable', 'gcc') |
||||
call ale#Set('asm_gcc_options', '-Wall') |
||||
|
||||
function! ale_linters#asm#gcc#GetExecutable(buffer) abort |
||||
return ale#Var(a:buffer, 'asm_gcc_executable') |
||||
endfunction |
||||
|
||||
function! ale_linters#asm#gcc#GetCommand(buffer) abort |
||||
return ale#Escape(ale_linters#asm#gcc#GetExecutable(a:buffer)) |
||||
\ . ' -x assembler -fsyntax-only ' |
||||
\ . '-iquote ' . ale#Escape(fnamemodify(bufname(a:buffer), ':p:h')) |
||||
\ . ' ' . ale#Var(a:buffer, 'asm_gcc_options') . ' -' |
||||
endfunction |
||||
|
||||
function! ale_linters#asm#gcc#Handle(buffer, lines) abort |
||||
let l:pattern = '^.\+:\(\d\+\): \([^:]\+\): \(.\+\)$' |
||||
let l:output = [] |
||||
|
||||
for l:match in ale#util#GetMatches(a:lines, l:pattern) |
||||
call add(l:output, { |
||||
\ 'lnum': l:match[1] + 0, |
||||
\ 'type': l:match[2] =~? 'error' ? 'E' : 'W', |
||||
\ 'text': l:match[3], |
||||
\}) |
||||
endfor |
||||
|
||||
return l:output |
||||
endfunction |
||||
|
||||
call ale#linter#Define('asm', { |
||||
\ 'name': 'gcc', |
||||
\ 'output_stream': 'stderr', |
||||
\ 'executable_callback': 'ale_linters#asm#gcc#GetExecutable', |
||||
\ 'command_callback': 'ale_linters#asm#gcc#GetCommand', |
||||
\ 'callback': 'ale_linters#asm#gcc#Handle', |
||||
\}) |
@ -0,0 +1,30 @@ |
||||
" Author: kmarc <korondi.mark@gmail.com> |
||||
" Description: This file adds support for using GNU awk with sripts. |
||||
|
||||
let g:ale_awk_gawk_executable = |
||||
\ get(g:, 'ale_awk_gawk_executable', 'gawk') |
||||
|
||||
let g:ale_awk_gawk_options = |
||||
\ get(g:, 'ale_awk_gawk_options', '') |
||||
|
||||
function! ale_linters#awk#gawk#GetExecutable(buffer) abort |
||||
return ale#Var(a:buffer, 'awk_gawk_executable') |
||||
endfunction |
||||
|
||||
function! ale_linters#awk#gawk#GetCommand(buffer) abort |
||||
" note the --source 'BEGIN ...' is to prevent |
||||
" gawk from attempting to execute the body of the script |
||||
" it is linting. |
||||
return ale_linters#awk#gawk#GetExecutable(a:buffer) |
||||
\ . " --source 'BEGIN { exit } END { exit 1 }'" |
||||
\ . ' ' . ale#Var(a:buffer, 'awk_gawk_options') |
||||
\ . ' ' . '-f %t --lint /dev/null' |
||||
endfunction |
||||
|
||||
call ale#linter#Define('awk', { |
||||
\ 'name': 'gawk', |
||||
\ 'executable_callback': 'ale_linters#awk#gawk#GetExecutable', |
||||
\ 'command_callback': 'ale_linters#awk#gawk#GetCommand', |
||||
\ 'callback': 'ale#handlers#gawk#HandleGawkFormat', |
||||
\ 'output_stream': 'both' |
||||
\}) |
@ -0,0 +1,32 @@ |
||||
" Author: Masahiro H https://github.com/mshr-h |
||||
" Description: clang linter for c files |
||||
|
||||
call ale#Set('c_clang_executable', 'clang') |
||||
call ale#Set('c_clang_options', '-std=c11 -Wall') |
||||
|
||||
function! ale_linters#c#clang#GetExecutable(buffer) abort |
||||
return ale#Var(a:buffer, 'c_clang_executable') |
||||
endfunction |
||||
|
||||
function! ale_linters#c#clang#GetCommand(buffer, output) abort |
||||
let l:cflags = ale#c#GetCFlags(a:buffer, a:output) |
||||
|
||||
" -iquote with the directory the file is in makes #include work for |
||||
" headers in the same directory. |
||||
return ale#Escape(ale_linters#c#clang#GetExecutable(a:buffer)) |
||||
\ . ' -S -x c -fsyntax-only ' |
||||
\ . '-iquote ' . ale#Escape(fnamemodify(bufname(a:buffer), ':p:h')) . ' ' |
||||
\ . l:cflags |
||||
\ . ale#Var(a:buffer, 'c_clang_options') . ' -' |
||||
endfunction |
||||
|
||||
call ale#linter#Define('c', { |
||||
\ 'name': 'clang', |
||||
\ 'output_stream': 'stderr', |
||||
\ 'executable_callback': 'ale_linters#c#clang#GetExecutable', |
||||
\ 'command_chain': [ |
||||
\ {'callback': 'ale#c#GetMakeCommand', 'output_stream': 'stdout'}, |
||||
\ {'callback': 'ale_linters#c#clang#GetCommand'} |
||||
\ ], |
||||
\ 'callback': 'ale#handlers#gcc#HandleGCCFormat', |
||||
\}) |
@ -0,0 +1,64 @@ |
||||
" Author: vdeurzen <tim@kompiler.org>, w0rp <devw0rp@gmail.com>, |
||||
" gagbo <gagbobada@gmail.com>, Andrej Radovic <r.andrej@gmail.com> |
||||
" Description: clang-tidy linter for c files |
||||
|
||||
call ale#Set('c_clangtidy_executable', 'clang-tidy') |
||||
" Set this option to check the checks clang-tidy will apply. |
||||
" The number of checks that can be applied to C files is limited in contrast to |
||||
" C++ |
||||
" |
||||
" Consult the check list in clang-tidy's documentation: |
||||
" http://clang.llvm.org/extra/clang-tidy/checks/list.html |
||||
|
||||
call ale#Set('c_clangtidy_checks', ['*']) |
||||
" Set this option to manually set some options for clang-tidy. |
||||
" This will disable compile_commands.json detection. |
||||
call ale#Set('c_clangtidy_options', '') |
||||
call ale#Set('c_build_dir', '') |
||||
|
||||
function! ale_linters#c#clangtidy#GetExecutable(buffer) abort |
||||
return ale#Var(a:buffer, 'c_clangtidy_executable') |
||||
endfunction |
||||
|
||||
function! s:GetBuildDirectory(buffer) abort |
||||
" Don't include build directory for header files, as compile_commands.json |
||||
" files don't consider headers to be translation units, and provide no |
||||
" commands for compiling header files. |
||||
if expand('#' . a:buffer) =~# '\v\.(h|hpp)$' |
||||
return '' |
||||
endif |
||||
|
||||
let l:build_dir = ale#Var(a:buffer, 'c_build_dir') |
||||
|
||||
" c_build_dir has the priority if defined |
||||
if !empty(l:build_dir) |
||||
return l:build_dir |
||||
endif |
||||
|
||||
return ale#c#FindCompileCommands(a:buffer) |
||||
endfunction |
||||
|
||||
function! ale_linters#c#clangtidy#GetCommand(buffer) abort |
||||
let l:checks = join(ale#Var(a:buffer, 'c_clangtidy_checks'), ',') |
||||
let l:build_dir = s:GetBuildDirectory(a:buffer) |
||||
|
||||
" Get the extra options if we couldn't find a build directory. |
||||
let l:options = empty(l:build_dir) |
||||
\ ? ale#Var(a:buffer, 'c_clangtidy_options') |
||||
\ : '' |
||||
|
||||
return ale#Escape(ale_linters#c#clangtidy#GetExecutable(a:buffer)) |
||||
\ . (!empty(l:checks) ? ' -checks=' . ale#Escape(l:checks) : '') |
||||
\ . ' %s' |
||||
\ . (!empty(l:build_dir) ? ' -p ' . ale#Escape(l:build_dir) : '') |
||||
\ . (!empty(l:options) ? ' -- ' . l:options : '') |
||||
endfunction |
||||
|
||||
call ale#linter#Define('c', { |
||||
\ 'name': 'clangtidy', |
||||
\ 'output_stream': 'stdout', |
||||
\ 'executable_callback': 'ale_linters#c#clangtidy#GetExecutable', |
||||
\ 'command_callback': 'ale_linters#c#clangtidy#GetCommand', |
||||
\ 'callback': 'ale#handlers#gcc#HandleGCCFormat', |
||||
\ 'lint_file': 1, |
||||
\}) |
@ -0,0 +1,39 @@ |
||||
" Author: Bart Libert <bart.libert@gmail.com> |
||||
" Description: cppcheck linter for c files |
||||
|
||||
call ale#Set('c_cppcheck_executable', 'cppcheck') |
||||
call ale#Set('c_cppcheck_options', '--enable=style') |
||||
|
||||
function! ale_linters#c#cppcheck#GetExecutable(buffer) abort |
||||
return ale#Var(a:buffer, 'c_cppcheck_executable') |
||||
endfunction |
||||
|
||||
function! ale_linters#c#cppcheck#GetCommand(buffer) abort |
||||
" Search upwards from the file for compile_commands.json. |
||||
" |
||||
" If we find it, we'll `cd` to where the compile_commands.json file is, |
||||
" then use the file to set up import paths, etc. |
||||
let l:compile_commmands_path = ale#path#FindNearestFile(a:buffer, 'compile_commands.json') |
||||
|
||||
let l:cd_command = !empty(l:compile_commmands_path) |
||||
\ ? ale#path#CdString(fnamemodify(l:compile_commmands_path, ':h')) |
||||
\ : '' |
||||
let l:compile_commands_option = !empty(l:compile_commmands_path) |
||||
\ ? '--project=compile_commands.json ' |
||||
\ : '' |
||||
|
||||
return l:cd_command |
||||
\ . ale#Escape(ale_linters#c#cppcheck#GetExecutable(a:buffer)) |
||||
\ . ' -q --language=c ' |
||||
\ . l:compile_commands_option |
||||
\ . ale#Var(a:buffer, 'c_cppcheck_options') |
||||
\ . ' %t' |
||||
endfunction |
||||
|
||||
call ale#linter#Define('c', { |
||||
\ 'name': 'cppcheck', |
||||
\ 'output_stream': 'both', |
||||
\ 'executable_callback': 'ale_linters#c#cppcheck#GetExecutable', |
||||
\ 'command_callback': 'ale_linters#c#cppcheck#GetCommand', |
||||
\ 'callback': 'ale#handlers#cppcheck#HandleCppCheckFormat', |
||||
\}) |
@ -0,0 +1,31 @@ |
||||
" Author: Christian Gibbons <cgibbons@gmu.edu> |
||||
" Description: flawfinder linter for c files |
||||
|
||||
call ale#Set('c_flawfinder_executable', 'flawfinder') |
||||
call ale#Set('c_flawfinder_options', '') |
||||
call ale#Set('c_flawfinder_minlevel', 1) |
||||
call ale#Set('c_flawfinder_error_severity', 6) |
||||
|
||||
function! ale_linters#c#flawfinder#GetExecutable(buffer) abort |
||||
return ale#Var(a:buffer, 'c_flawfinder_executable') |
||||
endfunction |
||||
|
||||
function! ale_linters#c#flawfinder#GetCommand(buffer) abort |
||||
|
||||
" Set the minimum vulnerability level for flawfinder to bother with |
||||
let l:minlevel = ' --minlevel=' . ale#Var(a:buffer, 'c_flawfinder_minlevel') |
||||
|
||||
return ale#Escape(ale_linters#c#flawfinder#GetExecutable(a:buffer)) |
||||
\ . ' -CDQS' |
||||
\ . ale#Var(a:buffer, 'c_flawfinder_options') |
||||
\ . l:minlevel |
||||
\ . ' %t' |
||||
endfunction |
||||
|
||||
call ale#linter#Define('c', { |
||||
\ 'name': 'flawfinder', |
||||
\ 'output_stream': 'stdout', |
||||
\ 'executable_callback': 'ale_linters#c#flawfinder#GetExecutable', |
||||
\ 'command_callback': 'ale_linters#c#flawfinder#GetCommand', |
||||
\ 'callback': 'ale#handlers#flawfinder#HandleFlawfinderFormat', |
||||
\}) |
@ -0,0 +1,32 @@ |
||||
" Author: w0rp <devw0rp@gmail.com> |
||||
" Description: gcc linter for c files |
||||
|
||||
call ale#Set('c_gcc_executable', 'gcc') |
||||
call ale#Set('c_gcc_options', '-std=c11 -Wall') |
||||
|
||||
function! ale_linters#c#gcc#GetExecutable(buffer) abort |
||||
return ale#Var(a:buffer, 'c_gcc_executable') |
||||
endfunction |
||||
|
||||
function! ale_linters#c#gcc#GetCommand(buffer, output) abort |
||||
let l:cflags = ale#c#GetCFlags(a:buffer, a:output) |
||||
|
||||
" -iquote with the directory the file is in makes #include work for |
||||
" headers in the same directory. |
||||
return ale#Escape(ale_linters#c#gcc#GetExecutable(a:buffer)) |
||||
\ . ' -S -x c -fsyntax-only ' |
||||
\ . '-iquote ' . ale#Escape(fnamemodify(bufname(a:buffer), ':p:h')) . ' ' |
||||
\ . l:cflags |
||||
\ . ale#Var(a:buffer, 'c_gcc_options') . ' -' |
||||
endfunction |
||||
|
||||
call ale#linter#Define('c', { |
||||
\ 'name': 'gcc', |
||||
\ 'output_stream': 'stderr', |
||||
\ 'executable_callback': 'ale_linters#c#gcc#GetExecutable', |
||||
\ 'command_chain': [ |
||||
\ {'callback': 'ale#c#GetMakeCommand', 'output_stream': 'stdout'}, |
||||
\ {'callback': 'ale_linters#c#gcc#GetCommand'} |
||||
\ ], |
||||
\ 'callback': 'ale#handlers#gcc#HandleGCCFormat', |
||||
\}) |
@ -0,0 +1,48 @@ |
||||
" Author: Edward Larkey <edwlarkey@mac.com> |
||||
" Author: Jose Junior <jose.junior@gmail.com> |
||||
" Author: w0rp <devw0rp@gmail.com> |
||||
" Description: This file adds the foodcritic linter for Chef files. |
||||
|
||||
call ale#Set('chef_foodcritic_executable', 'foodcritic') |
||||
call ale#Set('chef_foodcritic_options', '') |
||||
|
||||
function! ale_linters#chef#foodcritic#GetExecutable(buffer) abort |
||||
return ale#Var(a:buffer, 'chef_foodcritic_executable') |
||||
endfunction |
||||
|
||||
function! ale_linters#chef#foodcritic#GetCommand(buffer) abort |
||||
let l:executable = ale_linters#chef#foodcritic#GetExecutable(a:buffer) |
||||
let l:options = ale#Var(a:buffer, 'chef_foodcritic_options') |
||||
|
||||
return ale#Escape(l:executable) |
||||
\ . (!empty(l:options) ? ' ' . escape(l:options, '~') : '') |
||||
\ . ' %s' |
||||
endfunction |
||||
|
||||
function! ale_linters#chef#foodcritic#Handle(buffer, lines) abort |
||||
" Matches patterns line the following: |
||||
" |
||||
" FC002: Avoid string interpolation where not required: httpd.rb:13 |
||||
let l:pattern = '\v([^:]+): (.+): ([a-zA-Z]?:?[^:]+):(\d+)$' |
||||
let l:output = [] |
||||
|
||||
for l:match in ale#util#GetMatches(a:lines, l:pattern) |
||||
call add(l:output, { |
||||
\ 'code': l:match[1], |
||||
\ 'text': l:match[2], |
||||
\ 'filename': l:match[3], |
||||
\ 'lnum': l:match[4] + 0, |
||||
\ 'type': 'W', |
||||
\}) |
||||
endfor |
||||
|
||||
return l:output |
||||
endfunction |
||||
|
||||
call ale#linter#Define('chef', { |
||||
\ 'name': 'foodcritic', |
||||
\ 'executable_callback': 'ale_linters#chef#foodcritic#GetExecutable', |
||||
\ 'command_callback': 'ale_linters#chef#foodcritic#GetCommand', |
||||
\ 'callback': 'ale_linters#chef#foodcritic#Handle', |
||||
\ 'lint_file': 1, |
||||
\}) |
@ -0,0 +1,32 @@ |
||||
" Author: Nic West <nicwest@mailbox.org> |
||||
" Description: linter for clojure using joker https://github.com/candid82/joker |
||||
|
||||
function! ale_linters#clojure#joker#HandleJokerFormat(buffer, lines) abort |
||||
" output format |
||||
" <filename>:<line>:<column>: <issue type>: <message> |
||||
let l:pattern = '\v^[a-zA-Z]?:?[^:]+:(\d+):(\d+):? ((Read error|Parse error|Parse warning|Exception): ?(.+))$' |
||||
let l:output = [] |
||||
|
||||
for l:match in ale#util#GetMatches(a:lines, l:pattern) |
||||
let l:type = 'E' |
||||
if l:match[4] is? 'Parse warning' |
||||
let l:type = 'W' |
||||
endif |
||||
call add(l:output, { |
||||
\ 'lnum': l:match[1] + 0, |
||||
\ 'col': l:match[2] + 0, |
||||
\ 'text': l:match[3], |
||||
\ 'type': l:type, |
||||
\}) |
||||
endfor |
||||
|
||||
return l:output |
||||
endfunction |
||||
|
||||
call ale#linter#Define('clojure', { |
||||
\ 'name': 'joker', |
||||
\ 'output_stream': 'stderr', |
||||
\ 'executable': 'joker', |
||||
\ 'command': 'joker --lint %t', |
||||
\ 'callback': 'ale_linters#clojure#joker#HandleJokerFormat', |
||||
\}) |
@ -0,0 +1,24 @@ |
||||
" Author: Kenneth Benzie <k.benzie83@gmail.com> |
||||
" Description: cmakelint for cmake files |
||||
|
||||
let g:ale_cmake_cmakelint_executable = |
||||
\ get(g:, 'ale_cmake_cmakelint_executable', 'cmakelint') |
||||
|
||||
let g:ale_cmake_cmakelint_options = |
||||
\ get(g:, 'ale_cmake_cmakelint_options', '') |
||||
|
||||
function! ale_linters#cmake#cmakelint#Executable(buffer) abort |
||||
return ale#Var(a:buffer, 'cmake_cmakelint_executable') |
||||
endfunction |
||||
|
||||
function! ale_linters#cmake#cmakelint#Command(buffer) abort |
||||
return ale_linters#cmake#cmakelint#Executable(a:buffer) |
||||
\ . ' ' . ale#Var(a:buffer, 'cmake_cmakelint_options') . ' %t' |
||||
endfunction |
||||
|
||||
call ale#linter#Define('cmake', { |
||||
\ 'name': 'cmakelint', |
||||
\ 'executable_callback': 'ale_linters#cmake#cmakelint#Executable', |
||||
\ 'command_callback': 'ale_linters#cmake#cmakelint#Command', |
||||
\ 'callback': 'ale#handlers#unix#HandleAsWarning', |
||||
\}) |
@ -0,0 +1,23 @@ |
||||
" Author: KabbAmine - https://github.com/KabbAmine |
||||
" Description: Coffee for checking coffee files |
||||
|
||||
function! ale_linters#coffee#coffee#GetExecutable(buffer) abort |
||||
return ale#path#ResolveLocalPath( |
||||
\ a:buffer, |
||||
\ 'node_modules/.bin/coffee', |
||||
\ 'coffee' |
||||
\) |
||||
endfunction |
||||
|
||||
function! ale_linters#coffee#coffee#GetCommand(buffer) abort |
||||
return ale_linters#coffee#coffee#GetExecutable(a:buffer) |
||||
\ . ' -cp -s' |
||||
endfunction |
||||
|
||||
call ale#linter#Define('coffee', { |
||||
\ 'name': 'coffee', |
||||
\ 'executable_callback': 'ale_linters#coffee#coffee#GetExecutable', |
||||
\ 'command_callback': 'ale_linters#coffee#coffee#GetCommand', |
||||
\ 'output_stream': 'stderr', |
||||
\ 'callback': 'ale#handlers#gcc#HandleGCCFormat', |
||||
\}) |
@ -0,0 +1,43 @@ |
||||
" Author: Prashanth Chandra https://github.com/prashcr |
||||
" Description: coffeelint linter for coffeescript files |
||||
|
||||
function! ale_linters#coffee#coffeelint#GetExecutable(buffer) abort |
||||
return ale#path#ResolveLocalPath( |
||||
\ a:buffer, |
||||
\ 'node_modules/.bin/coffeelint', |
||||
\ 'coffeelint' |
||||
\) |
||||
endfunction |
||||
|
||||
function! ale_linters#coffee#coffeelint#GetCommand(buffer) abort |
||||
return ale_linters#coffee#coffeelint#GetExecutable(a:buffer) |
||||
\ . ' --stdin --reporter csv' |
||||
endfunction |
||||
|
||||
function! ale_linters#coffee#coffeelint#Handle(buffer, lines) abort |
||||
" Matches patterns like the following: |
||||
" |
||||
" path,lineNumber,lineNumberEnd,level,message |
||||
" stdin,14,,error,Throwing strings is forbidden |
||||
" |
||||
" Note that we currently ignore lineNumberEnd for multiline errors |
||||
let l:pattern = 'stdin,\(\d\+\),\(\d*\),\(.\{-1,}\),\(.\+\)' |
||||
let l:output = [] |
||||
|
||||
for l:match in ale#util#GetMatches(a:lines, l:pattern) |
||||
call add(l:output, { |
||||
\ 'lnum': str2nr(l:match[1]), |
||||
\ 'type': l:match[3] is# 'error' ? 'E' : 'W', |
||||
\ 'text': l:match[4], |
||||
\}) |
||||
endfor |
||||
|
||||
return l:output |
||||
endfunction |
||||
|
||||
call ale#linter#Define('coffee', { |
||||
\ 'name': 'coffeelint', |
||||
\ 'executable_callback': 'ale_linters#coffee#coffeelint#GetExecutable', |
||||
\ 'command_callback': 'ale_linters#coffee#coffeelint#GetCommand', |
||||
\ 'callback': 'ale_linters#coffee#coffeelint#Handle', |
||||
\}) |
@ -0,0 +1,32 @@ |
||||
" Author: Tomota Nakamura <https://github.com/tomotanakamura> |
||||
" Description: clang linter for cpp files |
||||
|
||||
call ale#Set('cpp_clang_executable', 'clang++') |
||||
call ale#Set('cpp_clang_options', '-std=c++14 -Wall') |
||||
|
||||
function! ale_linters#cpp#clang#GetExecutable(buffer) abort |
||||
return ale#Var(a:buffer, 'cpp_clang_executable') |
||||
endfunction |
||||
|
||||
function! ale_linters#cpp#clang#GetCommand(buffer, output) abort |
||||
let l:cflags = ale#c#GetCFlags(a:buffer, a:output) |
||||
|
||||
" -iquote with the directory the file is in makes #include work for |
||||
" headers in the same directory. |
||||
return ale#Escape(ale_linters#cpp#clang#GetExecutable(a:buffer)) |
||||
\ . ' -S -x c++ -fsyntax-only ' |
||||
\ . '-iquote ' . ale#Escape(fnamemodify(bufname(a:buffer), ':p:h')) . ' ' |
||||
\ . l:cflags |
||||
\ . ale#Var(a:buffer, 'cpp_clang_options') . ' -' |
||||
endfunction |
||||
|
||||
call ale#linter#Define('cpp', { |
||||
\ 'name': 'clang', |
||||
\ 'output_stream': 'stderr', |
||||
\ 'executable_callback': 'ale_linters#cpp#clang#GetExecutable', |
||||
\ 'command_chain': [ |
||||
\ {'callback': 'ale#c#GetMakeCommand', 'output_stream': 'stdout'}, |
||||
\ {'callback': 'ale_linters#cpp#clang#GetCommand'}, |
||||
\ ], |
||||
\ 'callback': 'ale#handlers#gcc#HandleGCCFormat', |
||||
\}) |
@ -0,0 +1,39 @@ |
||||
" Author: gagbo <gagbobada@gmail.com> |
||||
" Description: clang-check linter for cpp files |
||||
|
||||
call ale#Set('cpp_clangcheck_executable', 'clang-check') |
||||
call ale#Set('cpp_clangcheck_options', '') |
||||
call ale#Set('c_build_dir', '') |
||||
|
||||
function! ale_linters#cpp#clangcheck#GetExecutable(buffer) abort |
||||
return ale#Var(a:buffer, 'cpp_clangcheck_executable') |
||||
endfunction |
||||
|
||||
function! ale_linters#cpp#clangcheck#GetCommand(buffer) abort |
||||
let l:user_options = ale#Var(a:buffer, 'cpp_clangcheck_options') |
||||
|
||||
" Try to find compilation database to link automatically |
||||
let l:build_dir = ale#Var(a:buffer, 'c_build_dir') |
||||
|
||||
if empty(l:build_dir) |
||||
let l:build_dir = ale#c#FindCompileCommands(a:buffer) |
||||
endif |
||||
|
||||
" The extra arguments in the command are used to prevent .plist files from |
||||
" being generated. These are only added if no build directory can be |
||||
" detected. |
||||
return ale#Escape(ale_linters#cpp#clangcheck#GetExecutable(a:buffer)) |
||||
\ . ' -analyze %s' |
||||
\ . (empty(l:build_dir) ? ' -extra-arg -Xclang -extra-arg -analyzer-output=text' : '') |
||||
\ . (!empty(l:user_options) ? ' ' . l:user_options : '') |
||||
\ . (!empty(l:build_dir) ? ' -p ' . ale#Escape(l:build_dir) : '') |
||||
endfunction |
||||
|
||||
call ale#linter#Define('cpp', { |
||||
\ 'name': 'clangcheck', |
||||
\ 'output_stream': 'stderr', |
||||
\ 'executable_callback': 'ale_linters#cpp#clangcheck#GetExecutable', |
||||
\ 'command_callback': 'ale_linters#cpp#clangcheck#GetCommand', |
||||
\ 'callback': 'ale#handlers#gcc#HandleGCCFormat', |
||||
\ 'lint_file': 1, |
||||
\}) |
@ -0,0 +1,58 @@ |
||||
" Author: vdeurzen <tim@kompiler.org>, w0rp <devw0rp@gmail.com>, |
||||
" gagbo <gagbobada@gmail.com> |
||||
" Description: clang-tidy linter for cpp files |
||||
|
||||
call ale#Set('cpp_clangtidy_executable', 'clang-tidy') |
||||
" Set this option to check the checks clang-tidy will apply. |
||||
call ale#Set('cpp_clangtidy_checks', ['*']) |
||||
" Set this option to manually set some options for clang-tidy. |
||||
" This will disable compile_commands.json detection. |
||||
call ale#Set('cpp_clangtidy_options', '') |
||||
call ale#Set('c_build_dir', '') |
||||
|
||||
function! ale_linters#cpp#clangtidy#GetExecutable(buffer) abort |
||||
return ale#Var(a:buffer, 'cpp_clangtidy_executable') |
||||
endfunction |
||||
|
||||
function! s:GetBuildDirectory(buffer) abort |
||||
" Don't include build directory for header files, as compile_commands.json |
||||
" files don't consider headers to be translation units, and provide no |
||||
" commands for compiling header files. |
||||
if expand('#' . a:buffer) =~# '\v\.(h|hpp)$' |
||||
return '' |
||||
endif |
||||
|
||||
let l:build_dir = ale#Var(a:buffer, 'c_build_dir') |
||||
|
||||
" c_build_dir has the priority if defined |
||||
if !empty(l:build_dir) |
||||
return l:build_dir |
||||
endif |
||||
|
||||
return ale#c#FindCompileCommands(a:buffer) |
||||
endfunction |
||||
|
||||
function! ale_linters#cpp#clangtidy#GetCommand(buffer) abort |
||||
let l:checks = join(ale#Var(a:buffer, 'cpp_clangtidy_checks'), ',') |
||||
let l:build_dir = s:GetBuildDirectory(a:buffer) |
||||
|
||||
" Get the extra options if we couldn't find a build directory. |
||||
let l:options = empty(l:build_dir) |
||||
\ ? ale#Var(a:buffer, 'cpp_clangtidy_options') |
||||
\ : '' |
||||
|
||||
return ale#Escape(ale_linters#cpp#clangtidy#GetExecutable(a:buffer)) |
||||
\ . (!empty(l:checks) ? ' -checks=' . ale#Escape(l:checks) : '') |
||||
\ . ' %s' |
||||
\ . (!empty(l:build_dir) ? ' -p ' . ale#Escape(l:build_dir) : '') |
||||
\ . (!empty(l:options) ? ' -- ' . l:options : '') |
||||
endfunction |
||||
|
||||
call ale#linter#Define('cpp', { |
||||
\ 'name': 'clangtidy', |
||||
\ 'output_stream': 'stdout', |
||||
\ 'executable_callback': 'ale_linters#cpp#clangtidy#GetExecutable', |
||||
\ 'command_callback': 'ale_linters#cpp#clangtidy#GetCommand', |
||||
\ 'callback': 'ale#handlers#gcc#HandleGCCFormat', |
||||
\ 'lint_file': 1, |
||||
\}) |
@ -0,0 +1,39 @@ |
||||
" Author: Bart Libert <bart.libert@gmail.com> |
||||
" Description: cppcheck linter for cpp files |
||||
|
||||
call ale#Set('cpp_cppcheck_executable', 'cppcheck') |
||||
call ale#Set('cpp_cppcheck_options', '--enable=style') |
||||
|
||||
function! ale_linters#cpp#cppcheck#GetExecutable(buffer) abort |
||||
return ale#Var(a:buffer, 'cpp_cppcheck_executable') |
||||
endfunction |
||||
|
||||
function! ale_linters#cpp#cppcheck#GetCommand(buffer) abort |
||||
" Search upwards from the file for compile_commands.json. |
||||
" |
||||
" If we find it, we'll `cd` to where the compile_commands.json file is, |
||||
" then use the file to set up import paths, etc. |
||||
let l:compile_commmands_path = ale#path#FindNearestFile(a:buffer, 'compile_commands.json') |
||||
|
||||
let l:cd_command = !empty(l:compile_commmands_path) |
||||
\ ? ale#path#CdString(fnamemodify(l:compile_commmands_path, ':h')) |
||||
\ : '' |
||||
let l:compile_commands_option = !empty(l:compile_commmands_path) |
||||
\ ? '--project=compile_commands.json ' |
||||
\ : '' |
||||
|
||||
return l:cd_command |
||||
\ . ale#Escape(ale_linters#cpp#cppcheck#GetExecutable(a:buffer)) |
||||
\ . ' -q --language=c++ ' |
||||
\ . l:compile_commands_option |
||||
\ . ale#Var(a:buffer, 'cpp_cppcheck_options') |
||||
\ . ' %t' |
||||
endfunction |
||||
|
||||
call ale#linter#Define('cpp', { |
||||
\ 'name': 'cppcheck', |
||||
\ 'output_stream': 'both', |
||||
\ 'executable_callback': 'ale_linters#cpp#cppcheck#GetExecutable', |
||||
\ 'command_callback': 'ale_linters#cpp#cppcheck#GetCommand', |
||||
\ 'callback': 'ale#handlers#cppcheck#HandleCppCheckFormat', |
||||
\}) |
@ -0,0 +1,26 @@ |
||||
" Author: Dawid Kurek https://github.com/dawikur |
||||
" Description: cpplint for cpp files |
||||
|
||||
call ale#Set('cpp_cpplint_executable', 'cpplint') |
||||
call ale#Set('cpp_cpplint_options', '') |
||||
|
||||
function! ale_linters#cpp#cpplint#GetExecutable(buffer) abort |
||||
return ale#Var(a:buffer, 'cpp_cpplint_executable') |
||||
endfunction |
||||
|
||||
function! ale_linters#cpp#cpplint#GetCommand(buffer) abort |
||||
let l:options = ale#Var(a:buffer, 'cpp_cpplint_options') |
||||
|
||||
return ale#Escape(ale_linters#cpp#cpplint#GetExecutable(a:buffer)) |
||||
\ . (!empty(l:options) ? ' ' . l:options : '') |
||||
\ . ' %s' |
||||
endfunction |
||||
|
||||
call ale#linter#Define('cpp', { |
||||
\ 'name': 'cpplint', |
||||
\ 'output_stream': 'stderr', |
||||
\ 'executable_callback': 'ale_linters#cpp#cpplint#GetExecutable', |
||||
\ 'command_callback': 'ale_linters#cpp#cpplint#GetCommand', |
||||
\ 'callback': 'ale#handlers#cpplint#HandleCppLintFormat', |
||||
\ 'lint_file': 1, |
||||
\}) |
@ -0,0 +1,30 @@ |
||||
" Author: Christian Gibbons <cgibbons@gmu.edu> |
||||
" Description: flawfinder linter for c++ files |
||||
|
||||
call ale#Set('cpp_flawfinder_executable', 'flawfinder') |
||||
call ale#Set('cpp_flawfinder_options', '') |
||||
call ale#Set('cpp_flawfinder_minlevel', 1) |
||||
|
||||
function! ale_linters#cpp#flawfinder#GetExecutable(buffer) abort |
||||
return ale#Var(a:buffer, 'cpp_flawfinder_executable') |
||||
endfunction |
||||
|
||||
function! ale_linters#cpp#flawfinder#GetCommand(buffer) abort |
||||
|
||||
" Set the minimum vulnerability level for flawfinder to bother with |
||||
let l:minlevel = ' --minlevel=' . ale#Var(a:buffer, 'cpp_flawfinder_minlevel') |
||||
|
||||
return ale#Escape(ale_linters#cpp#flawfinder#GetExecutable(a:buffer)) |
||||
\ . ' -CDQS' |
||||
\ . ale#Var(a:buffer, 'cpp_flawfinder_options') |
||||
\ . l:minlevel |
||||
\ . ' %t' |
||||
endfunction |
||||
|
||||
call ale#linter#Define('cpp', { |
||||
\ 'name': 'flawfinder', |
||||
\ 'output_stream': 'stdout', |
||||
\ 'executable_callback': 'ale_linters#cpp#flawfinder#GetExecutable', |
||||
\ 'command_callback': 'ale_linters#cpp#flawfinder#GetCommand', |
||||
\ 'callback': 'ale#handlers#flawfinder#HandleFlawfinderFormat', |
||||
\}) |
@ -0,0 +1,32 @@ |
||||
" Author: geam <mdelage@student.42.fr> |
||||
" Description: gcc linter for cpp files |
||||
" |
||||
call ale#Set('cpp_gcc_executable', 'gcc') |
||||
call ale#Set('cpp_gcc_options', '-std=c++14 -Wall') |
||||
|
||||
function! ale_linters#cpp#gcc#GetExecutable(buffer) abort |
||||
return ale#Var(a:buffer, 'cpp_gcc_executable') |
||||
endfunction |
||||
|
||||
function! ale_linters#cpp#gcc#GetCommand(buffer, output) abort |
||||
let l:cflags = ale#c#GetCFlags(a:buffer, a:output) |
||||
|
||||
" -iquote with the directory the file is in makes #include work for |
||||
" headers in the same directory. |
||||
return ale#Escape(ale_linters#cpp#gcc#GetExecutable(a:buffer)) |
||||
\ . ' -S -x c++ -fsyntax-only ' |
||||
\ . '-iquote ' . ale#Escape(fnamemodify(bufname(a:buffer), ':p:h')) . ' ' |
||||
\ . l:cflags |
||||
\ . ale#Var(a:buffer, 'cpp_gcc_options') . ' -' |
||||
endfunction |
||||
|
||||
call ale#linter#Define('cpp', { |
||||
\ 'name': 'g++', |
||||
\ 'output_stream': 'stderr', |
||||
\ 'executable_callback': 'ale_linters#cpp#gcc#GetExecutable', |
||||
\ 'command_chain': [ |
||||
\ {'callback': 'ale#c#GetMakeCommand', 'output_stream': 'stdout'}, |
||||
\ {'callback': 'ale_linters#cpp#gcc#GetCommand'}, |
||||
\ ], |
||||
\ 'callback': 'ale#handlers#gcc#HandleGCCFormat', |
||||
\}) |
@ -0,0 +1,31 @@ |
||||
" Author: Jordan Andree <https://github.com/jordanandree>, David Alexander <opensource@thelonelyghost.com> |
||||
" Description: This file adds support for checking Crystal with crystal build |
||||
|
||||
function! ale_linters#crystal#crystal#Handle(buffer, lines) abort |
||||
let l:output = [] |
||||
|
||||
for l:error in ale#util#FuzzyJSONDecode(a:lines, []) |
||||
call add(l:output, { |
||||
\ 'lnum': l:error.line + 0, |
||||
\ 'col': l:error.column + 0, |
||||
\ 'text': l:error.message, |
||||
\}) |
||||
endfor |
||||
|
||||
return l:output |
||||
endfunction |
||||
|
||||
function! ale_linters#crystal#crystal#GetCommand(buffer) abort |
||||
return 'crystal build -f json --no-codegen --no-color -o ' |
||||
\ . ale#Escape(g:ale#util#nul_file) |
||||
\ . ' %s' |
||||
endfunction |
||||
|
||||
call ale#linter#Define('crystal', { |
||||
\ 'name': 'crystal', |
||||
\ 'executable': 'crystal', |
||||
\ 'output_stream': 'both', |
||||
\ 'lint_file': 1, |
||||
\ 'command_callback': 'ale_linters#crystal#crystal#GetCommand', |
||||
\ 'callback': 'ale_linters#crystal#crystal#Handle', |
||||
\}) |
@ -0,0 +1,33 @@ |
||||
let g:ale_cs_mcs_options = get(g:, 'ale_cs_mcs_options', '') |
||||
|
||||
function! ale_linters#cs#mcs#GetCommand(buffer) abort |
||||
return 'mcs -unsafe --parse ' . ale#Var(a:buffer, 'cs_mcs_options') . ' %t' |
||||
endfunction |
||||
|
||||
function! ale_linters#cs#mcs#Handle(buffer, lines) abort |
||||
" Look for lines like the following. |
||||
" |
||||
" Tests.cs(12,29): error CSXXXX: ; expected |
||||
let l:pattern = '^\v(.+\.cs)\((\d+),(\d+)\)\: ([^ ]+) ([^ ]+): (.+)$' |
||||
let l:output = [] |
||||
|
||||
for l:match in ale#util#GetMatches(a:lines, l:pattern) |
||||
call add(l:output, { |
||||
\ 'lnum': l:match[2] + 0, |
||||
\ 'col': l:match[3] + 0, |
||||
\ 'type': l:match[4] is# 'error' ? 'E' : 'W', |
||||
\ 'code': l:match[5], |
||||
\ 'text': l:match[6], |
||||
\}) |
||||
endfor |
||||
|
||||
return l:output |
||||
endfunction |
||||
|
||||
call ale#linter#Define('cs',{ |
||||
\ 'name': 'mcs', |
||||
\ 'output_stream': 'stderr', |
||||
\ 'executable': 'mcs', |
||||
\ 'command_callback': 'ale_linters#cs#mcs#GetCommand', |
||||
\ 'callback': 'ale_linters#cs#mcs#Handle', |
||||
\}) |
@ -0,0 +1,81 @@ |
||||
call ale#Set('cs_mcsc_options', '') |
||||
call ale#Set('cs_mcsc_source', '') |
||||
call ale#Set('cs_mcsc_assembly_path', []) |
||||
call ale#Set('cs_mcsc_assemblies', []) |
||||
|
||||
function! s:GetWorkingDirectory(buffer) abort |
||||
let l:working_directory = ale#Var(a:buffer, 'cs_mcsc_source') |
||||
|
||||
if !empty(l:working_directory) |
||||
return l:working_directory |
||||
endif |
||||
|
||||
return expand('#' . a:buffer . ':p:h') |
||||
endfunction |
||||
|
||||
function! ale_linters#cs#mcsc#GetCommand(buffer) abort |
||||
" Pass assembly paths via the -lib: parameter. |
||||
let l:path_list = ale#Var(a:buffer, 'cs_mcsc_assembly_path') |
||||
|
||||
let l:lib_option = !empty(l:path_list) |
||||
\ ? '-lib:' . join(map(copy(l:path_list), 'ale#Escape(v:val)'), ',') |
||||
\ : '' |
||||
|
||||
" Pass paths to DLL files via the -r: parameter. |
||||
let l:assembly_list = ale#Var(a:buffer, 'cs_mcsc_assemblies') |
||||
|
||||
let l:r_option = !empty(l:assembly_list) |
||||
\ ? '-r:' . join(map(copy(l:assembly_list), 'ale#Escape(v:val)'), ',') |
||||
\ : '' |
||||
|
||||
" register temporary module target file with ale |
||||
let l:out = tempname() |
||||
call ale#engine#ManageFile(a:buffer, l:out) |
||||
|
||||
" The code is compiled as a module and the output is redirected to a |
||||
" temporary file. |
||||
return ale#path#CdString(s:GetWorkingDirectory(a:buffer)) |
||||
\ . 'mcs -unsafe' |
||||
\ . ' ' . ale#Var(a:buffer, 'cs_mcsc_options') |
||||
\ . ' ' . l:lib_option |
||||
\ . ' ' . l:r_option |
||||
\ . ' -out:' . l:out |
||||
\ . ' -t:module' |
||||
\ . ' -recurse:' . ale#Escape('*.cs') |
||||
endfunction |
||||
|
||||
function! ale_linters#cs#mcsc#Handle(buffer, lines) abort |
||||
" Look for lines like the following. |
||||
" |
||||
" Tests.cs(12,29): error CSXXXX: ; expected |
||||
" |
||||
" NOTE: pattern also captures file name as linter compiles all |
||||
" files within the source tree rooted at the specified source |
||||
" path and not just the file loaded in the buffer |
||||
let l:pattern = '^\v(.+\.cs)\((\d+),(\d+)\)\: ([^ ]+) ([^ ]+): (.+)$' |
||||
let l:output = [] |
||||
|
||||
let l:dir = s:GetWorkingDirectory(a:buffer) |
||||
|
||||
for l:match in ale#util#GetMatches(a:lines, l:pattern) |
||||
call add(l:output, { |
||||
\ 'filename': ale#path#GetAbsPath(l:dir, l:match[1]), |
||||
\ 'lnum': l:match[2] + 0, |
||||
\ 'col': l:match[3] + 0, |
||||
\ 'type': l:match[4] is# 'error' ? 'E' : 'W', |
||||
\ 'code': l:match[5], |
||||
\ 'text': l:match[6], |
||||
\}) |
||||
endfor |
||||
|
||||
return l:output |
||||
endfunction |
||||
|
||||
call ale#linter#Define('cs',{ |
||||
\ 'name': 'mcsc', |
||||
\ 'output_stream': 'stderr', |
||||
\ 'executable': 'mcs', |
||||
\ 'command_callback': 'ale_linters#cs#mcsc#GetCommand', |
||||
\ 'callback': 'ale_linters#cs#mcsc#Handle', |
||||
\ 'lint_file': 1 |
||||
\}) |
@ -0,0 +1,18 @@ |
||||
" Author: w0rp <devw0rp@gmail.com> |
||||
" Description: This file adds support for checking CSS code with csslint. |
||||
|
||||
function! ale_linters#css#csslint#GetCommand(buffer) abort |
||||
let l:csslintrc = ale#path#FindNearestFile(a:buffer, '.csslintrc') |
||||
let l:config_option = !empty(l:csslintrc) |
||||
\ ? '--config=' . ale#Escape(l:csslintrc) |
||||
\ : '' |
||||
|
||||
return 'csslint --format=compact ' . l:config_option . ' %t' |
||||
endfunction |
||||
|
||||
call ale#linter#Define('css', { |
||||
\ 'name': 'csslint', |
||||
\ 'executable': 'csslint', |
||||
\ 'command_callback': 'ale_linters#css#csslint#GetCommand', |
||||
\ 'callback': 'ale#handlers#css#HandleCSSLintFormat', |
||||
\}) |
@ -0,0 +1,24 @@ |
||||
" Author: diartyz <diartyz@gmail.com> |
||||
|
||||
call ale#Set('css_stylelint_executable', 'stylelint') |
||||
call ale#Set('css_stylelint_options', '') |
||||
call ale#Set('css_stylelint_use_global', 0) |
||||
|
||||
function! ale_linters#css#stylelint#GetExecutable(buffer) abort |
||||
return ale#node#FindExecutable(a:buffer, 'css_stylelint', [ |
||||
\ 'node_modules/.bin/stylelint', |
||||
\]) |
||||
endfunction |
||||
|
||||
function! ale_linters#css#stylelint#GetCommand(buffer) abort |
||||
return ale_linters#css#stylelint#GetExecutable(a:buffer) |
||||
\ . ' ' . ale#Var(a:buffer, 'css_stylelint_options') |
||||
\ . ' --stdin-filename %s' |
||||
endfunction |
||||
|
||||
call ale#linter#Define('css', { |
||||
\ 'name': 'stylelint', |
||||
\ 'executable_callback': 'ale_linters#css#stylelint#GetExecutable', |
||||
\ 'command_callback': 'ale_linters#css#stylelint#GetCommand', |
||||
\ 'callback': 'ale#handlers#css#HandleStyleLintFormat', |
||||
\}) |
@ -0,0 +1,56 @@ |
||||
" Author: blahgeek <i@blahgeek.com> |
||||
" Description: NVCC linter for cuda files |
||||
|
||||
call ale#Set('cuda_nvcc_executable', 'nvcc') |
||||
call ale#Set('cuda_nvcc_options', '-std=c++11') |
||||
|
||||
function! ale_linters#cuda#nvcc#GetExecutable(buffer) abort |
||||
return ale#Var(a:buffer, 'cuda_nvcc_executable') |
||||
endfunction |
||||
|
||||
function! ale_linters#cuda#nvcc#GetCommand(buffer) abort |
||||
" Unused: use ale#util#nul_file |
||||
" let l:output_file = tempname() . '.ii' |
||||
" call ale#engine#ManageFile(a:buffer, l:output_file) |
||||
|
||||
return ale#Escape(ale_linters#cuda#nvcc#GetExecutable(a:buffer)) |
||||
\ . ' -cuda ' |
||||
\ . ale#c#IncludeOptions(ale#c#FindLocalHeaderPaths(a:buffer)) |
||||
\ . ale#Var(a:buffer, 'cuda_nvcc_options') . ' %s' |
||||
\ . ' -o ' . g:ale#util#nul_file |
||||
endfunction |
||||
|
||||
function! ale_linters#cuda#nvcc#HandleNVCCFormat(buffer, lines) abort |
||||
" Look for lines like the following. |
||||
" |
||||
" test.cu(8): error: argument of type "void *" is incompatible with parameter of type "int *" |
||||
let l:pattern = '\v^([^:\(\)]+):?\(?(\d+)\)?:(\d+)?:?\s*\w*\s*(error|warning): (.+)$' |
||||
let l:output = [] |
||||
|
||||
for l:match in ale#util#GetMatches(a:lines, l:pattern) |
||||
|
||||
let l:item = { |
||||
\ 'lnum': str2nr(l:match[2]), |
||||
\ 'type': l:match[4] =~# 'error' ? 'E' : 'W', |
||||
\ 'text': l:match[5], |
||||
\ 'filename': fnamemodify(l:match[1], ':p'), |
||||
\} |
||||
|
||||
if !empty(l:match[3]) |
||||
let l:item.col = str2nr(l:match[3]) |
||||
endif |
||||
|
||||
call add(l:output, l:item) |
||||
endfor |
||||
|
||||
return l:output |
||||
endfunction |
||||
|
||||
call ale#linter#Define('cuda', { |
||||
\ 'name': 'nvcc', |
||||
\ 'output_stream': 'stderr', |
||||
\ 'executable_callback': 'ale_linters#cuda#nvcc#GetExecutable', |
||||
\ 'command_callback': 'ale_linters#cuda#nvcc#GetCommand', |
||||
\ 'callback': 'ale_linters#cuda#nvcc#HandleNVCCFormat', |
||||
\ 'lint_file': 1, |
||||
\}) |
@ -0,0 +1,79 @@ |
||||
" Author: w0rp <devw0rp@gmail.com> |
||||
" Description: "dmd for D files" |
||||
|
||||
function! s:FindDUBConfig(buffer) abort |
||||
" Find a DUB configuration file in ancestor paths. |
||||
" The most DUB-specific names will be tried first. |
||||
for l:possible_filename in ['dub.sdl', 'dub.json', 'package.json'] |
||||
let l:dub_file = ale#path#FindNearestFile(a:buffer, l:possible_filename) |
||||
|
||||
if !empty(l:dub_file) |
||||
return l:dub_file |
||||
endif |
||||
endfor |
||||
|
||||
return '' |
||||
endfunction |
||||
|
||||
function! ale_linters#d#dmd#DUBCommand(buffer) abort |
||||
" If we can't run dub, then skip this command. |
||||
if !executable('dub') |
||||
" Returning an empty string skips to the DMD command. |
||||
return '' |
||||
endif |
||||
|
||||
let l:dub_file = s:FindDUBConfig(a:buffer) |
||||
|
||||
if empty(l:dub_file) |
||||
return '' |
||||
endif |
||||
|
||||
" To support older dub versions, we just change the directory to |
||||
" the directory where we found the dub config, and then run `dub describe` |
||||
" from that directory. |
||||
return 'cd ' . ale#Escape(fnamemodify(l:dub_file, ':h')) |
||||
\ . ' && dub describe --import-paths' |
||||
endfunction |
||||
|
||||
function! ale_linters#d#dmd#DMDCommand(buffer, dub_output) abort |
||||
let l:import_list = [] |
||||
|
||||
" Build a list of import paths generated from DUB, if available. |
||||
for l:line in a:dub_output |
||||
if !empty(l:line) |
||||
" The arguments must be '-Ifilename', not '-I filename' |
||||
call add(l:import_list, '-I' . ale#Escape(l:line)) |
||||
endif |
||||
endfor |
||||
|
||||
return 'dmd '. join(l:import_list) . ' -o- -vcolumns -c %t' |
||||
endfunction |
||||
|
||||
function! ale_linters#d#dmd#Handle(buffer, lines) abort |
||||
" Matches patterns lines like the following: |
||||
" /tmp/tmp.qclsa7qLP7/file.d(1): Error: function declaration without return type. (Note that constructors are always named 'this') |
||||
" /tmp/tmp.G1L5xIizvB.d(8,8): Error: module weak_reference is in file 'dstruct/weak_reference.d' which cannot be read |
||||
let l:pattern = '^[^(]\+(\([0-9]\+\)\,\?\([0-9]*\)): \([^:]\+\): \(.\+\)' |
||||
let l:output = [] |
||||
|
||||
for l:match in ale#util#GetMatches(a:lines, l:pattern) |
||||
call add(l:output, { |
||||
\ 'lnum': l:match[1], |
||||
\ 'col': l:match[2], |
||||
\ 'type': l:match[3] is# 'Warning' ? 'W' : 'E', |
||||
\ 'text': l:match[4], |
||||
\}) |
||||
endfor |
||||
|
||||
return l:output |
||||
endfunction |
||||
|
||||
call ale#linter#Define('d', { |
||||
\ 'name': 'dmd', |
||||
\ 'executable': 'dmd', |
||||
\ 'command_chain': [ |
||||
\ {'callback': 'ale_linters#d#dmd#DUBCommand', 'output_stream': 'stdout'}, |
||||
\ {'callback': 'ale_linters#d#dmd#DMDCommand', 'output_stream': 'stderr'}, |
||||
\ ], |
||||
\ 'callback': 'ale_linters#d#dmd#Handle', |
||||
\}) |
@ -0,0 +1,25 @@ |
||||
" Author: Taylor Blau <me@ttaylorr.com> |
||||
|
||||
function! ale_linters#dafny#dafny#Handle(buffer, lines) abort |
||||
let l:pattern = '\v(.*)\((\d+),(\d+)\): (.*): (.*)' |
||||
let l:output = [] |
||||
|
||||
for l:match in ale#util#GetMatches(a:lines, l:pattern) |
||||
call add(l:output, { |
||||
\ 'bufnr': a:buffer, |
||||
\ 'col': l:match[3] + 0, |
||||
\ 'lnum': l:match[2] + 0, |
||||
\ 'text': l:match[5], |
||||
\ 'type': l:match[4] =~# '^Error' ? 'E' : 'W' |
||||
\ }) |
||||
endfor |
||||
return l:output |
||||
endfunction |
||||
|
||||
call ale#linter#Define('dafny', { |
||||
\ 'name': 'dafny', |
||||
\ 'executable': 'dafny', |
||||
\ 'command': 'dafny %s /compile:0', |
||||
\ 'callback': 'ale_linters#dafny#dafny#Handle', |
||||
\ 'lint_file': 1, |
||||
\ }) |
@ -0,0 +1,41 @@ |
||||
" Author: w0rp <devw0rp@gmail.com> |
||||
" Description: Check Dart files with dartanalyzer |
||||
|
||||
call ale#Set('dart_dartanalyzer_executable', 'dartanalyzer') |
||||
|
||||
function! ale_linters#dart#dartanalyzer#GetExecutable(buffer) abort |
||||
return ale#Var(a:buffer, 'dart_dartanalyzer_executable') |
||||
endfunction |
||||
|
||||
function! ale_linters#dart#dartanalyzer#GetCommand(buffer) abort |
||||
let l:executable = ale_linters#dart#dartanalyzer#GetExecutable(a:buffer) |
||||
let l:path = ale#path#FindNearestFile(a:buffer, '.packages') |
||||
|
||||
return ale#Escape(l:executable) |
||||
\ . (!empty(l:path) ? ' --packages ' . ale#Escape(l:path) : '') |
||||
\ . ' %s' |
||||
endfunction |
||||
|
||||
function! ale_linters#dart#dartanalyzer#Handle(buffer, lines) abort |
||||
let l:pattern = '\v^ ([a-z]+) . (.+) at (.+):(\d+):(\d+) . (.+)$' |
||||
let l:output = [] |
||||
|
||||
for l:match in ale#util#GetMatches(a:lines, l:pattern) |
||||
call add(l:output, { |
||||
\ 'type': l:match[1] is# 'error' ? 'E' : 'W', |
||||
\ 'text': l:match[6] . ': ' . l:match[2], |
||||
\ 'lnum': str2nr(l:match[4]), |
||||
\ 'col': str2nr(l:match[5]), |
||||
\}) |
||||
endfor |
||||
|
||||
return l:output |
||||
endfunction |
||||
|
||||
call ale#linter#Define('dart', { |
||||
\ 'name': 'dartanalyzer', |
||||
\ 'executable_callback': 'ale_linters#dart#dartanalyzer#GetExecutable', |
||||
\ 'command_callback': 'ale_linters#dart#dartanalyzer#GetCommand', |
||||
\ 'callback': 'ale_linters#dart#dartanalyzer#Handle', |
||||
\ 'lint_file': 1, |
||||
\}) |
@ -0,0 +1,30 @@ |
||||
" Author: aurieh <me@aurieh.me> |
||||
" Description: A language server for dart |
||||
|
||||
call ale#Set('dart_language_server_executable', 'dart_language_server') |
||||
|
||||
function! ale_linters#dart#language_server#GetExecutable(buffer) abort |
||||
return ale#Var(a:buffer, 'dart_language_server_executable') |
||||
endfunction |
||||
|
||||
function! ale_linters#dart#language_server#GetLanguage(buffer) abort |
||||
return 'dart' |
||||
endfunction |
||||
|
||||
function! ale_linters#dart#language_server#GetProjectRoot(buffer) abort |
||||
" Note: pub only looks for pubspec.yaml, there's no point in adding |
||||
" support for pubspec.yml |
||||
let |