Remove vim bundles
							parent
							
								
									3751043294
								
							
						
					
					
						commit
						f62dfaf3d5
					
				| @ -1,12 +0,0 @@ | ||||
| .* export-ignore | ||||
| /CODE_OF_CONDUCT.md export-ignore | ||||
| /CONTRIBUTING.md export-ignore | ||||
| /Dockerfile export-ignore | ||||
| /ISSUE_TEMPLATE.md export-ignore | ||||
| /Makefile export-ignore | ||||
| /PULL_REQUEST_TEMPLATE.md export-ignore | ||||
| /README.md export-ignore | ||||
| /custom-checks export-ignore | ||||
| /img export-ignore | ||||
| /run-tests export-ignore | ||||
| /test export-ignore | ||||
| @ -1,5 +0,0 @@ | ||||
| /init.vim | ||||
| /doc/tags | ||||
| .* | ||||
| *.obj | ||||
| tags | ||||
| @ -1,7 +0,0 @@ | ||||
| --- | ||||
| sudo: required | ||||
| services: | ||||
|     - docker | ||||
| language: python | ||||
| script: | | ||||
|     ./run-tests | ||||
| @ -1,3 +0,0 @@ | ||||
| Codes of conduct are totally unnecessary and dumb. | ||||
| 
 | ||||
| Just don't be a jerk and have fun. | ||||
| @ -1,173 +0,0 @@ | ||||
| # Contributing to ALE | ||||
| 
 | ||||
| 1. [Guidelines](#guidelines) | ||||
| 2. [Creating Issues](#issues) | ||||
| 3. [Creating Pull Requests](#pull-requests) | ||||
|     1. [Adding a New Linter](#adding-a-new-linter) | ||||
|     2. [Adding New Options](#adding-new-options) | ||||
| 4. [Writing Documentation](#writing-documentation) | ||||
|     1. [Documenting New Linters](#documenting-new-linters) | ||||
|     2. [Editing the Online Documentation](#editing-online-documentation) | ||||
|     3. [Documenting Linter Options](#documenting-linter-options) | ||||
| 5. [In Case of Busses](#in-case-of-busses) | ||||
| 
 | ||||
| <a name="guidelines"></a> | ||||
| 
 | ||||
| ## 1. Guidelines | ||||
| 
 | ||||
| Have fun, and work on whatever floats your boat. Take It Easy :tm:. | ||||
| 
 | ||||
| Don't forget to **write documentation** for whatever it is you are doing. | ||||
| See the ["Writing Documentation"](#writing-documentation) section. | ||||
| 
 | ||||
| Remember to write Vader tests for most of the code you write. You can look at | ||||
| existing Vader tests in the `test` directory for examples. | ||||
| 
 | ||||
| When writing code, follow the [Google Vimscript Style | ||||
| Guide](https://google.github.io/styleguide/vimscriptguide.xml), and run `vint | ||||
| -s` on your files to check for most of what the guide mentions and more. If you | ||||
| install this plugin (ALE) and install [Vint](https://github.com/Kuniwak/vint), it | ||||
| will check your code while you type. | ||||
| 
 | ||||
| <a name="issues"></a> | ||||
| 
 | ||||
| ## 2. Creating Issues | ||||
| 
 | ||||
| Before creating any issues, please look through the current list of issues and | ||||
| pull requests, and ensure that the issue hasn't already been reported. If an | ||||
| issue has already been reported, but you have some new insight, please add | ||||
| a comment to the existing issue. | ||||
| 
 | ||||
| Please read the FAQ in the README before creating any issues. A feature | ||||
| you desire may already exist and be documented, or the FAQ might explain | ||||
| how to solve a problem you have already. | ||||
| 
 | ||||
| Please try and describe any issues reported with as much detail as you can | ||||
| provide about your Vim version, the linter you were trying to run, your | ||||
| operating system, or any other information you think might be helpful. | ||||
| 
 | ||||
| Please describe your issue in clear, grammatically correct, and easy to | ||||
| understand English. You are more likely to see an issue resolved if others | ||||
| can understand you. | ||||
| 
 | ||||
| <a name="pull-requests"></a> | ||||
| 
 | ||||
| ## 3. Creating Pull Requests | ||||
| 
 | ||||
| For code you write, make sure to credit yourself at the top of files you add, | ||||
| and probably those you modify. You can write some comments at the top of your | ||||
| VIM files. | ||||
| 
 | ||||
| ```vim | ||||
| " Author: John Smith <john.smith@gmail.com> | ||||
| " Description: This file adds support for awesomelinter for the best language ever. | ||||
| ``` | ||||
| 
 | ||||
| If you want to credit multiple authors, you can comma separate them. | ||||
| 
 | ||||
| ```vim | ||||
| " Author: John Smith <john.smith@gmail.com>, Jane Doe <https://jane-doe.info> | ||||
| ``` | ||||
| 
 | ||||
| <a name="adding-a-new-linter"></a> | ||||
| 
 | ||||
| ### 3.i. Adding a New Linter | ||||
| 
 | ||||
| If you add a new linter, look for existing handlers first in the | ||||
| [handlers](autoload/ale/handlers) directory. One of the handlers there may | ||||
| already be able to handle your lines of output. If you find that your new | ||||
| linter replicates an existing error handler, consider pulling it up into the | ||||
| [handlers](autoload/ale/handlers) directory, and use the generic handler in | ||||
| both places. | ||||
| 
 | ||||
| When you add a linter, make sure the language for the linter and the linter | ||||
| itself are present in the table in the [README.md](README.md) file and in the | ||||
| Vim [help file](doc/ale.txt). The programs and linters should be sorted | ||||
| alphabetically in the table and list. | ||||
| 
 | ||||
| <a name="adding-new-options"></a> | ||||
| 
 | ||||
| ### 3.ii. Adding New Options | ||||
| 
 | ||||
| If you add new options to the plugin, make sure to document those new options | ||||
| in the [README.md](README.md) file, and also in the [help file](doc/ale.txt). | ||||
| Follow the format of other options in each. Global options should appear in the | ||||
| README file, and in the relevant section in the help file. Options specific | ||||
| to a particular linter should appear in the section for that linter. | ||||
| 
 | ||||
| Linter options for customizing general argument lists should be named | ||||
| `g:ale_<filetype>_<linter>_options`, so that all linters can have similar | ||||
| global variable names. | ||||
| 
 | ||||
| Any options for linters should be set to some default value so it is always | ||||
| easy to see what the default is with `:echo g:ale...`. | ||||
| 
 | ||||
| <a name="writing-documentation"></a> | ||||
| 
 | ||||
| ## 4. Writing Documentation | ||||
| 
 | ||||
| If you are adding new linters, changing the API, adding new options, etc., you | ||||
| _must_ write some documentation describing it in the `doc/ale.txt` file.  New | ||||
| linters _must_ be added to the `README.md` file too, so other users can get a | ||||
| quick overview of the supported tools. | ||||
| 
 | ||||
| <a name="documenting-new-linters"></a> | ||||
| 
 | ||||
| ### 4.i Documenting New Linters | ||||
| 
 | ||||
| If you add a new linter to the project, edit the table in the `README.md` file, | ||||
| and edit the list of linters at the top of the `doc/ale.txt` file. The linters | ||||
| should be sorted vertically in lexicographic (alphabetical) order by the | ||||
| programming language name or filetype, and the tools for each language should | ||||
| be sorted in lexicographic order horizontally. Sorting in this manner is a fair | ||||
| manner of presenting all of the information in an easy to scan way, without | ||||
| giving some unfair preference to any particular tool or language. | ||||
| 
 | ||||
| <a name="editing-online-documentation"></a> | ||||
| 
 | ||||
| ### 4.ii Editing the Online Documentation | ||||
| 
 | ||||
| The "online documentation" file used for this project lives in `doc/ale.txt`. | ||||
| This is the file used for generating `:help` text inside Vim itself. There are | ||||
| some guidlines to follow for this file. | ||||
| 
 | ||||
| 1. Keep all text within a column size of 79 characters, inclusive. | ||||
| 2. Open a section with 79 `=` or `-` characters, for headings and subheadings. | ||||
| 3. Sections should have a _single_ blank line before or after. | ||||
| 4. Between descriptions of variables/functions/commands, use _two_ blank lines. | ||||
| 5. Up-indent the description of a variable/function/command by two spaces. | ||||
| 6. Place tags at the ends of lines, with the final characters on column 79. | ||||
|    All of the tags should line up perfectly on the same column as you scan | ||||
|    down through the document. | ||||
| 7. Keep the table of contents balanced so the longest tag link ends on column | ||||
|    79, and so all links line up perfectly on their first character, on the | ||||
|    left. | ||||
| 
 | ||||
| <a name="documenting-linter-options"></a> | ||||
| 
 | ||||
| ### 4.iii Documenting Linter Options | ||||
| 
 | ||||
| For documenting new linter options, please add a new sub-section under the | ||||
| "Linter Specific Options" section describing all of the global options added | ||||
| for each linter, and what the default values of the options are. All global | ||||
| options for linters should be set to some default value. This will allow users | ||||
| to look up the default value easily by typing `:echo g:ale_...`. | ||||
| 
 | ||||
| <a name="in-case-of-busses"></a> | ||||
| 
 | ||||
| ## 5. In Case of Busses | ||||
| 
 | ||||
| Should the principal author of the ALE project and all collaborators with the | ||||
| required access needed to properly administrate the project on GitHub or any | ||||
| other website either perish or disappear, whether by tragic traffic accident | ||||
| or government adduction, etc., action should be taken to ensure that the | ||||
| project continues. If no one is left to administer the project where it is | ||||
| hosted, please fork the project and nominate someone capable to administer it. | ||||
| Preferably, in such an event, a single fork of the project will replace the | ||||
| original, and life will go on, except the life of whoever vanished, because | ||||
| then they will probably be dead. | ||||
| 
 | ||||
| Should w0rp suddenly disappear, then he was probably killed in a traffic | ||||
| accident, or the government finally decided to kill him and make it look like | ||||
| suicide. In the latter event, please subvert said government and restore | ||||
| order to the universe, and ensure peace for mankind. | ||||
| @ -1,18 +0,0 @@ | ||||
| FROM tweekmonster/vim-testbed:latest | ||||
| 
 | ||||
| RUN install_vim -tag v8.0.0027 -build \ | ||||
|                 -tag neovim:v0.1.7 -build | ||||
| 
 | ||||
| ENV PACKAGES="\ | ||||
|     bash \ | ||||
|     git \ | ||||
|     python \ | ||||
|     py-pip \ | ||||
| " | ||||
| RUN apk --update add $PACKAGES && \ | ||||
|     rm -rf /var/cache/apk/* /tmp/* /var/tmp/* | ||||
| 
 | ||||
| RUN pip install vim-vint==0.3.9 | ||||
| 
 | ||||
| RUN git clone https://github.com/junegunn/vader.vim vader && \ | ||||
|     cd vader && git checkout c6243dd81c98350df4dec608fa972df98fa2a3af | ||||
| @ -1,8 +0,0 @@ | ||||
| <!-- | ||||
| For bugs, paste output from your clipboard after running :ALEInfoToClipboard | ||||
| here. If that doesn't work for some reason, try running :ALEInfo and copying | ||||
| the output from that here instead. If everything is broken, run around in | ||||
| circles and scream. | ||||
| 
 | ||||
| Whatever the case, describe the your issue here. | ||||
| --> | ||||
| @ -1,22 +0,0 @@ | ||||
| Copyright (c) 2016-2017, 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. | ||||
| @ -1,21 +0,0 @@ | ||||
| <!-- | ||||
| READ THIS: Before creating a pull request, please consider the following first. | ||||
| 
 | ||||
| * The most important thing you can do is write tests. Code without tests | ||||
|   probably doesn't work, and will almost certainly stop working later on. Pull | ||||
|   requests without tests probably won't be accepted, although there are some | ||||
|   exceptions. | ||||
| * Read the Contributing guide linked above first. | ||||
| * If you are adding a new linter, remember to update the README.md file and | ||||
|   doc/ale.txt first. | ||||
| * If you add or modify a function for converting error lines into loclist items | ||||
|   that ALE can work with, please add Vader tests for them. Look at existing | ||||
|   tests in the test/handler directory, etc. | ||||
| * If you add or modify a function for computing a command line string for | ||||
|   running a command, please add Vader tests for that. | ||||
| * Generally try and cover anything with Vader tests, although some things just | ||||
|   can't be tested with Vader, or at least they can be hard to test. Consider | ||||
|   breaking up your code so that some parts can be tested, and generally open up | ||||
|   a discussion about it. | ||||
| * Have fun! | ||||
| --> | ||||
| @ -1,559 +0,0 @@ | ||||
| # Asynchronous Lint Engine [](https://travis-ci.org/w0rp/ale) | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| ALE (Asynchronous Lint Engine) is a plugin for providing linting in NeoVim | ||||
| and Vim 8 while you edit your text files. | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| ALE makes use of NeoVim and Vim 8 job control functions and timers to | ||||
| run linters on the contents of text buffers and return errors as | ||||
| text is changed in Vim. This allows for displaying warnings and | ||||
| errors in files being edited in Vim before files have been saved | ||||
| back to a filesystem. | ||||
| 
 | ||||
| In other words, this plugin allows you to lint while you type. | ||||
| 
 | ||||
| In addition to linting support, ALE offers some support for fixing code with | ||||
| formatting tools, and completion via Language Server Protocol servers, or | ||||
| servers with similar enough protocols, like `tsserver`. | ||||
| 
 | ||||
| ## Table of Contents | ||||
| 
 | ||||
| 1. [Supported Languages and Tools](#supported-languages) | ||||
| 2. [Usage](#usage) | ||||
|     1. [Linting](#usage-linting) | ||||
|     2. [Fixing](#usage-fixing) | ||||
|     3. [Completion](#usage-completion) | ||||
| 3. [Installation](#installation) | ||||
|     1. [Installation with Vim package management](#standard-installation) | ||||
|     2. [Installation with Pathogen](#installation-with-pathogen) | ||||
|     3. [Installation with Vundle](#installation-with-vundle) | ||||
| 4. [Contributing](#contributing) | ||||
| 5. [FAQ](#faq) | ||||
|     1. [How do I disable particular linters?](#faq-disable-linters) | ||||
|     2. [How can I keep the sign gutter open?](#faq-keep-signs) | ||||
|     3. [How can I change the signs ALE uses?](#faq-change-signs) | ||||
|     4. [How can I show errors or warnings in my statusline?](#faq-statusline) | ||||
|     5. [How can I change the format for echo messages?](#faq-echo-format) | ||||
|     6. [How can I execute some code when ALE stops linting?](#faq-autocmd) | ||||
|     7. [How can I navigate between errors quickly?](#faq-navigation) | ||||
|     8. [How can I run linters only when I save files?](#faq-lint-on-save) | ||||
|     9. [How can I use the quickfix list instead of the loclist?](#faq-quickfix) | ||||
|     10. [How can I check JSX files with both stylelint and eslint?](#faq-jsx-stylelint-eslint) | ||||
|     11. [Will this plugin eat all of my laptop battery power?](#faq-my-battery-is-sad) | ||||
| 
 | ||||
| <a name="supported-languages"></a> | ||||
| 
 | ||||
| ## 1. Supported Languages and Tools | ||||
| 
 | ||||
| This plugin supports the following languages and tools. All available | ||||
| tools will be run in combination, so they can be complementary. | ||||
| 
 | ||||
| <!-- | ||||
| Keep the table rows sorted alphabetically by the language name, | ||||
| and the tools in the tools column sorted alphabetically by the tool | ||||
| name. That seems to be the fairest way to arrange this table. | ||||
| --> | ||||
| 
 | ||||
| | Language | Tools | | ||||
| | -------- | ----- | | ||||
| | ASM | [gcc](https://gcc.gnu.org) | | ||||
| | Ansible | [ansible-lint](https://github.com/willthames/ansible-lint) | | ||||
| | AsciiDoc | [proselint](http://proselint.com/)| | ||||
| | Awk | [gawk](https://www.gnu.org/software/gawk/)| | ||||
| | Bash | [-n flag](https://www.gnu.org/software/bash/manual/bash.html#index-set), [shellcheck](https://www.shellcheck.net/) | | ||||
| | Bourne Shell | [-n flag](http://linux.die.net/man/1/sh), [shellcheck](https://www.shellcheck.net/) | | ||||
| | C | [cppcheck](http://cppcheck.sourceforge.net), [gcc](https://gcc.gnu.org/), [clang](http://clang.llvm.org/), [clang-format](https://clang.llvm.org/docs/ClangFormat.html)| | ||||
| | C++ (filetype cpp) | [clang](http://clang.llvm.org/), [clangcheck](http://clang.llvm.org/docs/ClangCheck.html), [clangtidy](http://clang.llvm.org/extra/clang-tidy/), [cppcheck](http://cppcheck.sourceforge.net), [cpplint](https://github.com/google/styleguide/tree/gh-pages/cpplint), [gcc](https://gcc.gnu.org/), [clang-format](https://clang.llvm.org/docs/ClangFormat.html)| | ||||
| | C# | [mcs](http://www.mono-project.com/docs/about-mono/languages/csharp/) | | ||||
| | Chef | [foodcritic](http://www.foodcritic.io/) | | ||||
| | CMake | [cmakelint](https://github.com/richq/cmake-lint) | | ||||
| | CoffeeScript | [coffee](http://coffeescript.org/), [coffeelint](https://www.npmjs.com/package/coffeelint) | | ||||
| | Crystal | [crystal](https://crystal-lang.org/) | | ||||
| | CSS | [csslint](http://csslint.net/), [stylelint](https://github.com/stylelint/stylelint) | | ||||
| | Cython (pyrex filetype) | [cython](http://cython.org/) | | ||||
| | D | [dmd](https://dlang.org/dmd-linux.html) | | ||||
| | Dart | [dartanalyzer](https://github.com/dart-lang/sdk/tree/master/pkg/analyzer_cli) | | ||||
| | Dockerfile | [hadolint](https://github.com/lukasmartinelli/hadolint) | | ||||
| | Elixir | [credo](https://github.com/rrrene/credo), [dogma](https://github.com/lpil/dogma) | | ||||
| | Elm | [elm-make](https://github.com/elm-lang/elm-make) | | ||||
| | Erb | [erb](https://github.com/jeremyevans/erubi), [erubis](https://github.com/kwatch/erubis) | | ||||
| | Erlang | [erlc](http://erlang.org/doc/man/erlc.html), [SyntaxErl](https://github.com/ten0s/syntaxerl) | | ||||
| | Fortran | [gcc](https://gcc.gnu.org/) | | ||||
| | FusionScript | [fusion-lint](https://github.com/RyanSquared/fusionscript) | | ||||
| | Go | [gofmt -e](https://golang.org/cmd/gofmt/), [go vet](https://golang.org/cmd/vet/), [golint](https://godoc.org/github.com/golang/lint), [gometalinter](https://github.com/alecthomas/gometalinter), [go build](https://golang.org/cmd/go/), [gosimple](https://github.com/dominikh/go-tools/tree/master/cmd/gosimple), [staticcheck](https://github.com/dominikh/go-tools/tree/master/cmd/staticcheck) | | ||||
| | GraphQL | [gqlint](https://github.com/happylinks/gqlint) | | ||||
| | Haml | [haml-lint](https://github.com/brigade/haml-lint) | ||||
| | Handlebars | [ember-template-lint](https://github.com/rwjblue/ember-template-lint) | | ||||
| | Haskell | [ghc](https://www.haskell.org/ghc/), [stack-ghc](https://haskellstack.org/), [stack-build](https://haskellstack.org/), [ghc-mod](https://github.com/DanielG/ghc-mod), [stack-ghc-mod](https://github.com/DanielG/ghc-mod), [hlint](https://hackage.haskell.org/package/hlint), [hdevtools](https://hackage.haskell.org/package/hdevtools) | | ||||
| | HTML | [HTMLHint](http://htmlhint.com/), [proselint](http://proselint.com/), [tidy](http://www.html-tidy.org/) | | ||||
| | Idris | [idris](http://www.idris-lang.org/) | | ||||
| | Java | [checkstyle](http://checkstyle.sourceforge.net), [javac](http://www.oracle.com/technetwork/java/javase/downloads/index.html) | | ||||
| | JavaScript | [eslint](http://eslint.org/), [jscs](http://jscs.info/), [jshint](http://jshint.com/), [flow](https://flowtype.org/), [standard](http://standardjs.com/), [prettier](https://github.com/prettier/prettier) (and `prettier-eslint`, `prettier-standard`), [xo](https://github.com/sindresorhus/xo) | ||||
| | JSON | [jsonlint](http://zaa.ch/jsonlint/) | | ||||
| | Kotlin | [kotlinc](https://kotlinlang.org), [ktlint](https://ktlint.github.io) see `:help ale-integration-kotlin` for configuration instructions | ||||
| | LaTeX | [chktex](http://www.nongnu.org/chktex/), [lacheck](https://www.ctan.org/pkg/lacheck), [proselint](http://proselint.com/) | | ||||
| | Lua | [luacheck](https://github.com/mpeterv/luacheck) | | ||||
| | Markdown | [mdl](https://github.com/mivok/markdownlint), [proselint](http://proselint.com/), [vale](https://github.com/ValeLint/vale) | | ||||
| | MATLAB | [mlint](https://www.mathworks.com/help/matlab/ref/mlint.html) | | ||||
| | Nim | [nim](https://nim-lang.org/docs/nimc.html) | | ||||
| | nix | [nix-instantiate](http://nixos.org/nix/manual/#sec-nix-instantiate) | | ||||
| | nroff | [proselint](http://proselint.com/)| | ||||
| | Objective-C | [clang](http://clang.llvm.org/) | | ||||
| | Objective-C++ | [clang](http://clang.llvm.org/) | | ||||
| | OCaml | [merlin](https://github.com/the-lambda-church/merlin) see `:help ale-integration-ocaml-merlin` for configuration instructions | ||||
| | Perl | [perl -c](https://perl.org/), [perl-critic](https://metacpan.org/pod/Perl::Critic) | | ||||
| | PHP | [hack](http://hacklang.org/), [langserver](https://github.com/felixfbecker/php-language-server), [php -l](https://secure.php.net/), [phpcs](https://github.com/squizlabs/PHP_CodeSniffer), [phpmd](https://phpmd.org), [phpstan](https://github.com/phpstan/phpstan), [phpcbf](https://github.com/squizlabs/PHP_CodeSniffer) | | ||||
| | Pod | [proselint](http://proselint.com/)| | ||||
| | Pug | [pug-lint](https://github.com/pugjs/pug-lint) | | ||||
| | Puppet | [puppet](https://puppet.com), [puppet-lint](https://puppet-lint.com) | | ||||
| | Python | [autopep8](https://github.com/hhatto/autopep8), [flake8](http://flake8.pycqa.org/en/latest/), [isort](https://github.com/timothycrosley/isort), [mypy](http://mypy-lang.org/), [pycodestyle](https://github.com/PyCQA/pycodestyle), [pylint](https://www.pylint.org/), [yapf](https://github.com/google/yapf) | | ||||
| | R | [lintr](https://github.com/jimhester/lintr) | | ||||
| | ReasonML | [merlin](https://github.com/the-lambda-church/merlin) see `:help ale-integration-reason-merlin` for configuration instructions | ||||
| | reStructuredText | [proselint](http://proselint.com/)| | ||||
| | RPM spec | [rpmlint](https://github.com/rpm-software-management/rpmlint) (disabled by default; see `:help ale-integration-spec`) | | ||||
| | Ruby | [brakeman](http://brakemanscanner.org/), [rails_best_practices](https://github.com/flyerhzm/rails_best_practices), [reek](https://github.com/troessner/reek), [rubocop](https://github.com/bbatsov/rubocop), [ruby](https://www.ruby-lang.org) | | ||||
| | Rust |  cargo (see `:help ale-integration-rust` for configuration instructions), [rls](https://github.com/rust-lang-nursery/rls), [rustc](https://www.rust-lang.org/) | | ||||
| | SASS | [sass-lint](https://www.npmjs.com/package/sass-lint), [stylelint](https://github.com/stylelint/stylelint) | | ||||
| | SCSS | [sass-lint](https://www.npmjs.com/package/sass-lint), [scss-lint](https://github.com/brigade/scss-lint), [stylelint](https://github.com/stylelint/stylelint) | | ||||
| | Scala | [scalac](http://scala-lang.org), [scalastyle](http://www.scalastyle.org) | | ||||
| | Slim | [slim-lint](https://github.com/sds/slim-lint) | ||||
| | SML | [smlnj](http://www.smlnj.org/) | | ||||
| | Stylus | [stylelint](https://github.com/stylelint/stylelint) | | ||||
| | SQL | [sqlint](https://github.com/purcell/sqlint) | | ||||
| | Swift | [swiftlint](https://github.com/realm/SwiftLint), [swiftformat](https://github.com/nicklockwood/SwiftFormat) | | ||||
| | Tcl | [nagelfar](http://nagelfar.sourceforge.net)| | ||||
| | Texinfo | [proselint](http://proselint.com/)| | ||||
| | Text^ | [proselint](http://proselint.com/), [vale](https://github.com/ValeLint/vale) | | ||||
| | TypeScript | [eslint](http://eslint.org/), [tslint](https://github.com/palantir/tslint), tsserver, typecheck | | ||||
| | Verilog | [iverilog](https://github.com/steveicarus/iverilog), [verilator](http://www.veripool.org/projects/verilator/wiki/Intro) | | ||||
| | Vim | [vint](https://github.com/Kuniwak/vint) | | ||||
| | Vim help^ | [proselint](http://proselint.com/)| | ||||
| | XHTML | [proselint](http://proselint.com/)| | ||||
| | XML | [xmllint](http://xmlsoft.org/xmllint.html/)| | ||||
| | YAML | [swaglint](https://github.com/byCedric/swaglint), [yamllint](https://yamllint.readthedocs.io/) | | ||||
| 
 | ||||
| * *^ No linters for text or Vim help filetypes are enabled by default.* | ||||
| 
 | ||||
| <a name="usage"></a> | ||||
| 
 | ||||
| ## 2. Usage | ||||
| 
 | ||||
| <a name="usage-linting"></a> | ||||
| 
 | ||||
| ### 2.i Linting | ||||
| 
 | ||||
| Once this plugin is installed, while editing your files in supported | ||||
| languages and tools which have been correctly installed, | ||||
| this plugin will send the contents of your text buffers to a variety of | ||||
| programs for checking the syntax and semantics of your programs. By default, | ||||
| linters will be re-run in the background to check your syntax when you open | ||||
| new buffers or as you make edits to your files. | ||||
| 
 | ||||
| The behaviour of linting can be configured with a variety of options, | ||||
| documented in [the Vim help file](doc/ale.txt). For more information on the | ||||
| options ALE offers, consult `:help ale-options` for global options and `:help | ||||
| ale-linter-options` for options specified to particular linters. | ||||
| 
 | ||||
| <a name="usage-fixing"></a> | ||||
| 
 | ||||
| ### 2.ii Fixing | ||||
| 
 | ||||
| ALE can fix files with the `ALEFix` command. Functions need to be configured | ||||
| for different filetypes with the `g:ale_fixers` variable. For example, the | ||||
| following code can be used to fix JavaScript code with ESLint: | ||||
| 
 | ||||
| ```vim | ||||
| " Put this in vimrc or a plugin file of your own. | ||||
| " After this is configured, :ALEFix will try and fix your JS code with ESLint. | ||||
| let g:ale_fixers = { | ||||
| \   'javascript': ['eslint'], | ||||
| \} | ||||
| 
 | ||||
| " Set this setting in vimrc if you want to fix files automatically on save. | ||||
| " This is off by default. | ||||
| let g:ale_fix_on_save = 1 | ||||
| ``` | ||||
| 
 | ||||
| The `:ALEFixSuggest` command will suggest some supported tools for fixing code, | ||||
| but fixers can be also implemented with functions, including lambda functions | ||||
| too. See `:help ale-fix` for detailed information. | ||||
| 
 | ||||
| <a name="usage-completion"></a> | ||||
| 
 | ||||
| ### 2.iii Completion | ||||
| 
 | ||||
| ALE offers some support for completion via hijacking of omnicompletion while you | ||||
| type. All of ALE's completion information must come from Language Server | ||||
| Protocol linters, or similar protocols. At the moment, completion is only | ||||
| supported for TypeScript code with `tsserver`, when `tsserver` is enabled. You | ||||
| can enable completion like so: | ||||
| 
 | ||||
| ```vim | ||||
| " Enable completion where available. | ||||
| let g:ale_completion_enabled = 1 | ||||
| ``` | ||||
| 
 | ||||
| See `:help ale-completion` for more information. | ||||
| 
 | ||||
| <a name="installation"></a> | ||||
| 
 | ||||
| ## 3. Installation | ||||
| 
 | ||||
| To install this plugin, you should use one of the following methods. | ||||
| For Windows users, replace usage of the Unix `~/.vim` directory with | ||||
| `%USERPROFILE%\vimfiles`, or another directory if you have configured | ||||
| Vim differently. On Windows, your `~/.vimrc` file will be similarly | ||||
| stored in `%USERPROFILE%\_vimrc`. | ||||
| 
 | ||||
| <a name="standard-installation"></a> | ||||
| 
 | ||||
| ### 3.i. Installation with Vim package management | ||||
| 
 | ||||
| In Vim 8 and NeoVim, you can install plugins easily without needing to use | ||||
| any other tools. Simply clone the plugin into your `pack` directory. | ||||
| 
 | ||||
| #### Vim 8 on Unix | ||||
| 
 | ||||
| ```bash | ||||
| mkdir -p ~/.vim/pack/git-plugins/start | ||||
| git clone https://github.com/w0rp/ale.git ~/.vim/pack/git-plugins/start/ale | ||||
| ``` | ||||
| 
 | ||||
| #### NeoVim on Unix | ||||
| 
 | ||||
| ```bash | ||||
| mkdir -p ~/.local/share/nvim/site/pack/git-plugins/start | ||||
| git clone https://github.com/w0rp/ale.git ~/.local/share/nvim/site/pack/git-plugins/start/ale | ||||
| ``` | ||||
| 
 | ||||
| #### Vim 8 on Windows | ||||
| 
 | ||||
| ```bash | ||||
| # Run these commands in the "Git for Windows" Bash terminal | ||||
| mkdir -p ~/vimfiles/pack/git-plugins/start | ||||
| git clone https://github.com/w0rp/ale.git ~/vimfiles/pack/git-plugins/start/ale | ||||
| ``` | ||||
| 
 | ||||
| #### Generating Vim help files | ||||
| 
 | ||||
| You can add the following line to your vimrc files to generate documentation | ||||
| tags automatically, if you don't have something similar already, so you can use | ||||
| the `:help` command to consult ALE's online documentation: | ||||
| 
 | ||||
| ```vim | ||||
| " Put these lines at the very end of your vimrc file. | ||||
| 
 | ||||
| " Load all plugins now. | ||||
| " Plugins need to be added to runtimepath before helptags can be generated. | ||||
| packloadall | ||||
| " Load all of the helptags now, after plugins have been loaded. | ||||
| " All messages and errors will be ignored. | ||||
| silent! helptags ALL | ||||
| ``` | ||||
| 
 | ||||
| <a name="installation-with-pathogen"></a> | ||||
| 
 | ||||
| ### 3.ii. Installation with Pathogen | ||||
| 
 | ||||
| To install this module with [Pathogen](https://github.com/tpope/vim-pathogen), | ||||
| you should clone this repository to your bundle directory, and ensure | ||||
| you have the line `execute pathogen#infect()` in your `~/.vimrc` file. | ||||
| You can run the following commands in your terminal to do so: | ||||
| 
 | ||||
| ```bash | ||||
| cd ~/.vim/bundle | ||||
| git clone https://github.com/w0rp/ale.git | ||||
| ``` | ||||
| 
 | ||||
| <a name="installation-with-vundle"></a> | ||||
| 
 | ||||
| ### 3.iii. Installation with Vundle | ||||
| 
 | ||||
| You can install this plugin using [Vundle](https://github.com/VundleVim/Vundle.vim) | ||||
| by using the path on GitHub for this repository. | ||||
| 
 | ||||
| ```vim | ||||
| Plugin 'w0rp/ale' | ||||
| ``` | ||||
| 
 | ||||
| See the Vundle documentation for more information. | ||||
| 
 | ||||
| <a name="contributing"></a> | ||||
| 
 | ||||
| ## 4. Contributing | ||||
| 
 | ||||
| If you would like to see support for more languages and tools, please | ||||
| [create an issue](https://github.com/w0rp/ale/issues) | ||||
| or [create a pull request](https://github.com/w0rp/ale/pulls). | ||||
| If your tool can read from stdin or you have code to suggest which is good, | ||||
| support can be happily added for it. | ||||
| 
 | ||||
| If you are interested in the general direction of the project, check out the | ||||
| [wiki home page](https://github.com/w0rp/ale/wiki). The wiki includes a | ||||
| Roadmap for the future, and more. | ||||
| 
 | ||||
| If you'd liked to discuss the project more directly, check out the `#vim-ale` channel | ||||
| on Freenode. Web chat is available [here](https://webchat.freenode.net/?channels=vim-ale). | ||||
| 
 | ||||
| <a name="faq"></a> | ||||
| 
 | ||||
| ## 5. FAQ | ||||
| 
 | ||||
| <a name="faq-disable-linters"></a> | ||||
| 
 | ||||
| ### 5.i. How do I disable particular linters? | ||||
| 
 | ||||
| By default, all available tools for all supported languages will be run. | ||||
| If you want to only select a subset of the tools, simply create a | ||||
| `g:ale_linters` dictionary in your vimrc file mapping filetypes | ||||
| to lists of linters to run. | ||||
| 
 | ||||
| ```vim | ||||
| let g:ale_linters = { | ||||
| \   'javascript': ['eslint'], | ||||
| \} | ||||
| ``` | ||||
| 
 | ||||
| For all languages unspecified in the dictionary, all possible linters will | ||||
| be run for those languages, just as when the dictionary is not defined. | ||||
| Running many linters should not typically obstruct editing in Vim, | ||||
| as they will all be executed in separate processes simultaneously. | ||||
| 
 | ||||
| This plugin will look for linters in the [`ale_linters`](ale_linters) directory. | ||||
| Each directory within corresponds to a particular filetype in Vim, and each file | ||||
| in each directory corresponds to the name of a particular linter. | ||||
| 
 | ||||
| <a name="faq-keep-signs"></a> | ||||
| 
 | ||||
| ### 5.ii. How can I keep the sign gutter open? | ||||
| 
 | ||||
| You can keep the sign gutter open at all times by setting the | ||||
| `g:ale_sign_column_always` to 1 | ||||
| 
 | ||||
| ```vim | ||||
| let g:ale_sign_column_always = 1 | ||||
| ``` | ||||
| 
 | ||||
| <a name="faq-change-signs"></a> | ||||
| 
 | ||||
| ### 5.iii. How can I change the signs ALE uses? | ||||
| 
 | ||||
| Use these options to specify what text should be used for signs: | ||||
| 
 | ||||
| ```vim | ||||
| let g:ale_sign_error = '>>' | ||||
| let g:ale_sign_warning = '--' | ||||
| ``` | ||||
| 
 | ||||
| ALE sets some background colors automatically for warnings and errors | ||||
| in the sign gutter, with the names `ALEErrorSign` and `ALEWarningSign`. | ||||
| These colors can be customised, or even removed completely: | ||||
| 
 | ||||
| ```vim | ||||
| highlight clear ALEErrorSign | ||||
| highlight clear ALEWarningSign | ||||
| ``` | ||||
| 
 | ||||
| <a name="faq-statusline"></a> | ||||
| 
 | ||||
| ### 5.iv. How can I show errors or warnings in my statusline? | ||||
| 
 | ||||
| [vim-airline](https://github.com/vim-airline/vim-airline) integrates with ALE | ||||
| for displaying error information in the status bar. If you want to see the | ||||
| status for ALE in a nice format, it is recommended to use vim-airline with ALE. | ||||
| The airline extension can be enabled by adding the following to your vimrc: | ||||
| 
 | ||||
| ```vim | ||||
| " Set this. Airline will handle the rest. | ||||
| let g:airline#extensions#ale#enabled = 1 | ||||
| ``` | ||||
| 
 | ||||
| If you don't want to use vim-airline, you can implement your own statusline | ||||
| function without adding any other plugins. ALE provides a function for counting | ||||
| the number of problems for this purpose, named `ale#statusline#Count`. | ||||
| 
 | ||||
| Say you want to display all errors as one figure, and all non-errors as another | ||||
| figure. You can do the following: | ||||
| 
 | ||||
| ```vim | ||||
| function! LinterStatus() abort | ||||
|     let l:counts = ale#statusline#Count(bufnr('')) | ||||
| 
 | ||||
|     let l:all_errors = l:counts.error + l:counts.style_error | ||||
|     let l:all_non_errors = l:counts.total - l:all_errors | ||||
| 
 | ||||
|     return l:counts.total == 0 ? 'OK' : printf( | ||||
|     \   '%dW %dE', | ||||
|     \   all_non_errors, | ||||
|     \   all_errors | ||||
|     \) | ||||
| endfunction | ||||
| 
 | ||||
| set statusline=%{LinterStatus()} | ||||
| ``` | ||||
| 
 | ||||
| See `:help ale#statusline#Count()` for more information. | ||||
| 
 | ||||
| <a name="faq-echo-format"></a> | ||||
| 
 | ||||
| ### 5.v. How can I change the format for echo messages? | ||||
| 
 | ||||
| There are 3 global options that allow customizing the echoed message. | ||||
| 
 | ||||
| - `g:ale_echo_msg_format` where: | ||||
|     * `%s` is the error message itself | ||||
|     * `%linter%` is the linter name | ||||
|     * `%severity` is the severity type | ||||
| - `g:ale_echo_msg_error_str` is the string used for error severity. | ||||
| - `g:ale_echo_msg_warning_str` is the string used for warning severity. | ||||
| 
 | ||||
| So for example this: | ||||
| 
 | ||||
| ```vim | ||||
| let g:ale_echo_msg_error_str = 'E' | ||||
| let g:ale_echo_msg_warning_str = 'W' | ||||
| let g:ale_echo_msg_format = '[%linter%] %s [%severity%]' | ||||
| ``` | ||||
| 
 | ||||
| Will give you: | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| <a name="faq-autocmd"></a> | ||||
| 
 | ||||
| ### 5.vi. How can I execute some code when ALE stops linting? | ||||
| 
 | ||||
| ALE runs its own [autocmd](http://vimdoc.sourceforge.net/htmldoc/autocmd.html) | ||||
| event whenever has a linter has been successfully executed and processed. This | ||||
| autocmd event can be used to call arbitrary functions after ALE stops linting. | ||||
| 
 | ||||
| ```vim | ||||
| augroup YourGroup | ||||
|     autocmd! | ||||
|     autocmd User ALELint call YourFunction() | ||||
| augroup END | ||||
| ``` | ||||
| 
 | ||||
| <a name="faq-navigation"></a> | ||||
| 
 | ||||
| ### 5.vii. How can I navigate between errors quickly? | ||||
| 
 | ||||
| ALE offers some commands with `<Plug>` keybinds for moving between warnings and | ||||
| errors quickly. You can map the keys Ctrl+j and Ctrl+k to moving between errors | ||||
| for example: | ||||
| 
 | ||||
| ```vim | ||||
| nmap <silent> <C-k> <Plug>(ale_previous_wrap) | ||||
| nmap <silent> <C-j> <Plug>(ale_next_wrap) | ||||
| ``` | ||||
| 
 | ||||
| For more information, consult the online documentation with | ||||
| `:help ale-navigation-commands`. | ||||
| 
 | ||||
| <a name="faq-lint-on-save"></a> | ||||
| 
 | ||||
| ### 5.viii. How can I run linters only when I save files? | ||||
| 
 | ||||
| ALE offers an option `g:ale_lint_on_save` for enabling running the linters | ||||
| when files are saved. This option is enabled by default. If you only | ||||
| wish to run linters when files are saved, you can turn the other | ||||
| options off. | ||||
| 
 | ||||
| ```vim | ||||
| " Write this in your vimrc file | ||||
| let g:ale_lint_on_text_changed = 'never' | ||||
| " You can disable this option too | ||||
| " if you don't want linters to run on opening a file | ||||
| let g:ale_lint_on_enter = 0 | ||||
| ``` | ||||
| 
 | ||||
| If for whatever reason you don't wish to run linters again when you save | ||||
| files, you can set `g:ale_lint_on_save` to `0`. | ||||
| 
 | ||||
| <a name="faq-quickfix"></a> | ||||
| 
 | ||||
| ### 5.ix. How can I use the quickfix list instead of the loclist? | ||||
| 
 | ||||
| The quickfix list can be enabled by turning the `g:ale_set_quickfix` | ||||
| option on. If you wish to also disable the loclist, you can disable | ||||
| the `g:ale_set_loclist` option. | ||||
| 
 | ||||
| ```vim | ||||
| " Write this in your vimrc file | ||||
| let g:ale_set_loclist = 0 | ||||
| let g:ale_set_quickfix = 1 | ||||
| ``` | ||||
| 
 | ||||
| If you wish to show Vim windows for the loclist or quickfix items | ||||
| when a file contains warnings or errors, `g:ale_open_list` can be | ||||
| set to `1`. `g:ale_keep_list_window_open` can be set to `1` | ||||
| if you wish to keep the window open even after errors disappear. | ||||
| 
 | ||||
| ```vim | ||||
| let g:ale_open_list = 1 | ||||
| " Set this if you want to. | ||||
| " This can be useful if you are combining ALE with | ||||
| " some other plugin which sets quickfix errors, etc. | ||||
| let g:ale_keep_list_window_open = 1 | ||||
| ``` | ||||
| 
 | ||||
| <a name="faq-jsx-stylelint-eslint"></a> | ||||
| 
 | ||||
| ### 5.x. How can I check JSX files with both stylelint and eslint? | ||||
| 
 | ||||
| If you configure ALE options correctly in your vimrc file, and install | ||||
| the right tools, you can check JSX files with stylelint and eslint. | ||||
| 
 | ||||
| First, install eslint and install stylelint with | ||||
| [stylelint-processor-styled-components](https://github.com/styled-components/stylelint-processor-styled-components). | ||||
| 
 | ||||
| Supposing you have installed both tools correctly, configure your .jsx files so | ||||
| `jsx` is included in the filetype. You can use an `autocmd` for this. | ||||
| 
 | ||||
| ```vim | ||||
| augroup FiletypeGroup | ||||
|     autocmd! | ||||
|     au BufNewFile,BufRead *.jsx set filetype=javascript.jsx | ||||
| augroup END | ||||
| ``` | ||||
| 
 | ||||
| Supposing the filetype has been set correctly, you can set the following | ||||
| options in your vimrc file: | ||||
| 
 | ||||
| ```vim | ||||
| let g:ale_linters = {'jsx': ['stylelint', 'eslint']} | ||||
| let g:ale_linter_aliases = {'jsx': 'css'} | ||||
| ``` | ||||
| 
 | ||||
| ALE will alias the `jsx` filetype so it uses the `css` filetype linters, and | ||||
| use the original Array of selected linters for `jsx` from the `g:ale_linters` | ||||
| object. All available linters will be used for the filetype `javascript`, and | ||||
| no linter will be run twice for the same file. | ||||
| 
 | ||||
| <a name="faq-my-battery-is-sad"></a> | ||||
| 
 | ||||
| ### 5.xi. Will this plugin eat all of my laptop battery power? | ||||
| 
 | ||||
| ALE takes advantage of the power of various tools to check your code. This of | ||||
| course means that CPU time will be used to continuously check your code. If you | ||||
| are concerned about the CPU time ALE will spend, which will of course imply | ||||
| some cost to battery life, you can adjust your settings to make your CPU do | ||||
| less work. | ||||
| 
 | ||||
| First, consider increasing the delay before which ALE will run any linters | ||||
| while you type. ALE uses a timeout which is cancelled and reset every time you | ||||
| type, and this delay can be increased so linters are run less often. See | ||||
| `:help g:ale_lint_delay` for more information. | ||||
| 
 | ||||
| If you don't wish to run linters while you type, you can disable that | ||||
| behaviour. Set `g:ale_lint_on_text_changed` to `never` or `normal`. You won't | ||||
| get as frequent error checking, but ALE shouldn't block your ability to edit a | ||||
| document after you save a file, so the asynchronous nature of the plugin will | ||||
| still be an advantage. | ||||
| 
 | ||||
| If you are still concerned, you can turn the automatic linting off altogether, | ||||
| including the option `g:ale_lint_on_enter`, and you can run ALE manually with | ||||
| `:ALELint`. | ||||
| @ -1,37 +0,0 @@ | ||||
| " 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 | ||||
| @ -1,48 +0,0 @@ | ||||
| " 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# 'EANSIBLE002' | ||||
|         \&& !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:code . ': ' . l:match[5], | ||||
|             \   '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', | ||||
| \}) | ||||
| @ -1,9 +0,0 @@ | ||||
| " 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', | ||||
| \}) | ||||
| @ -1,33 +0,0 @@ | ||||
| " Author: Lucas Kolstad <lkolstad@uw.edu> | ||||
| " Description: gcc linter for asm files | ||||
| 
 | ||||
| let g:ale_asm_gcc_options = get(g:, 'ale_asm_gcc_options', '-Wall') | ||||
| 
 | ||||
| function! ale_linters#asm#gcc#GetCommand(buffer) abort | ||||
|     return 'gcc -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': 'gcc', | ||||
| \    'command_callback': 'ale_linters#asm#gcc#GetCommand', | ||||
| \    'callback': 'ale_linters#asm#gcc#Handle', | ||||
| \}) | ||||
| @ -1,26 +0,0 @@ | ||||
| " 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 | ||||
|     return ale_linters#awk#gawk#GetExecutable(a:buffer) | ||||
|     \   . ' ' . 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#cpplint#HandleCppLintFormat', | ||||
| \   'output_stream': 'both' | ||||
| \}) | ||||
| @ -1,29 +0,0 @@ | ||||
| " 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) abort | ||||
|     let l:paths = ale#c#FindLocalHeaderPaths(a:buffer) | ||||
| 
 | ||||
|     " -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')) . ' ' | ||||
|     \   . ale#c#IncludeOptions(l:paths) | ||||
|     \   . 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_callback': 'ale_linters#c#clang#GetCommand', | ||||
| \   'callback': 'ale#handlers#gcc#HandleGCCFormat', | ||||
| \}) | ||||
| @ -1,39 +0,0 @@ | ||||
| " 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', | ||||
| \}) | ||||
| @ -1,29 +0,0 @@ | ||||
| " 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) abort | ||||
|     let l:paths = ale#c#FindLocalHeaderPaths(a:buffer) | ||||
| 
 | ||||
|     " -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')) . ' ' | ||||
|     \   . ale#c#IncludeOptions(l:paths) | ||||
|     \   . 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_callback': 'ale_linters#c#gcc#GetCommand', | ||||
| \   'callback': 'ale#handlers#gcc#HandleGCCFormat', | ||||
| \}) | ||||
| @ -1,42 +0,0 @@ | ||||
| " Author: Edward Larkey <edwlarkey@mac.com> | ||||
| " Author: Jose Junior <jose.junior@gmail.com> | ||||
| " Description: This file adds the foodcritic linter for Chef files. | ||||
| 
 | ||||
| " Support options! | ||||
| let g:ale_chef_foodcritic_options = get(g:, 'ale_chef_foodcritic_options', '') | ||||
| let g:ale_chef_foodcritic_executable = get(g:, 'ale_chef_foodcritic_executable', 'foodcritic') | ||||
| 
 | ||||
| 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 = '^\(.\+:\s.\+\):\s\(.\+\):\(\d\+\)$' | ||||
|     let l:output = [] | ||||
| 
 | ||||
|     for l:match in ale#util#GetMatches(a:lines, l:pattern) | ||||
|         let l:text = l:match[1] | ||||
| 
 | ||||
|         call add(l:output, { | ||||
|         \   'lnum': l:match[3] + 0, | ||||
|         \   'text': l:text, | ||||
|         \   'type': 'W', | ||||
|         \}) | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#chef#foodcritic#GetCommand(buffer) abort | ||||
|     return printf('%s %s %%t', | ||||
|     \   ale#Var(a:buffer, 'chef_foodcritic_executable'), | ||||
|     \   escape(ale#Var(a:buffer, 'chef_foodcritic_options'), '~') | ||||
|     \) | ||||
| endfunction | ||||
| 
 | ||||
| 
 | ||||
| call ale#linter#Define('chef', { | ||||
| \   'name': 'foodcritic', | ||||
| \   'executable': 'foodcritic', | ||||
| \   'command_callback': 'ale_linters#chef#foodcritic#GetCommand', | ||||
| \   'callback': 'ale_linters#chef#foodcritic#Handle', | ||||
| \}) | ||||
| @ -1,24 +0,0 @@ | ||||
| " 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', | ||||
| \}) | ||||
| @ -1,23 +0,0 @@ | ||||
| " 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', | ||||
| \}) | ||||
| @ -1,43 +0,0 @@ | ||||
| " 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', | ||||
| \}) | ||||
| @ -1,29 +0,0 @@ | ||||
| " 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) abort | ||||
|     let l:paths = ale#c#FindLocalHeaderPaths(a:buffer) | ||||
| 
 | ||||
|     " -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')) . ' ' | ||||
|     \   . ale#c#IncludeOptions(l:paths) | ||||
|     \   . 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_callback': 'ale_linters#cpp#clang#GetCommand', | ||||
| \   'callback': 'ale#handlers#gcc#HandleGCCFormat', | ||||
| \}) | ||||
| @ -1,39 +0,0 @@ | ||||
| " 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:user_options) ? ' ' . l:user_options : '') | ||||
|     \   . (!empty(l:build_dir) ? ' -p ' . ale#Escape(l:build_dir) : '') | ||||
|     \   . (empty(l:build_dir) ? ' -extra-arg -Xanalyzer -extra-arg -analyzer-output=text' : '') | ||||
| 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, | ||||
| \}) | ||||
| @ -1,58 +0,0 @@ | ||||
| " 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, | ||||
| \}) | ||||
| @ -1,39 +0,0 @@ | ||||
| " 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', | ||||
| \}) | ||||
| @ -1,26 +0,0 @@ | ||||
| " 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, | ||||
| \}) | ||||
| @ -1,29 +0,0 @@ | ||||
| " 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) abort | ||||
|     let l:paths = ale#c#FindLocalHeaderPaths(a:buffer) | ||||
| 
 | ||||
|     " -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')) . ' ' | ||||
|     \   . ale#c#IncludeOptions(l:paths) | ||||
|     \   . 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_callback': 'ale_linters#cpp#gcc#GetCommand', | ||||
| \   'callback': 'ale#handlers#gcc#HandleGCCFormat', | ||||
| \}) | ||||
| @ -1,31 +0,0 @@ | ||||
| " 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', | ||||
| \}) | ||||
| @ -1,32 +0,0 @@ | ||||
| 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 = '^.\+.cs(\(\d\+\),\(\d\+\)): \(.\+\): \(.\+\)' | ||||
|     let l:output = [] | ||||
| 
 | ||||
|     for l:match in ale#util#GetMatches(a:lines, l:pattern) | ||||
|         call add(l:output, { | ||||
|         \   'lnum': l:match[1] + 0, | ||||
|         \   'col': l:match[2] + 0, | ||||
|         \   'text': l:match[3] . ': ' . l:match[4], | ||||
|         \   'type': l:match[3] =~# '^error' ? 'E' : 'W', | ||||
|         \}) | ||||
|     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', | ||||
| \}) | ||||
| @ -1,18 +0,0 @@ | ||||
| " 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', | ||||
| \}) | ||||
| @ -1,24 +0,0 @@ | ||||
| " 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', | ||||
| \}) | ||||
| @ -1,79 +0,0 @@ | ||||
| " 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', | ||||
| \}) | ||||
| @ -1,40 +0,0 @@ | ||||
| " 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) : '') | ||||
|     \   . ' %t' | ||||
| 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', | ||||
| \}) | ||||
| @ -1,77 +0,0 @@ | ||||
| " Author: hauleth - https://github.com/hauleth | ||||
| 
 | ||||
| " always, yes, never | ||||
| call ale#Set('dockerfile_hadolint_use_docker', 'never') | ||||
| call ale#Set('dockerfile_hadolint_docker_image', 'lukasmartinelli/hadolint') | ||||
| 
 | ||||
| function! ale_linters#dockerfile#hadolint#Handle(buffer, lines) abort | ||||
|     " Matches patterns line the following: | ||||
|     " | ||||
|     " stdin:19: F: Pipe chain should start with a raw value. | ||||
|     let l:pattern = '\v^/dev/stdin:?(\d+)? (\S+) (.+)$' | ||||
|     let l:output = [] | ||||
| 
 | ||||
|     for l:match in ale#util#GetMatches(a:lines, l:pattern) | ||||
|         let l:lnum = 0 | ||||
| 
 | ||||
|         if l:match[1] isnot# '' | ||||
|             let l:lnum = l:match[1] + 0 | ||||
|         endif | ||||
| 
 | ||||
|         let l:type = 'W' | ||||
|         let l:text = l:match[3] | ||||
| 
 | ||||
|         call add(l:output, { | ||||
|         \   'lnum': l:lnum, | ||||
|         \   'col': 0, | ||||
|         \   'type': l:type, | ||||
|         \   'text': l:text, | ||||
|         \   'nr': l:match[2], | ||||
|         \}) | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| " This is a little different than the typical 'executable' callback.  We want | ||||
| " to afford the user the chance to say always use docker, never use docker, | ||||
| " and use docker if the hadolint executable is not present on the system. | ||||
| " | ||||
| " In the case of neither docker nor hadolint executables being present, it | ||||
| " really doesn't matter which we return -- either will have the effect of | ||||
| " 'nope, can't use this linter!'. | ||||
| 
 | ||||
| function! ale_linters#dockerfile#hadolint#GetExecutable(buffer) abort | ||||
|     let l:use_docker = ale#Var(a:buffer, 'dockerfile_hadolint_use_docker') | ||||
| 
 | ||||
|     " check for mandatory directives | ||||
|     if l:use_docker is# 'never' | ||||
|         return 'hadolint' | ||||
|     elseif l:use_docker is# 'always' | ||||
|         return 'docker' | ||||
|     endif | ||||
| 
 | ||||
|     " if we reach here, we want to use 'hadolint' if present... | ||||
|     if executable('hadolint') | ||||
|         return 'hadolint' | ||||
|     endif | ||||
| 
 | ||||
|     "... and 'docker' as a fallback. | ||||
|     return 'docker' | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#dockerfile#hadolint#GetCommand(buffer) abort | ||||
|     let l:command = ale_linters#dockerfile#hadolint#GetExecutable(a:buffer) | ||||
|     if l:command is# 'docker' | ||||
|         return 'docker run --rm -i ' . ale#Var(a:buffer, 'dockerfile_hadolint_docker_image') | ||||
|     endif | ||||
|     return 'hadolint -' | ||||
| endfunction | ||||
| 
 | ||||
| 
 | ||||
| call ale#linter#Define('dockerfile', { | ||||
| \   'name': 'hadolint', | ||||
| \   'executable_callback': 'ale_linters#dockerfile#hadolint#GetExecutable', | ||||
| \   'command_callback': 'ale_linters#dockerfile#hadolint#GetCommand', | ||||
| \   'callback': 'ale_linters#dockerfile#hadolint#Handle', | ||||
| \}) | ||||
| @ -1,37 +0,0 @@ | ||||
| " Author: hauleth - https://github.com/hauleth | ||||
| 
 | ||||
| function! ale_linters#elixir#credo#Handle(buffer, lines) abort | ||||
|     " Matches patterns line the following: | ||||
|     " | ||||
|     " lib/filename.ex:19:7: F: Pipe chain should start with a raw value. | ||||
|     let l:pattern = '\v:(\d+):?(\d+)?: (.): (.+)$' | ||||
|     let l:output = [] | ||||
| 
 | ||||
|     for l:match in ale#util#GetMatches(a:lines, l:pattern) | ||||
|         let l:type = l:match[3] | ||||
|         let l:text = l:match[4] | ||||
| 
 | ||||
|         if l:type is# 'C' | ||||
|             let l:type = 'E' | ||||
|         elseif l:type is# 'R' | ||||
|             let l:type = 'W' | ||||
|         endif | ||||
| 
 | ||||
|         call add(l:output, { | ||||
|         \   'bufnr': a:buffer, | ||||
|         \   'lnum': l:match[1] + 0, | ||||
|         \   'col': l:match[2] + 0, | ||||
|         \   'type': l:type, | ||||
|         \   'text': l:text, | ||||
|         \}) | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('elixir', { | ||||
| \   'name': 'credo', | ||||
| \   'executable': 'mix', | ||||
| \   'command': 'mix credo suggest --format=flycheck --read-from-stdin %s', | ||||
| \   'callback': 'ale_linters#elixir#credo#Handle', | ||||
| \}) | ||||
| @ -1,38 +0,0 @@ | ||||
| " Author: archseer - https://github.com/archSeer | ||||
| 
 | ||||
| function! ale_linters#elixir#dogma#Handle(buffer, lines) abort | ||||
|     " Matches patterns line the following: | ||||
|     " | ||||
|     " lib/filename.ex:19:7: F: Pipe chain should start with a raw value. | ||||
|     let l:pattern = '\v:(\d+):?(\d+)?: (.): (.+)$' | ||||
|     let l:output = [] | ||||
| 
 | ||||
|     for l:match in ale#util#GetMatches(a:lines, l:pattern) | ||||
|         let l:type = l:match[3] | ||||
|         let l:text = l:match[4] | ||||
| 
 | ||||
|         if l:type is# 'C' | ||||
|             let l:type = 'E' | ||||
|         elseif l:type is# 'R' | ||||
|             let l:type = 'W' | ||||
|         endif | ||||
| 
 | ||||
|         call add(l:output, { | ||||
|         \   'bufnr': a:buffer, | ||||
|         \   'lnum': l:match[1] + 0, | ||||
|         \   'col': l:match[2] + 0, | ||||
|         \   'type': l:type, | ||||
|         \   'text': l:text, | ||||
|         \}) | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('elixir', { | ||||
| \   'name': 'dogma', | ||||
| \   'executable': 'mix', | ||||
| \   'command': 'mix dogma %s --format=flycheck', | ||||
| \   'lint_file': 1, | ||||
| \   'callback': 'ale_linters#elixir#dogma#Handle', | ||||
| \}) | ||||
| @ -1,77 +0,0 @@ | ||||
| " Author: buffalocoder - https://github.com/buffalocoder | ||||
| " Description: Elm linting in Ale. Closely follows the Syntastic checker in https://github.com/ElmCast/elm-vim. | ||||
| 
 | ||||
| function! ale_linters#elm#make#Handle(buffer, lines) abort | ||||
|     let l:output = [] | ||||
|     let l:is_windows = has('win32') | ||||
|     let l:temp_dir = l:is_windows ? $TMP : $TMPDIR | ||||
|     let l:unparsed_lines = [] | ||||
|     for l:line in a:lines | ||||
|         if l:line[0] is# '[' | ||||
|             let l:errors = json_decode(l:line) | ||||
| 
 | ||||
|             for l:error in l:errors | ||||
|                 " Check if file is from the temp directory. | ||||
|                 " Filters out any errors not related to the buffer. | ||||
|                 if l:is_windows | ||||
|                     let l:file_is_buffer = l:error.file[0:len(l:temp_dir) - 1] is? l:temp_dir | ||||
|                 else | ||||
|                     let l:file_is_buffer = l:error.file[0:len(l:temp_dir) - 1] is# l:temp_dir | ||||
|                 endif | ||||
| 
 | ||||
|                 if l:file_is_buffer | ||||
|                     call add(l:output, { | ||||
|                     \    'lnum': l:error.region.start.line, | ||||
|                     \    'col': l:error.region.start.column, | ||||
|                     \    'end_lnum': l:error.region.end.line, | ||||
|                     \    'end_col': l:error.region.end.column, | ||||
|                     \    'type': (l:error.type is? 'error') ? 'E' : 'W', | ||||
|                     \    'text': l:error.overview, | ||||
|                     \    'detail': l:error.overview . "\n\n" . l:error.details | ||||
|                     \}) | ||||
|                 endif | ||||
|             endfor | ||||
|         elseif l:line isnot# 'Successfully generated /dev/null' | ||||
|             call add(l:unparsed_lines, l:line) | ||||
|         endif | ||||
|     endfor | ||||
| 
 | ||||
|     if len(l:unparsed_lines) > 0 | ||||
|         call add(l:output, { | ||||
|         \    'lnum': 1, | ||||
|         \    'type': 'E', | ||||
|         \    'text': l:unparsed_lines[0], | ||||
|         \    'detail': join(l:unparsed_lines, "\n") | ||||
|         \}) | ||||
|     endif | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| " Return the command to execute the linter in the projects directory. | ||||
| " If it doesn't, then this will fail when imports are needed. | ||||
| function! ale_linters#elm#make#GetCommand(buffer) abort | ||||
|     let l:elm_package = ale#path#FindNearestFile(a:buffer, 'elm-package.json') | ||||
|     if empty(l:elm_package) | ||||
|         let l:dir_set_cmd = '' | ||||
|     else | ||||
|         let l:root_dir = fnamemodify(l:elm_package, ':p:h') | ||||
|         let l:dir_set_cmd = 'cd ' . ale#Escape(l:root_dir) . ' && ' | ||||
|     endif | ||||
| 
 | ||||
|     " The elm-make compiler, at the time of this writing, uses '/dev/null' as | ||||
|     " a sort of flag to tell the compiler not to generate an output file, | ||||
|     " which is why this is hard coded here. | ||||
|     " Source: https://github.com/elm-lang/elm-make/blob/master/src/Flags.hs | ||||
|     let l:elm_cmd = 'elm-make --report=json --output='.ale#Escape('/dev/null') | ||||
| 
 | ||||
|     return l:dir_set_cmd . ' ' . l:elm_cmd . ' %t' | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('elm', { | ||||
| \    'name': 'make', | ||||
| \    'executable': 'elm-make', | ||||
| \    'output_stream': 'both', | ||||
| \    'command_callback': 'ale_linters#elm#make#GetCommand', | ||||
| \    'callback': 'ale_linters#elm#make#Handle' | ||||
| \}) | ||||
| @ -1,96 +0,0 @@ | ||||
| " Author: Magnus Ottenklinger - https://github.com/evnu | ||||
| 
 | ||||
| let g:ale_erlang_erlc_options = get(g:, 'ale_erlang_erlc_options', '') | ||||
| 
 | ||||
| function! ale_linters#erlang#erlc#GetCommand(buffer) abort | ||||
|     let l:output_file = tempname() | ||||
|     call ale#engine#ManageFile(a:buffer, l:output_file) | ||||
| 
 | ||||
|     return 'erlc -o ' . ale#Escape(l:output_file) | ||||
|     \   . ' ' . ale#Var(a:buffer, 'erlang_erlc_options') | ||||
|     \   . ' %t' | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#erlang#erlc#Handle(buffer, lines) abort | ||||
|     " Matches patterns like the following: | ||||
|     " | ||||
|     " error.erl:4: variable 'B' is unbound | ||||
|     " error.erl:3: Warning: function main/0 is unused | ||||
|     " error.erl:4: Warning: variable 'A' is unused | ||||
|     let l:pattern = '\v^([^:]+):(\d+): (Warning: )?(.+)$' | ||||
| 
 | ||||
|     " parse_transforms are a special case. The error message does not indicate a location: | ||||
|     " error.erl: undefined parse transform 'some_parse_transform' | ||||
|     let l:pattern_parse_transform = '\v(undefined parse transform .*)$' | ||||
|     let l:output = [] | ||||
| 
 | ||||
|     let l:pattern_no_module_definition = '\v(no module definition)$' | ||||
|     let l:pattern_unused = '\v(.* is unused)$' | ||||
| 
 | ||||
|     let l:is_hrl = fnamemodify(bufname(a:buffer), ':e') is# 'hrl' | ||||
| 
 | ||||
|     for l:line in a:lines | ||||
|         let l:match = matchlist(l:line, l:pattern) | ||||
| 
 | ||||
|         " Determine if the output indicates an error. We distinguish between two cases: | ||||
|         " | ||||
|         " 1) normal errors match l:pattern | ||||
|         " 2) parse_transform errors match l:pattern_parse_transform | ||||
|         " | ||||
|         " If none of the patterns above match, the line can be ignored | ||||
|         if len(l:match) == 0 " not a 'normal' warning or error | ||||
|             let l:match_parse_transform = matchlist(l:line, l:pattern_parse_transform) | ||||
| 
 | ||||
|             if len(l:match_parse_transform) == 0 " also not a parse_transform error | ||||
|                 continue | ||||
|             endif | ||||
| 
 | ||||
|             call add(l:output, { | ||||
|             \   'bufnr': a:buffer, | ||||
|             \   'lnum': 0, | ||||
|             \   'col': 0, | ||||
|             \   'type': 'E', | ||||
|             \   'text': l:match_parse_transform[0], | ||||
|             \}) | ||||
| 
 | ||||
|             continue | ||||
|         endif | ||||
| 
 | ||||
|         let l:line = l:match[2] | ||||
|         let l:warning_or_text = l:match[3] | ||||
|         let l:text = l:match[4] | ||||
| 
 | ||||
|         " If this file is a header .hrl, ignore the following expected messages: | ||||
|         " - 'no module definition' | ||||
|         " - 'X is unused' | ||||
|         if l:is_hrl && ( | ||||
|         \   match(l:text, l:pattern_no_module_definition) != -1 | ||||
|         \   || match(l:text, l:pattern_unused) != -1 | ||||
|         \) | ||||
|             continue | ||||
|         endif | ||||
| 
 | ||||
|         if !empty(l:warning_or_text) | ||||
|             let l:type = 'W' | ||||
|         else | ||||
|             let l:type = 'E' | ||||
|         endif | ||||
| 
 | ||||
|         call add(l:output, { | ||||
|         \   'bufnr': a:buffer, | ||||
|         \   'lnum': l:line, | ||||
|         \   'col': 0, | ||||
|         \   'type': l:type, | ||||
|         \   'text': l:text, | ||||
|         \}) | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('erlang', { | ||||
| \   'name': 'erlc', | ||||
| \   'executable': 'erlc', | ||||
| \   'command_callback': 'ale_linters#erlang#erlc#GetCommand', | ||||
| \   'callback': 'ale_linters#erlang#erlc#Handle', | ||||
| \}) | ||||
| @ -1,53 +0,0 @@ | ||||
| " Author: Dmitri Vereshchagin <dmitri.vereshchagin@gmail.com> | ||||
| " Description: SyntaxErl linter for Erlang files | ||||
| 
 | ||||
| call ale#Set('erlang_syntaxerl_executable', 'syntaxerl') | ||||
| 
 | ||||
| 
 | ||||
| function! ale_linters#erlang#syntaxerl#GetExecutable(buffer) abort | ||||
|     return ale#Var(a:buffer, 'erlang_syntaxerl_executable') | ||||
| endfunction | ||||
| 
 | ||||
| 
 | ||||
| function! ale_linters#erlang#syntaxerl#FeatureCheck(buffer) abort | ||||
|     return s:GetEscapedExecutable(a:buffer) . ' -h' | ||||
| endfunction | ||||
| 
 | ||||
| 
 | ||||
| function! ale_linters#erlang#syntaxerl#GetCommand(buffer, output) abort | ||||
|     let l:use_b_option = match(a:output, '\C\V-b, --base\>') > -1 | ||||
| 
 | ||||
|     return s:GetEscapedExecutable(a:buffer) . (l:use_b_option ? ' -b %s %t' : ' %t') | ||||
| endfunction | ||||
| 
 | ||||
| 
 | ||||
| function! ale_linters#erlang#syntaxerl#Handle(buffer, lines) abort | ||||
|     let l:pattern = '\v\C:(\d+):( warning:)? (.+)' | ||||
|     let l:loclist = [] | ||||
| 
 | ||||
|     for l:match in ale#util#GetMatches(a:lines, l:pattern) | ||||
|         call add(l:loclist, { | ||||
|         \   'lnum': l:match[1] + 0, | ||||
|         \   'text': l:match[3], | ||||
|         \   'type': empty(l:match[2]) ? 'E' : 'W', | ||||
|         \}) | ||||
|     endfor | ||||
| 
 | ||||
|     return l:loclist | ||||
| endfunction | ||||
| 
 | ||||
| 
 | ||||
| function! s:GetEscapedExecutable(buffer) abort | ||||
|     return ale#Escape(ale_linters#erlang#syntaxerl#GetExecutable(a:buffer)) | ||||
| endfunction | ||||
| 
 | ||||
| 
 | ||||
| call ale#linter#Define('erlang', { | ||||
| \   'name': 'syntaxerl', | ||||
| \   'executable_callback': 'ale_linters#erlang#syntaxerl#GetExecutable', | ||||
| \   'command_chain': [ | ||||
| \       {'callback': 'ale_linters#erlang#syntaxerl#FeatureCheck'}, | ||||
| \       {'callback': 'ale_linters#erlang#syntaxerl#GetCommand'}, | ||||
| \   ], | ||||
| \   'callback': 'ale_linters#erlang#syntaxerl#Handle', | ||||
| \}) | ||||
| @ -1,11 +0,0 @@ | ||||
| " Author: Jake Zimmerman <jake@zimmerman.io> | ||||
| " Description: eruby checker using `erubis`, instead of `erb` | ||||
| 
 | ||||
| call ale#linter#Define('eruby', { | ||||
| \   'name': 'erubis', | ||||
| \   'executable': 'erubis', | ||||
| \   'output_stream': 'stderr', | ||||
| \   'command': 'erubis -x %t | ruby -c', | ||||
| \   'callback': 'ale#handlers#ruby#HandleSyntaxErrors', | ||||
| \}) | ||||
| 
 | ||||
| @ -1,11 +0,0 @@ | ||||
| " Author: Matthias Guenther - https://wikimatze.de | ||||
| " Description: erb-lint for eruby/erb files | ||||
| 
 | ||||
| call ale#linter#Define('eruby', { | ||||
| \   'name': 'erubylint', | ||||
| \   'executable': 'erb', | ||||
| \    'output_stream': 'stderr', | ||||
| \   'command': 'erb -P -x %t | ruby -c', | ||||
| \   'callback': 'ale#handlers#ruby#HandleSyntaxErrors', | ||||
| \}) | ||||
| 
 | ||||
| @ -1,86 +0,0 @@ | ||||
| " Author: w0rp <devw0rp@gmail.com> | ||||
| " Description: gcc for Fortran files | ||||
| 
 | ||||
| " This option can be set to 0 to use -ffixed-form | ||||
| if !exists('g:ale_fortran_gcc_use_free_form') | ||||
|     let g:ale_fortran_gcc_use_free_form = 1 | ||||
| endif | ||||
| 
 | ||||
| if !exists('g:ale_fortran_gcc_executable') | ||||
|     let g:ale_fortran_gcc_executable = 'gcc' | ||||
| endif | ||||
| 
 | ||||
| " Set this option to change the GCC options for warnings for Fortran. | ||||
| if !exists('g:ale_fortran_gcc_options') | ||||
|     let g:ale_fortran_gcc_options = '-Wall' | ||||
| endif | ||||
| 
 | ||||
| function! ale_linters#fortran#gcc#Handle(buffer, lines) abort | ||||
|     " We have to match a starting line and a later ending line together, | ||||
|     " like so. | ||||
|     " | ||||
|     " :21.34: | ||||
|     " Error: Expected comma in I/O list at (1) | ||||
|     let l:line_marker_pattern = ':\(\d\+\)[.:]\=\(\d\+\)\=:\=$' | ||||
|     let l:message_pattern = '^\(Error\|Warning\): \(.\+\)$' | ||||
|     let l:looking_for_message = 0 | ||||
|     let l:last_loclist_obj = {} | ||||
| 
 | ||||
|     let l:output = [] | ||||
| 
 | ||||
|     for l:line in a:lines | ||||
|         if l:looking_for_message | ||||
|             let l:match = matchlist(l:line, l:message_pattern) | ||||
|         else | ||||
|             let l:match = matchlist(l:line, l:line_marker_pattern) | ||||
|         endif | ||||
| 
 | ||||
|         if len(l:match) == 0 | ||||
|             continue | ||||
|         endif | ||||
| 
 | ||||
|         if l:looking_for_message | ||||
|             let l:looking_for_message = 0 | ||||
| 
 | ||||
|             " Now we have the text, we can set it and add the error. | ||||
|             let l:last_loclist_obj.text = l:match[2] | ||||
|             let l:last_loclist_obj.type = l:match[1] is# 'Warning' ? 'W' : 'E' | ||||
|             call add(l:output, l:last_loclist_obj) | ||||
|         else | ||||
|             let l:last_loclist_obj = { | ||||
|             \   'bufnr': a:buffer, | ||||
|             \   'lnum': l:match[1] + 0, | ||||
|             \   'col': l:match[2] + 0, | ||||
|             \} | ||||
| 
 | ||||
|             " Start looking for the message and error type. | ||||
|             let l:looking_for_message = 1 | ||||
|         endif | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#fortran#gcc#GetExecutable(buffer) abort | ||||
|     return ale#Var(a:buffer, 'fortran_gcc_executable') | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#fortran#gcc#GetCommand(buffer) abort | ||||
|     let l:layout_option = ale#Var(a:buffer, 'fortran_gcc_use_free_form') | ||||
|     \   ? '-ffree-form' | ||||
|     \   : '-ffixed-form' | ||||
| 
 | ||||
|     return ale_linters#fortran#gcc#GetExecutable(a:buffer) | ||||
|     \   . ' -S -x f95 -fsyntax-only ' | ||||
|     \   . l:layout_option . ' ' | ||||
|     \   . ale#Var(a:buffer, 'fortran_gcc_options') . ' ' | ||||
|     \   . '-' | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('fortran', { | ||||
| \   'name': 'gcc', | ||||
| \   'output_stream': 'stderr', | ||||
| \   'executable_callback': 'ale_linters#fortran#gcc#GetExecutable', | ||||
| \   'command_callback': 'ale_linters#fortran#gcc#GetCommand', | ||||
| \   'callback': 'ale_linters#fortran#gcc#Handle', | ||||
| \}) | ||||
| @ -1,41 +0,0 @@ | ||||
| " Author: RyanSquared <vandor2012@gmail.com> | ||||
| " Description: `fusion-lint` linter for FusionScript files | ||||
| 
 | ||||
| let g:ale_fuse_fusionlint_executable = | ||||
| \   get(g:, 'ale_fuse_fusionlint_executable', 'fusion-lint') | ||||
| 
 | ||||
| let g:ale_fuse_fusionlint_options = | ||||
| \   get(g:, 'ale_fuse_fusionlint_options', '') | ||||
| 
 | ||||
| function! ale_linters#fuse#fusionlint#GetExecutable(buffer) abort | ||||
|     return ale#Var(a:buffer, 'fuse_fusionlint_executable') | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#fuse#fusionlint#GetCommand(buffer) abort | ||||
|     return ale#Escape(ale_linters#fuse#fusionlint#GetExecutable(a:buffer)) | ||||
|     \   . ' ' . ale#Var(a:buffer, 'fuse_fusionlint_options') | ||||
|     \   . ' --filename %s -i' | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#fuse#fusionlint#Handle(buffer, lines) abort | ||||
|     let l:pattern = '^.*:\(\d\+\):\(\d\+\): (\([WE]\)\d\+) \(.\+\)$' | ||||
|     let l:output = [] | ||||
| 
 | ||||
|     for l:match in ale#util#GetMatches(a:lines, l:pattern) | ||||
|         call add(l:output, { | ||||
|         \   'lnum': l:match[1] + 0, | ||||
|         \   'col': l:match[2] + 0, | ||||
|         \   'text': l:match[4], | ||||
|         \   'type': l:match[3], | ||||
|         \}) | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('fuse', { | ||||
| \   'name': 'fusionlint', | ||||
| \   'executable_callback': 'ale_linters#fuse#fusionlint#GetExecutable', | ||||
| \   'command_callback': 'ale_linters#fuse#fusionlint#GetCommand', | ||||
| \   'callback': 'ale_linters#fuse#fusionlint#Handle', | ||||
| \}) | ||||
| @ -1,70 +0,0 @@ | ||||
| " Author: Joshua Rubin <joshua@rubixconsulting.com>, Ben Reedy <https://github.com/breed808> | ||||
| " Description: go build for Go files | ||||
| 
 | ||||
| " inspired by work from dzhou121 <dzhou121@gmail.com> | ||||
| 
 | ||||
| function! ale_linters#go#gobuild#GoEnv(buffer) abort | ||||
|     if exists('s:go_env') | ||||
|         return '' | ||||
|     endif | ||||
| 
 | ||||
|     return 'go env GOPATH GOROOT' | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#go#gobuild#GetCommand(buffer, goenv_output) abort | ||||
|     if !exists('s:go_env') | ||||
|         let s:go_env = { | ||||
|         \   'GOPATH': a:goenv_output[0], | ||||
|         \   'GOROOT': a:goenv_output[1], | ||||
|         \} | ||||
|     endif | ||||
| 
 | ||||
|     " Run go test in local directory with relative path | ||||
|     return 'GOPATH=' . s:go_env.GOPATH | ||||
|     \   . ' cd ' . fnamemodify(bufname(a:buffer), ':.:h') | ||||
|     \   . ' && go test -c -o /dev/null ./' | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#go#gobuild#GetMatches(lines) abort | ||||
|     " Matches patterns like the following: | ||||
|     " | ||||
|     " file.go:27: missing argument for Printf("%s"): format reads arg 2, have only 1 args | ||||
|     " file.go:53:10: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary) | ||||
|     " file.go:5:2: expected declaration, found 'STRING' "log" | ||||
| 
 | ||||
|     " go test returns relative paths so use tail of filename as part of pattern matcher | ||||
|     let l:pattern = '\v^([a-zA-Z]?:?[^:]+):(\d+):?(\d+)?:? (.+)$' | ||||
| 
 | ||||
|     return ale#util#GetMatches(a:lines, l:pattern) | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#go#gobuild#Handler(buffer, lines) abort | ||||
|     let l:output = [] | ||||
| 
 | ||||
|     for l:match in ale_linters#go#gobuild#GetMatches(a:lines) | ||||
|         " Omit errors from imported go packages | ||||
|         if !ale#path#IsBufferPath(a:buffer, l:match[1]) | ||||
|             continue | ||||
|         endif | ||||
| 
 | ||||
|         call add(l:output, { | ||||
|         \   'lnum': l:match[2] + 0, | ||||
|         \   'col': l:match[3] + 0, | ||||
|         \   'text': l:match[4], | ||||
|         \   'type': 'E', | ||||
|         \}) | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('go', { | ||||
| \   'name': 'go build', | ||||
| \   'executable': 'go', | ||||
| \   'command_chain': [ | ||||
| \     {'callback': 'ale_linters#go#gobuild#GoEnv', 'output_stream': 'stdout'}, | ||||
| \     {'callback': 'ale_linters#go#gobuild#GetCommand', 'output_stream': 'stderr'}, | ||||
| \   ], | ||||
| \   'callback': 'ale_linters#go#gobuild#Handler', | ||||
| \   'lint_file': 1, | ||||
| \}) | ||||
| @ -1,10 +0,0 @@ | ||||
| " Author: neersighted <bjorn@neersighted.com> | ||||
| " Description: gofmt for Go files | ||||
| 
 | ||||
| call ale#linter#Define('go', { | ||||
| \   'name': 'gofmt', | ||||
| \   'output_stream': 'stderr', | ||||
| \   'executable': 'gofmt', | ||||
| \   'command': 'gofmt -e %t', | ||||
| \   'callback': 'ale#handlers#unix#HandleAsError', | ||||
| \}) | ||||
| @ -1,9 +0,0 @@ | ||||
| " Author: neersighted <bjorn@neersighted.com> | ||||
| " Description: golint for Go files | ||||
| 
 | ||||
| call ale#linter#Define('go', { | ||||
| \   'name': 'golint', | ||||
| \   'executable': 'golint', | ||||
| \   'command': 'golint %t', | ||||
| \   'callback': 'ale#handlers#unix#HandleAsWarning', | ||||
| \}) | ||||
| @ -1,49 +0,0 @@ | ||||
| " Author: Ben Reedy <https://github.com/breed808> | ||||
| " Description: Adds support for the gometalinter suite for Go files | ||||
| 
 | ||||
| call ale#Set('go_gometalinter_options', '') | ||||
| call ale#Set('go_gometalinter_executable', 'gometalinter') | ||||
| 
 | ||||
| function! ale_linters#go#gometalinter#GetExecutable(buffer) abort | ||||
|     return ale#Var(a:buffer, 'go_gometalinter_executable') | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#go#gometalinter#GetCommand(buffer) abort | ||||
|     let l:executable = ale_linters#go#gometalinter#GetExecutable(a:buffer) | ||||
|     let l:filename = expand('#' . a:buffer) | ||||
|     let l:options = ale#Var(a:buffer, 'go_gometalinter_options') | ||||
| 
 | ||||
|     return ale#Escape(l:executable) | ||||
|     \   . ' --include=' . ale#Escape('^' . ale#util#EscapePCRE(l:filename)) | ||||
|     \   . (!empty(l:options) ? ' ' . l:options : '') | ||||
|     \   . ' ' . ale#Escape(fnamemodify(l:filename, ':h')) | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#go#gometalinter#GetMatches(lines) abort | ||||
|     let l:pattern = '\v^([a-zA-Z]?:?[^:]+):(\d+):?(\d+)?:?:?(warning|error):?\s\*?(.+)$' | ||||
| 
 | ||||
|     return ale#util#GetMatches(a:lines, l:pattern) | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#go#gometalinter#Handler(buffer, lines) abort | ||||
|     let l:output = [] | ||||
| 
 | ||||
|     for l:match in ale_linters#go#gometalinter#GetMatches(a:lines) | ||||
|         call add(l:output, { | ||||
|         \   'lnum': l:match[2] + 0, | ||||
|         \   'col': l:match[3] + 0, | ||||
|         \   'type': tolower(l:match[4]) is# 'warning' ? 'W' : 'E', | ||||
|         \   'text': l:match[5], | ||||
|         \}) | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('go', { | ||||
| \   'name': 'gometalinter', | ||||
| \   'executable_callback': 'ale_linters#go#gometalinter#GetExecutable', | ||||
| \   'command_callback': 'ale_linters#go#gometalinter#GetCommand', | ||||
| \   'callback': 'ale_linters#go#gometalinter#Handler', | ||||
| \   'lint_file': 1, | ||||
| \}) | ||||
| @ -1,9 +0,0 @@ | ||||
| " Author: Ben Reedy <https://github.com/breed808> | ||||
| " Description: gosimple for Go files | ||||
| 
 | ||||
| call ale#linter#Define('go', { | ||||
| \   'name': 'gosimple', | ||||
| \   'executable': 'gosimple', | ||||
| \   'command': 'gosimple %t', | ||||
| \   'callback': 'ale#handlers#unix#HandleAsWarning', | ||||
| \}) | ||||
| @ -1,10 +0,0 @@ | ||||
| " Author: neersighted <bjorn@neersighted.com> | ||||
| " Description: go vet for Go files | ||||
| 
 | ||||
| call ale#linter#Define('go', { | ||||
| \   'name': 'go vet', | ||||
| \   'output_stream': 'stderr', | ||||
| \   'executable': 'go', | ||||
| \   'command': 'go vet %t', | ||||
| \   'callback': 'ale#handlers#unix#HandleAsError', | ||||
| \}) | ||||
| @ -1,9 +0,0 @@ | ||||
| " Author: Ben Reedy <https://github.com/breed808> | ||||
| " Description: staticcheck for Go files | ||||
| 
 | ||||
| call ale#linter#Define('go', { | ||||
| \   'name': 'staticcheck', | ||||
| \   'executable': 'staticcheck', | ||||
| \   'command': 'staticcheck %t', | ||||
| \   'callback': 'ale#handlers#unix#HandleAsWarning', | ||||
| \}) | ||||
| @ -1,9 +0,0 @@ | ||||
| " Author: Michiel Westerbeek <happylinks@gmail.com> | ||||
| " Description: Linter for GraphQL Schemas | ||||
| 
 | ||||
| call ale#linter#Define('graphql', { | ||||
| \   'name': 'gqlint', | ||||
| \   'executable': 'gqlint', | ||||
| \   'command': 'gqlint --reporter=simple %t', | ||||
| \   'callback': 'ale#handlers#unix#HandleAsWarning', | ||||
| \}) | ||||
| @ -1,26 +0,0 @@ | ||||
| " Author: Patrick Lewis - https://github.com/patricklewis | ||||
| " Description: haml-lint for Haml files | ||||
| 
 | ||||
| function! ale_linters#haml#hamllint#Handle(buffer, lines) abort | ||||
|     " Matches patterns like the following: | ||||
|     " <path>:51 [W] RuboCop: Use the new Ruby 1.9 hash syntax. | ||||
|     let l:pattern = '\v^.*:(\d+) \[([EW])\] (.+)$' | ||||
|     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], | ||||
|         \   'text': l:match[3] | ||||
|         \}) | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('haml', { | ||||
| \   'name': 'hamllint', | ||||
| \   'executable': 'haml-lint', | ||||
| \   'command': 'haml-lint %t', | ||||
| \   'callback': 'ale_linters#haml#hamllint#Handle' | ||||
| \}) | ||||
| @ -1,50 +0,0 @@ | ||||
| " Author: Adrian Zalewski <aazalewski@hotmail.com> | ||||
| " Description: Ember-template-lint for checking Handlebars files | ||||
| 
 | ||||
| call ale#Set('handlebars_embertemplatelint_executable', 'ember-template-lint') | ||||
| call ale#Set('handlebars_embertemplatelint_use_global', 0) | ||||
| 
 | ||||
| function! ale_linters#handlebars#embertemplatelint#GetExecutable(buffer) abort | ||||
|     return ale#node#FindExecutable(a:buffer, 'handlebars_embertemplatelint', [ | ||||
|     \   'node_modules/.bin/ember-template-lint', | ||||
|     \]) | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#handlebars#embertemplatelint#GetCommand(buffer) abort | ||||
|     return ale_linters#handlebars#embertemplatelint#GetExecutable(a:buffer) | ||||
|     \   . ' --json %t' | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#handlebars#embertemplatelint#Handle(buffer, lines) abort | ||||
|     let l:output = [] | ||||
|     let l:json = ale#util#FuzzyJSONDecode(a:lines, {}) | ||||
| 
 | ||||
|     for l:error in get(values(l:json), 0, []) | ||||
|         if has_key(l:error, 'fatal') | ||||
|             call add(l:output, { | ||||
|             \   'bufnr': a:buffer, | ||||
|             \   'lnum': 1, | ||||
|             \   'col': 1, | ||||
|             \   'text': l:error.message, | ||||
|             \   'type': l:error.severity == 1 ? 'W' : 'E', | ||||
|             \}) | ||||
|         else | ||||
|             call add(l:output, { | ||||
|             \   'bufnr': a:buffer, | ||||
|             \   'lnum': l:error.line, | ||||
|             \   'col': l:error.column, | ||||
|             \   'text': l:error.rule . ': ' . l:error.message, | ||||
|             \   'type': l:error.severity == 1 ? 'W' : 'E', | ||||
|             \}) | ||||
|         endif | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('handlebars', { | ||||
| \   'name': 'ember-template-lint', | ||||
| \   'executable_callback': 'ale_linters#handlebars#embertemplatelint#GetExecutable', | ||||
| \   'command_callback': 'ale_linters#handlebars#embertemplatelint#GetCommand', | ||||
| \   'callback': 'ale_linters#handlebars#embertemplatelint#Handle', | ||||
| \}) | ||||
| @ -1,16 +0,0 @@ | ||||
| " Author: wizzup <wizzup@gmail.com> | ||||
| " Description: ghc-mod for Haskell files | ||||
| 
 | ||||
| call ale#linter#Define('haskell', { | ||||
| \   'name': 'ghc-mod', | ||||
| \   'executable': 'ghc-mod', | ||||
| \   'command': 'ghc-mod --map-file %s=%t check %s', | ||||
| \   'callback': 'ale#handlers#haskell#HandleGHCFormat', | ||||
| \}) | ||||
| 
 | ||||
| call ale#linter#Define('haskell', { | ||||
| \   'name': 'stack-ghc-mod', | ||||
| \   'executable': 'stack', | ||||
| \   'command': 'stack exec ghc-mod -- --map-file %s=%t check %s', | ||||
| \   'callback': 'ale#handlers#haskell#HandleGHCFormat', | ||||
| \}) | ||||
| @ -1,10 +0,0 @@ | ||||
| " Author: w0rp <devw0rp@gmail.com> | ||||
| " Description: ghc for Haskell files | ||||
| 
 | ||||
| call ale#linter#Define('haskell', { | ||||
| \   'name': 'ghc', | ||||
| \   'output_stream': 'stderr', | ||||
| \   'executable': 'ghc', | ||||
| \   'command': 'ghc -fno-code -v0 %t', | ||||
| \   'callback': 'ale#handlers#haskell#HandleGHCFormat', | ||||
| \}) | ||||
| @ -1,22 +0,0 @@ | ||||
| " Author: rob-b, Takano Akio <tak@anoak.io> | ||||
| " Description: hdevtools for Haskell files | ||||
| 
 | ||||
| call ale#Set('haskell_hdevtools_executable', 'hdevtools') | ||||
| call ale#Set('haskell_hdevtools_options', '-g -Wall') | ||||
| 
 | ||||
| function! ale_linters#haskell#hdevtools#GetExecutable(buffer) abort | ||||
|     return ale#Var(a:buffer, 'haskell_hdevtools_executable') | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#haskell#hdevtools#GetCommand(buffer) abort | ||||
|     return ale#Escape(ale_linters#haskell#hdevtools#GetExecutable(a:buffer)) | ||||
|         \ . ' check ' . ale#Var(a:buffer, 'haskell_hdevtools_options') | ||||
|         \ . ' -p %s %t' | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('haskell', { | ||||
| \   'name': 'hdevtools', | ||||
| \   'executable_callback': 'ale_linters#haskell#hdevtools#GetExecutable', | ||||
| \   'command_callback': 'ale_linters#haskell#hdevtools#GetCommand', | ||||
| \   'callback': 'ale#handlers#haskell#HandleGHCFormat', | ||||
| \}) | ||||
| @ -1,34 +0,0 @@ | ||||
| " Author: jparoz <jesse.paroz@gmail.com> | ||||
| " Description: hlint for Haskell files | ||||
| 
 | ||||
| function! ale_linters#haskell#hlint#Handle(buffer, lines) abort | ||||
|     let l:output = [] | ||||
| 
 | ||||
|     for l:error in ale#util#FuzzyJSONDecode(a:lines, []) | ||||
|         if l:error.severity is# 'Error' | ||||
|             let l:type = 'E' | ||||
|         elseif l:error.severity is# 'Suggestion' | ||||
|             let l:type = 'I' | ||||
|         else | ||||
|             let l:type = 'W' | ||||
|         endif | ||||
| 
 | ||||
|         call add(l:output, { | ||||
|         \   'lnum': str2nr(l:error.startLine), | ||||
|         \   'col': str2nr(l:error.startColumn), | ||||
|         \   'end_lnum': str2nr(l:error.endLine), | ||||
|         \   'end_col': str2nr(l:error.endColumn), | ||||
|         \   'text': l:error.severity . ': ' . l:error.hint . '. Found: ' . l:error.from . ' Why not: ' . l:error.to, | ||||
|         \   'type': l:type, | ||||
|         \}) | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('haskell', { | ||||
| \   'name': 'hlint', | ||||
| \   'executable': 'hlint', | ||||
| \   'command': 'hlint --color=never --json -', | ||||
| \   'callback': 'ale_linters#haskell#hlint#Handle', | ||||
| \}) | ||||
| @ -1,22 +0,0 @@ | ||||
| " Author: Jake Zimmerman <jake@zimmerman.io> | ||||
| " Description: Like stack-ghc, but for entire projects | ||||
| " | ||||
| " Note: Ideally, this would *only* typecheck. Right now, it also does codegen. | ||||
| " See <https://github.com/commercialhaskell/stack/issues/977>. | ||||
| 
 | ||||
| call ale#Set('haskell_stack_build_options', '--fast') | ||||
| 
 | ||||
| function ale_linters#haskell#stack_build#GetCommand(buffer) abort | ||||
|     let l:flags = ale#Var(a:buffer, 'haskell_stack_build_options') | ||||
| 
 | ||||
|     return 'stack build ' . l:flags | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('haskell', { | ||||
| \   'name': 'stack-build', | ||||
| \   'output_stream': 'stderr', | ||||
| \   'executable': 'stack', | ||||
| \   'command_callback': 'ale_linters#haskell#stack_build#GetCommand', | ||||
| \   'lint_file': 1, | ||||
| \   'callback': 'ale#handlers#haskell#HandleGHCFormat', | ||||
| \}) | ||||
| @ -1,10 +0,0 @@ | ||||
| " Author: w0rp <devw0rp@gmail.com> | ||||
| " Description: ghc for Haskell files, using Stack | ||||
| 
 | ||||
| call ale#linter#Define('haskell', { | ||||
| \   'name': 'stack-ghc', | ||||
| \   'output_stream': 'stderr', | ||||
| \   'executable': 'stack', | ||||
| \   'command': 'stack ghc -- -fno-code -v0 %t', | ||||
| \   'callback': 'ale#handlers#haskell#HandleGHCFormat', | ||||
| \}) | ||||
| @ -1,9 +0,0 @@ | ||||
| " Author: Daniel M. Capella https://github.com/polyzen | ||||
| " Description: proselint for Vim help files | ||||
| 
 | ||||
| call ale#linter#Define('help', { | ||||
| \   'name': 'proselint', | ||||
| \   'executable': 'proselint', | ||||
| \   'command': 'proselint %t', | ||||
| \   'callback': 'ale#handlers#unix#HandleAsWarning', | ||||
| \}) | ||||
| @ -1,25 +0,0 @@ | ||||
| " Author: KabbAmine <amine.kabb@gmail.com>, deathmaz <00maz1987@gmail.com>, diartyz <diartyz@gmail.com> | ||||
| " Description: HTMLHint for checking html files | ||||
| 
 | ||||
| call ale#Set('html_htmlhint_options', '--format=unix') | ||||
| call ale#Set('html_htmlhint_executable', 'htmlhint') | ||||
| call ale#Set('html_htmlhint_use_global', 0) | ||||
| 
 | ||||
| function! ale_linters#html#htmlhint#GetExecutable(buffer) abort | ||||
|     return ale#node#FindExecutable(a:buffer, 'html_htmlhint', [ | ||||
|     \   'node_modules/.bin/htmlhint', | ||||
|     \]) | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#html#htmlhint#GetCommand(buffer) abort | ||||
|     return ale_linters#html#htmlhint#GetExecutable(a:buffer) | ||||
|     \   . ' ' . ale#Var(a:buffer, 'html_htmlhint_options') | ||||
|     \   . ' %t' | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('html', { | ||||
| \   'name': 'htmlhint', | ||||
| \   'executable_callback': 'ale_linters#html#htmlhint#GetExecutable', | ||||
| \   'command_callback': 'ale_linters#html#htmlhint#GetCommand', | ||||
| \   'callback': 'ale#handlers#unix#HandleAsError', | ||||
| \}) | ||||
| @ -1,9 +0,0 @@ | ||||
| " Author: Daniel M. Capella https://github.com/polyzen | ||||
| " Description: proselint for HTML files | ||||
| 
 | ||||
| call ale#linter#Define('html', { | ||||
| \   'name': 'proselint', | ||||
| \   'executable': 'proselint', | ||||
| \   'command': 'proselint %t', | ||||
| \   'callback': 'ale#handlers#unix#HandleAsWarning', | ||||
| \}) | ||||
| @ -1,69 +0,0 @@ | ||||
| " Author: KabbAmine <amine.kabb@gmail.com> | ||||
| " Description: This file adds support for checking HTML code with tidy. | ||||
| 
 | ||||
| " CLI options | ||||
| let g:ale_html_tidy_executable = get(g:, 'ale_html_tidy_executable', 'tidy') | ||||
| " Look for the old _args variable first. | ||||
| let s:default_options = get(g:, 'ale_html_tidy_args', '-q -e -language en') | ||||
| let g:ale_html_tidy_options = get(g:, 'ale_html_tidy_options', s:default_options) | ||||
| 
 | ||||
| function! ale_linters#html#tidy#GetCommand(buffer) abort | ||||
|     " Specify file encoding in options | ||||
|     " (Idea taken from https://github.com/scrooloose/syntastic/blob/master/syntax_checkers/html/tidy.vim) | ||||
|     let l:file_encoding = get({ | ||||
|     \   'ascii':        '-ascii', | ||||
|     \   'big5':         '-big5', | ||||
|     \   'cp1252':       '-win1252', | ||||
|     \   'cp850':        '-ibm858', | ||||
|     \   'cp932':        '-shiftjis', | ||||
|     \   'iso-2022-jp':  '-iso-2022', | ||||
|     \   'latin1':       '-latin1', | ||||
|     \   'macroman':     '-mac', | ||||
|     \   'sjis':         '-shiftjis', | ||||
|     \   'utf-16le':     '-utf16le', | ||||
|     \   'utf-16':       '-utf16', | ||||
|     \   'utf-8':        '-utf8', | ||||
|     \ }, &fileencoding, '-utf8') | ||||
| 
 | ||||
|     return printf('%s %s %s -', | ||||
|     \   ale#Var(a:buffer, 'html_tidy_executable'), | ||||
|     \   ale#Var(a:buffer, 'html_tidy_options'), | ||||
|     \   l:file_encoding | ||||
|     \) | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#html#tidy#GetExecutable(buffer) abort | ||||
|     return ale#Var(a:buffer, 'html_tidy_executable') | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#html#tidy#Handle(buffer, lines) abort | ||||
|     " Matches patterns lines like the following: | ||||
|     " line 7 column 5 - Warning: missing </title> before </head> | ||||
| 
 | ||||
|     let l:pattern = '^line \(\d\+\) column \(\d\+\) - \(Warning\|Error\): \(.\+\)$' | ||||
|     let l:output = [] | ||||
| 
 | ||||
|     for l:match in ale#util#GetMatches(a:lines, l:pattern) | ||||
|         let l:line = l:match[1] + 0 | ||||
|         let l:col = l:match[2] + 0 | ||||
|         let l:type = l:match[3] is# 'Error' ? 'E' : 'W' | ||||
|         let l:text = l:match[4] | ||||
| 
 | ||||
|         call add(l:output, { | ||||
|         \   'lnum': l:line, | ||||
|         \   'col': l:col, | ||||
|         \   'text': l:text, | ||||
|         \   'type': l:type, | ||||
|         \}) | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('html', { | ||||
| \   'name': 'tidy', | ||||
| \   'executable_callback': 'ale_linters#html#tidy#GetExecutable', | ||||
| \   'output_stream': 'stderr', | ||||
| \   'command_callback': 'ale_linters#html#tidy#GetCommand', | ||||
| \   'callback': 'ale_linters#html#tidy#Handle', | ||||
| \ }) | ||||
| @ -1,87 +0,0 @@ | ||||
| " Author: Scott Bonds <scott@ggr.com> | ||||
| " Description: default Idris compiler | ||||
| 
 | ||||
| call ale#Set('idris_idris_executable', 'idris') | ||||
| call ale#Set('idris_idris_options', '--total --warnpartial --warnreach --warnipkg') | ||||
| 
 | ||||
| function! ale_linters#idris#idris#GetExecutable(buffer) abort | ||||
|     return ale#Var(a:buffer, 'idris_idris_executable') | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#idris#idris#GetCommand(buffer) abort | ||||
|     let l:options = ale#Var(a:buffer, 'idris_idris_options') | ||||
| 
 | ||||
|     return ale#Escape(ale_linters#idris#idris#GetExecutable(a:buffer)) | ||||
|     \   . (!empty(l:options) ? ' ' . l:options : '') | ||||
|     \   . ' --check %s' | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#idris#idris#Handle(buffer, lines) abort | ||||
|     " This was copied almost verbatim from ale#handlers#haskell#HandleGHCFormat | ||||
| 
 | ||||
|     " Look for lines like the following: | ||||
|     " foo.idr:2:6:When checking right hand side of main with expected type | ||||
|     " bar.idr:11:11-13: | ||||
|     let l:pattern = '\v^([a-zA-Z]?:?[^:]+):(\d+):(\d+)(-\d+)?:(.*)?$' | ||||
|     let l:output = [] | ||||
| 
 | ||||
|     let l:corrected_lines = [] | ||||
| 
 | ||||
|     for l:line in a:lines | ||||
|         if len(matchlist(l:line, l:pattern)) > 0 | ||||
|             call add(l:corrected_lines, l:line) | ||||
|         elseif len(l:corrected_lines) > 0 | ||||
|             if l:line is# '' | ||||
|                 let l:corrected_lines[-1] .= ' ' " turn a blank line into a space | ||||
|             else | ||||
|                 let l:corrected_lines[-1] .= l:line | ||||
|             endif | ||||
|             let l:corrected_lines[-1] = substitute(l:corrected_lines[-1], '\s\+', ' ', 'g') | ||||
|         endif | ||||
|     endfor | ||||
| 
 | ||||
|     for l:line in l:corrected_lines | ||||
|         let l:match = matchlist(l:line, l:pattern) | ||||
| 
 | ||||
|         if len(l:match) == 0 | ||||
|             continue | ||||
|         endif | ||||
| 
 | ||||
|         if !ale#path#IsBufferPath(a:buffer, l:match[1]) | ||||
|             continue | ||||
|         endif | ||||
| 
 | ||||
|         let l:errors = matchlist(l:match[5], '\v([wW]arning|[eE]rror) - ?(.*)') | ||||
| 
 | ||||
|         if len(l:errors) > 0 | ||||
|           let l:ghc_type = l:errors[1] | ||||
|           let l:text = l:errors[2] | ||||
|         else | ||||
|           let l:ghc_type = '' | ||||
|           let l:text = l:match[5][:0] is# ' ' ? l:match[5][1:] : l:match[5] | ||||
|         endif | ||||
| 
 | ||||
|         if l:ghc_type is? 'Warning' | ||||
|             let l:type = 'W' | ||||
|         else | ||||
|             let l:type = 'E' | ||||
|         endif | ||||
| 
 | ||||
|         call add(l:output, { | ||||
|         \   'lnum': l:match[2] + 0, | ||||
|         \   'col': l:match[3] + 0, | ||||
|         \   'text': l:text, | ||||
|         \   'type': l:type, | ||||
|         \}) | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('idris', { | ||||
| \   'name': 'idris', | ||||
| \   'executable_callback': 'ale_linters#idris#idris#GetExecutable', | ||||
| \   'command_callback': 'ale_linters#idris#idris#GetCommand', | ||||
| \   'callback': 'ale_linters#idris#idris#Handle', | ||||
| \}) | ||||
| 
 | ||||
| @ -1,46 +0,0 @@ | ||||
| " Author: Devon Meunier <devon.meunier@gmail.com> | ||||
| " Description: checkstyle for Java files | ||||
| 
 | ||||
| function! ale_linters#java#checkstyle#Handle(buffer, lines) abort | ||||
|     let l:patterns = [ | ||||
|         \ '\v\[(WARN|ERROR)\] .*:(\d+):(\d+): (.*)', | ||||
|         \ '\v\[(WARN|ERROR)\] .*:(\d+): (.*)', | ||||
|         \] | ||||
|     let l:output = [] | ||||
| 
 | ||||
|     for l:match in ale#util#GetMatches(a:lines, l:patterns) | ||||
|         let l:args = { | ||||
|         \   'lnum': l:match[2] + 0, | ||||
|         \   'type': l:match[1] =~? 'WARN' ? 'W' : 'E' | ||||
|         \ } | ||||
| 
 | ||||
|         let l:col = l:match[3] + 0 | ||||
|         if l:col > 0 | ||||
|             let l:args['col'] = l:col | ||||
|             let l:args['text'] = l:match[4] | ||||
|         else | ||||
|             let l:args['text'] = l:match[3] | ||||
|         endif | ||||
| 
 | ||||
|         call add(l:output, l:args) | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#java#checkstyle#GetCommand(buffer) abort | ||||
|     return 'checkstyle ' | ||||
|     \ . ale#Var(a:buffer, 'java_checkstyle_options') | ||||
|     \ . ' %t' | ||||
| endfunction | ||||
| 
 | ||||
| if !exists('g:ale_java_checkstyle_options') | ||||
|     let g:ale_java_checkstyle_options = '-c /google_checks.xml' | ||||
| endif | ||||
| 
 | ||||
| call ale#linter#Define('java', { | ||||
| \   'name': 'checkstyle', | ||||
| \   'executable': 'checkstyle', | ||||
| \   'command_callback': 'ale_linters#java#checkstyle#GetCommand', | ||||
| \   'callback': 'ale_linters#java#checkstyle#Handle', | ||||
| \}) | ||||
| @ -1,94 +0,0 @@ | ||||
| " Author: farenjihn <farenjihn@gmail.com>, w0rp <devw0rp@gmail.com> | ||||
| " Description: Lints java files using javac | ||||
| 
 | ||||
| let s:classpath_sep = has('unix') ? ':' : ';' | ||||
| 
 | ||||
| let g:ale_java_javac_options = get(g:, 'ale_java_javac_options', '') | ||||
| let g:ale_java_javac_classpath = get(g:, 'ale_java_javac_classpath', '') | ||||
| 
 | ||||
| function! ale_linters#java#javac#GetImportPaths(buffer) abort | ||||
|     let l:pom_path = ale#path#FindNearestFile(a:buffer, 'pom.xml') | ||||
| 
 | ||||
|     if !empty(l:pom_path) && executable('mvn') | ||||
|         return ale#path#CdString(fnamemodify(l:pom_path, ':h')) | ||||
|         \ . 'mvn dependency:build-classpath' | ||||
|     endif | ||||
| 
 | ||||
|     return '' | ||||
| endfunction | ||||
| 
 | ||||
| function! s:BuildClassPathOption(buffer, import_paths) abort | ||||
|     " Filter out lines like [INFO], etc. | ||||
|     let l:class_paths = filter(a:import_paths[:], 'v:val !~# ''[''') | ||||
|     call extend( | ||||
|     \   l:class_paths, | ||||
|     \   split(ale#Var(a:buffer, 'java_javac_classpath'), s:classpath_sep), | ||||
|     \) | ||||
| 
 | ||||
|     return !empty(l:class_paths) | ||||
|     \   ? '-cp ' . ale#Escape(join(l:class_paths, s:classpath_sep)) | ||||
|     \   : '' | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#java#javac#GetCommand(buffer, import_paths) abort | ||||
|     let l:cp_option = s:BuildClassPathOption(a:buffer, a:import_paths) | ||||
|     let l:sp_option = '' | ||||
| 
 | ||||
|     " Find the src directory, for files in this project. | ||||
|     let l:src_dir = ale#path#FindNearestDirectory(a:buffer, 'src/main/java') | ||||
| 
 | ||||
|     if !empty(l:src_dir) | ||||
|         let l:sp_option = '-sourcepath ' . ale#Escape(l:src_dir) | ||||
|     endif | ||||
| 
 | ||||
|     " Create .class files in a temporary directory, which we will delete later. | ||||
|     let l:class_file_directory = ale#engine#CreateDirectory(a:buffer) | ||||
| 
 | ||||
|     return 'javac -Xlint' | ||||
|     \ . ' ' . l:cp_option | ||||
|     \ . ' ' . l:sp_option | ||||
|     \ . ' -d ' . ale#Escape(l:class_file_directory) | ||||
|     \ . ' ' . ale#Var(a:buffer, 'java_javac_options') | ||||
|     \ . ' %t' | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#java#javac#Handle(buffer, lines) abort | ||||
|     " Look for lines like the following. | ||||
|     " | ||||
|     " Main.java:13: warning: [deprecation] donaught() in Testclass has been deprecated | ||||
|     " Main.java:16: error: ';' expected | ||||
| 
 | ||||
|     let l:pattern = '\v^.*:(\d+): (.+):(.+)$' | ||||
|     let l:col_pattern = '\v^(\s*\^)$' | ||||
|     let l:symbol_pattern = '\v^ +symbol: *(class|method) +([^ ]+)' | ||||
|     let l:output = [] | ||||
| 
 | ||||
|     for l:match in ale#util#GetMatches(a:lines, [l:pattern, l:col_pattern, l:symbol_pattern]) | ||||
|         if empty(l:match[2]) && empty(l:match[3]) | ||||
|                 let l:output[-1].col = len(l:match[1]) | ||||
|         elseif empty(l:match[3]) | ||||
|             " Add symbols to 'cannot find symbol' errors. | ||||
|             if l:output[-1].text is# 'error: cannot find symbol' | ||||
|                 let l:output[-1].text .= ': ' . l:match[2] | ||||
|             endif | ||||
|         else | ||||
|             call add(l:output, { | ||||
|             \   'lnum': l:match[1] + 0, | ||||
|             \   'text': l:match[2] . ':' . l:match[3], | ||||
|             \   'type': l:match[2] is# 'error' ? 'E' : 'W', | ||||
|             \}) | ||||
|         endif | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('java', { | ||||
| \   'name': 'javac', | ||||
| \   'executable': 'javac', | ||||
| \   'command_chain': [ | ||||
| \       {'callback': 'ale_linters#java#javac#GetImportPaths', 'output_stream': 'stdout'}, | ||||
| \       {'callback': 'ale_linters#java#javac#GetCommand', 'output_stream': 'stderr'}, | ||||
| \   ], | ||||
| \   'callback': 'ale_linters#java#javac#Handle', | ||||
| \}) | ||||
| @ -1,9 +0,0 @@ | ||||
| " Author: w0rp <devw0rp@gmail.com> | ||||
| " Description: eslint for JavaScript files | ||||
| 
 | ||||
| call ale#linter#Define('javascript', { | ||||
| \   'name': 'eslint', | ||||
| \   'executable_callback': 'ale#handlers#eslint#GetExecutable', | ||||
| \   'command_callback': 'ale#handlers#eslint#GetCommand', | ||||
| \   'callback': 'ale#handlers#eslint#Handle', | ||||
| \}) | ||||
| @ -1,117 +0,0 @@ | ||||
| " Author: Zach Perrault -- @zperrault | ||||
| " Description: FlowType checking for JavaScript files | ||||
| 
 | ||||
| call ale#Set('javascript_flow_executable', 'flow') | ||||
| call ale#Set('javascript_flow_use_global', 0) | ||||
| 
 | ||||
| function! ale_linters#javascript#flow#GetExecutable(buffer) abort | ||||
|     return ale#node#FindExecutable(a:buffer, 'javascript_flow', [ | ||||
|     \   'node_modules/.bin/flow', | ||||
|     \]) | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#javascript#flow#VersionCheck(buffer) abort | ||||
|     return ale#Escape(ale_linters#javascript#flow#GetExecutable(a:buffer)) | ||||
|     \   . ' --version' | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#javascript#flow#GetCommand(buffer, version_lines) abort | ||||
|     let l:flow_config = ale#path#FindNearestFile(a:buffer, '.flowconfig') | ||||
| 
 | ||||
|     if empty(l:flow_config) | ||||
|         " Don't run Flow if we can't find a .flowconfig file. | ||||
|         return '' | ||||
|     endif | ||||
| 
 | ||||
|     let l:use_respect_pragma = 1 | ||||
| 
 | ||||
|     " If we can parse the version number, then only use --respect-pragma | ||||
|     " if the version is >= 0.36.0, which added the argument. | ||||
|     for l:match in ale#util#GetMatches(a:version_lines, '\v\d+\.\d+\.\d+$') | ||||
|         let l:use_respect_pragma = ale#semver#GreaterOrEqual( | ||||
|         \   ale#semver#Parse(l:match[0]), | ||||
|         \   [0, 36, 0] | ||||
|         \) | ||||
|     endfor | ||||
| 
 | ||||
|     return ale#Escape(ale_linters#javascript#flow#GetExecutable(a:buffer)) | ||||
|     \   . ' check-contents' | ||||
|     \   . (l:use_respect_pragma ? ' --respect-pragma': '') | ||||
|     \   . ' --json --from ale %s' | ||||
| endfunction | ||||
| 
 | ||||
| " Filter lines of flow output until we find the first line where the JSON | ||||
| " output starts. | ||||
| function! s:GetJSONLines(lines) abort | ||||
|     let l:start_index = 0 | ||||
| 
 | ||||
|     for l:line in a:lines | ||||
|         if l:line[:0] is# '{' | ||||
|             break | ||||
|         endif | ||||
| 
 | ||||
|         let l:start_index += 1 | ||||
|     endfor | ||||
| 
 | ||||
|     return a:lines[l:start_index :] | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#javascript#flow#Handle(buffer, lines) abort | ||||
|     let l:str = join(s:GetJSONLines(a:lines), '') | ||||
| 
 | ||||
|     if empty(l:str) | ||||
|         return [] | ||||
|     endif | ||||
| 
 | ||||
|     let l:flow_output = json_decode(l:str) | ||||
|     let l:output = [] | ||||
| 
 | ||||
|     for l:error in get(l:flow_output, 'errors', []) | ||||
|         " Each error is broken up into parts | ||||
|         let l:text = '' | ||||
|         let l:line = 0 | ||||
|         let l:col = 0 | ||||
| 
 | ||||
|         for l:message in l:error.message | ||||
|             " Comments have no line of column information, so we skip them. | ||||
|             " In certain cases, `l:message.loc.source` points to a different path | ||||
|             " than the buffer one, thus we skip this loc information too. | ||||
|             if has_key(l:message, 'loc') | ||||
|             \&& l:line is# 0 | ||||
|             \&& ale#path#IsBufferPath(a:buffer, l:message.loc.source) | ||||
|                 let l:line = l:message.loc.start.line + 0 | ||||
|                 let l:col = l:message.loc.start.column + 0 | ||||
|             endif | ||||
| 
 | ||||
|             if l:text is# '' | ||||
|                 let l:text = l:message.descr . ':' | ||||
|             else | ||||
|                 let l:text = l:text . ' ' . l:message.descr | ||||
|             endif | ||||
|         endfor | ||||
| 
 | ||||
|         if has_key(l:error, 'operation') | ||||
|             let l:text = l:text . ' See also: ' . l:error.operation.descr | ||||
|         endif | ||||
| 
 | ||||
|         call add(l:output, { | ||||
|         \   'lnum': l:line, | ||||
|         \   'col': l:col, | ||||
|         \   'text': l:text, | ||||
|         \   'type': l:error.level is# 'error' ? 'E' : 'W', | ||||
|         \}) | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('javascript', { | ||||
| \   'name': 'flow', | ||||
| \   'executable_callback': 'ale_linters#javascript#flow#GetExecutable', | ||||
| \   'command_chain': [ | ||||
| \       {'callback': 'ale_linters#javascript#flow#VersionCheck'}, | ||||
| \       {'callback': 'ale_linters#javascript#flow#GetCommand'}, | ||||
| \   ], | ||||
| \   'callback': 'ale_linters#javascript#flow#Handle', | ||||
| \   'add_newline': !has('win32'), | ||||
| \}) | ||||
| @ -1,63 +0,0 @@ | ||||
| " Author: Chris Kyrouac - https://github.com/fijshion | ||||
| " Description: jscs for JavaScript files | ||||
| 
 | ||||
| call ale#Set('javascript_jscs_executable', 'jscs') | ||||
| call ale#Set('javascript_jscs_use_global', 0) | ||||
| 
 | ||||
| function! ale_linters#javascript#jscs#GetExecutable(buffer) abort | ||||
|     return ale#node#FindExecutable(a:buffer, 'javascript_jscs', [ | ||||
|     \   'node_modules/.bin/jscs', | ||||
|     \]) | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#javascript#jscs#GetCommand(buffer) abort | ||||
|     " Search for a local JShint config locaation, and default to a global one. | ||||
|     let l:jscs_config = ale#path#ResolveLocalPath( | ||||
|     \   a:buffer, | ||||
|     \   '.jscsrc', | ||||
|     \   get(g:, 'ale_jscs_config_loc', '') | ||||
|     \) | ||||
| 
 | ||||
|     let l:command = ale#Escape(ale_linters#javascript#jscs#GetExecutable(a:buffer)) | ||||
|     let l:command .= ' --reporter inline --no-colors' | ||||
| 
 | ||||
|     if !empty(l:jscs_config) | ||||
|         let l:command .= ' --config ' . ale#Escape(l:jscs_config) | ||||
|     endif | ||||
| 
 | ||||
|     let l:command .= ' -' | ||||
| 
 | ||||
|     return l:command | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#javascript#jscs#Handle(buffer, lines) abort | ||||
|     " Matches patterns looking like the following | ||||
|     " | ||||
|     " foobar.js: line 2, col 1, Expected indentation of 1 characters | ||||
|     " | ||||
|     let l:pattern = '^.*:\s\+line \(\d\+\),\s\+col\s\+\(\d\+\),\s\+\(.*\)$' | ||||
|     let l:output = [] | ||||
|     let l:m = ale#util#GetMatches(a:lines, [l:pattern]) | ||||
| 
 | ||||
|     for l:match in l:m | ||||
|         let l:text = l:match[3] | ||||
| 
 | ||||
|         let l:obj = { | ||||
|         \   'lnum': l:match[1] + 0, | ||||
|         \   'col': l:match[2] + 0, | ||||
|         \   'text': l:match[3] | ||||
|         \} | ||||
| 
 | ||||
|         call add(l:output, l:obj) | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('javascript', { | ||||
| \   'name': 'jscs', | ||||
| \   'executable_callback': 'ale_linters#javascript#jscs#GetExecutable', | ||||
| \   'command_callback': 'ale_linters#javascript#jscs#GetCommand', | ||||
| \   'callback': 'ale_linters#javascript#jscs#Handle', | ||||
| \}) | ||||
| 
 | ||||
| @ -1,38 +0,0 @@ | ||||
| " Author: Chris Kyrouac - https://github.com/fijshion | ||||
| " Description: JSHint for Javascript files | ||||
| 
 | ||||
| call ale#Set('javascript_jshint_executable', 'jshint') | ||||
| call ale#Set('javascript_jshint_use_global', 0) | ||||
| 
 | ||||
| function! ale_linters#javascript#jshint#GetExecutable(buffer) abort | ||||
|     return ale#node#FindExecutable(a:buffer, 'javascript_jshint', [ | ||||
|     \   'node_modules/.bin/jshint', | ||||
|     \]) | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#javascript#jshint#GetCommand(buffer) abort | ||||
|     " Search for a local JShint config locaation, and default to a global one. | ||||
|     let l:jshint_config = ale#path#ResolveLocalPath( | ||||
|     \   a:buffer, | ||||
|     \   '.jshintrc', | ||||
|     \   get(g:, 'ale_jshint_config_loc', '') | ||||
|     \) | ||||
| 
 | ||||
|     let l:command = ale#Escape(ale_linters#javascript#jshint#GetExecutable(a:buffer)) | ||||
|     let l:command .= ' --reporter unix --extract auto' | ||||
| 
 | ||||
|     if !empty(l:jshint_config) | ||||
|         let l:command .= ' --config ' . ale#Escape(l:jshint_config) | ||||
|     endif | ||||
| 
 | ||||
|     let l:command .= ' -' | ||||
| 
 | ||||
|     return l:command | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('javascript', { | ||||
| \   'name': 'jshint', | ||||
| \   'executable_callback': 'ale_linters#javascript#jshint#GetExecutable', | ||||
| \   'command_callback': 'ale_linters#javascript#jshint#GetCommand', | ||||
| \   'callback': 'ale#handlers#unix#HandleAsError', | ||||
| \}) | ||||
| @ -1,30 +0,0 @@ | ||||
| " Author: Ahmed El Gabri <@ahmedelgabri> | ||||
| " Description: standardjs for JavaScript files | ||||
| 
 | ||||
| call ale#Set('javascript_standard_executable', 'standard') | ||||
| call ale#Set('javascript_standard_use_global', 0) | ||||
| call ale#Set('javascript_standard_options', '') | ||||
| 
 | ||||
| function! ale_linters#javascript#standard#GetExecutable(buffer) abort | ||||
|     return ale#node#FindExecutable(a:buffer, 'javascript_standard', [ | ||||
|     \   'node_modules/standard/bin/cmd.js', | ||||
|     \   'node_modules/.bin/standard', | ||||
|     \]) | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#javascript#standard#GetCommand(buffer) abort | ||||
|     let l:executable = ale_linters#javascript#standard#GetExecutable(a:buffer) | ||||
|     let l:options = ale#Var(a:buffer, 'javascript_standard_options') | ||||
| 
 | ||||
|     return ale#node#Executable(a:buffer, l:executable) | ||||
|     \   . (!empty(l:options) ? ' ' . l:options : '') | ||||
|     \   . ' --stdin %s' | ||||
| endfunction | ||||
| 
 | ||||
| " standard uses eslint and the output format is the same | ||||
| call ale#linter#Define('javascript', { | ||||
| \   'name': 'standard', | ||||
| \   'executable_callback': 'ale_linters#javascript#standard#GetExecutable', | ||||
| \   'command_callback': 'ale_linters#javascript#standard#GetCommand', | ||||
| \   'callback': 'ale#handlers#eslint#Handle', | ||||
| \}) | ||||
| @ -1,26 +0,0 @@ | ||||
| " Author: Daniel Lupu <lupu.daniel.f@gmail.com> | ||||
| " Description: xo for JavaScript files | ||||
| 
 | ||||
| call ale#Set('javascript_xo_executable', 'xo') | ||||
| call ale#Set('javascript_xo_use_global', 0) | ||||
| call ale#Set('javascript_xo_options', '') | ||||
| 
 | ||||
| function! ale_linters#javascript#xo#GetExecutable(buffer) abort | ||||
|     return ale#node#FindExecutable(a:buffer, 'javascript_xo', [ | ||||
|     \   'node_modules/.bin/xo', | ||||
|     \]) | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#javascript#xo#GetCommand(buffer) abort | ||||
|     return ale#Escape(ale_linters#javascript#xo#GetExecutable(a:buffer)) | ||||
|     \   . ' ' . ale#Var(a:buffer, 'javascript_xo_options') | ||||
|     \   . ' --reporter unix --stdin --stdin-filename %s' | ||||
| endfunction | ||||
| 
 | ||||
| " xo uses eslint and the output format is the same | ||||
| call ale#linter#Define('javascript', { | ||||
| \   'name': 'xo', | ||||
| \   'executable_callback': 'ale_linters#javascript#xo#GetExecutable', | ||||
| \   'command_callback': 'ale_linters#javascript#xo#GetCommand', | ||||
| \   'callback': 'ale#handlers#eslint#Handle', | ||||
| \}) | ||||
| @ -1,27 +0,0 @@ | ||||
| " Author: KabbAmine <amine.kabb@gmail.com> | ||||
| 
 | ||||
| function! ale_linters#json#jsonlint#Handle(buffer, lines) abort | ||||
|     " Matches patterns like the following: | ||||
|     " line 2, col 15, found: 'STRING' - expected: 'EOF', '}', ',', ']'. | ||||
| 
 | ||||
|     let l:pattern = '^line \(\d\+\), col \(\d*\), \(.\+\)$' | ||||
|     let l:output = [] | ||||
| 
 | ||||
|     for l:match in ale#util#GetMatches(a:lines, l:pattern) | ||||
|         call add(l:output, { | ||||
|         \   'lnum': l:match[1] + 0, | ||||
|         \   'col': l:match[2] + 0, | ||||
|         \   'text': l:match[3], | ||||
|         \}) | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('json', { | ||||
| \   'name': 'jsonlint', | ||||
| \   'executable': 'jsonlint', | ||||
| \   'output_stream': 'stderr', | ||||
| \   'command': 'jsonlint --compact -', | ||||
| \   'callback': 'ale_linters#json#jsonlint#Handle', | ||||
| \}) | ||||
| @ -1,170 +0,0 @@ | ||||
| " Author: Francis Agyapong <francisgyapong2@gmail.com> | ||||
| " Description: A linter for the Kotlin programming language that uses kotlinc | ||||
| 
 | ||||
| let g:ale_kotlin_kotlinc_options = get(g:, 'ale_kotlin_kotlinc_options', '') | ||||
| let g:ale_kotlin_kotlinc_enable_config = get(g:, 'ale_kotlin_kotlinc_enable_config', 0) | ||||
| let g:ale_kotlin_kotlinc_config_file = get(g:, 'ale_kotlin_kotlinc_config_file', '.ale_kotlinc_config') | ||||
| let g:ale_kotlin_kotlinc_classpath = get(g:, 'ale_kotlin_kotlinc_classpath', '') | ||||
| let g:ale_kotlin_kotlinc_sourcepath = get(g:, 'ale_kotlin_kotlinc_sourcepath', '') | ||||
| let g:ale_kotlin_kotlinc_use_module_file = get(g:, 'ale_kotlin_kotlinc_use_module_file', 0) | ||||
| let g:ale_kotlin_kotlinc_module_filename = get(g:, 'ale_kotlin_kotlinc_module_filename', 'module.xml') | ||||
| 
 | ||||
| let s:classpath_sep = has('unix') ? ':' : ';' | ||||
| 
 | ||||
| function! ale_linters#kotlin#kotlinc#GetImportPaths(buffer) abort | ||||
|     " exec maven/gradle only if classpath is not set | ||||
|     if ale#Var(a:buffer, 'kotlin_kotlinc_classpath') isnot# '' | ||||
|         return '' | ||||
|     else | ||||
|         let l:pom_path = ale#path#FindNearestFile(a:buffer, 'pom.xml') | ||||
|         if !empty(l:pom_path) && executable('mvn') | ||||
|             return ale#path#CdString(fnamemodify(l:pom_path, ':h')) | ||||
|                         \ . 'mvn dependency:build-classpath' | ||||
|         endif | ||||
| 
 | ||||
|         let l:classpath_command = ale#gradle#BuildClasspathCommand(a:buffer) | ||||
|         if !empty(l:classpath_command) | ||||
|             return l:classpath_command | ||||
|         endif | ||||
| 
 | ||||
|         return '' | ||||
|     endif | ||||
| endfunction | ||||
| 
 | ||||
| function! s:BuildClassPathOption(buffer, import_paths) abort | ||||
|     " Filter out lines like [INFO], etc. | ||||
|     let l:class_paths = filter(a:import_paths[:], 'v:val !~# ''[''') | ||||
|     call extend( | ||||
|     \   l:class_paths, | ||||
|     \   split(ale#Var(a:buffer, 'kotlin_kotlinc_classpath'), s:classpath_sep), | ||||
|     \) | ||||
| 
 | ||||
|     return !empty(l:class_paths) | ||||
|     \   ? ' -cp ' . ale#Escape(join(l:class_paths, s:classpath_sep)) | ||||
|     \   : '' | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#kotlin#kotlinc#GetCommand(buffer, import_paths) abort | ||||
|     let l:kotlinc_opts = ale#Var(a:buffer, 'kotlin_kotlinc_options') | ||||
|     let l:command = 'kotlinc ' | ||||
| 
 | ||||
|     " If the config file is enabled and readable, source it | ||||
|     if ale#Var(a:buffer, 'kotlin_kotlinc_enable_config') | ||||
|         let l:conf = expand(ale#Var(a:buffer, 'kotlin_kotlinc_config_file'), 1) | ||||
| 
 | ||||
|         if filereadable(l:conf) | ||||
|             execute 'source ' . fnameescape(l:conf) | ||||
|         endif | ||||
|     endif | ||||
| 
 | ||||
|     " If use module and module file is readable use that and return | ||||
|     if ale#Var(a:buffer, 'kotlin_kotlinc_use_module_file') | ||||
|         let l:module_filename = ale#Escape(expand(ale#Var(a:buffer, 'kotlin_kotlinc_module_filename'), 1)) | ||||
| 
 | ||||
|         if filereadable(l:module_filename) | ||||
|             let l:kotlinc_opts .= ' -module ' . l:module_filename | ||||
|             let l:command .= 'kotlinc ' . l:kotlinc_opts | ||||
| 
 | ||||
|             return l:command | ||||
|         endif | ||||
|     endif | ||||
| 
 | ||||
|     " We only get here if not using module or the module file not readable | ||||
|     if ale#Var(a:buffer, 'kotlin_kotlinc_classpath') isnot# '' | ||||
|         let l:kotlinc_opts .= ' -cp ' . ale#Var(a:buffer, 'kotlin_kotlinc_classpath') | ||||
|     else | ||||
|         " get classpath from maven/gradle | ||||
|         let l:kotlinc_opts .= s:BuildClassPathOption(a:buffer, a:import_paths) | ||||
|     endif | ||||
| 
 | ||||
|     let l:fname = '' | ||||
|     if ale#Var(a:buffer, 'kotlin_kotlinc_sourcepath') isnot# '' | ||||
|         let l:fname .= expand(ale#Var(a:buffer, 'kotlin_kotlinc_sourcepath'), 1) . ' ' | ||||
|     else | ||||
|         " Find the src directory for files in this project. | ||||
| 
 | ||||
|         let l:project_root = ale#gradle#FindProjectRoot(a:buffer) | ||||
|         if !empty(l:project_root) | ||||
|             let l:src_dir = l:project_root | ||||
|         else | ||||
|             let l:src_dir = ale#path#FindNearestDirectory(a:buffer, 'src/main/java') | ||||
|             \   . ' ' . ale#path#FindNearestDirectory(a:buffer, 'src/main/kotlin') | ||||
|         endif | ||||
| 
 | ||||
|         let l:fname .= expand(l:src_dir, 1) . ' ' | ||||
|     endif | ||||
|     let l:fname .= ale#Escape(expand('#' . a:buffer . ':p')) | ||||
|     let l:command .= l:kotlinc_opts . ' ' . l:fname | ||||
| 
 | ||||
|     return l:command | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#kotlin#kotlinc#Handle(buffer, lines) abort | ||||
|     let l:code_pattern = '^\(.*\):\([0-9]\+\):\([0-9]\+\):\s\+\(error\|warning\):\s\+\(.*\)' | ||||
|     let l:general_pattern = '^\(warning\|error\|info\):\s*\(.*\)' | ||||
|     let l:output = [] | ||||
| 
 | ||||
|     for l:line in a:lines | ||||
|         let l:match = matchlist(l:line, l:code_pattern) | ||||
| 
 | ||||
|         if len(l:match) == 0 | ||||
|             continue | ||||
|         endif | ||||
| 
 | ||||
|         let l:file = l:match[1] | ||||
|         let l:line = l:match[2] + 0 | ||||
|         let l:column = l:match[3] + 0 | ||||
|         let l:type = l:match[4] | ||||
|         let l:text = l:match[5] | ||||
| 
 | ||||
|         let l:buf_abspath = fnamemodify(l:file, ':p') | ||||
|         let l:curbuf_abspath = expand('#' . a:buffer . ':p') | ||||
| 
 | ||||
|         " Skip if file is not loaded | ||||
|         if l:buf_abspath isnot# l:curbuf_abspath | ||||
|             continue | ||||
|         endif | ||||
|         let l:type_marker_str = l:type is# 'warning' ? 'W' : 'E' | ||||
| 
 | ||||
|         call add(l:output, { | ||||
|         \   'lnum': l:line, | ||||
|         \   'col': l:column, | ||||
|         \   'text': l:text, | ||||
|         \   'type': l:type_marker_str, | ||||
|         \}) | ||||
|     endfor | ||||
| 
 | ||||
|     " Non-code related messages | ||||
|     for l:line in a:lines | ||||
|         let l:match = matchlist(l:line, l:general_pattern) | ||||
| 
 | ||||
|         if len(l:match) == 0 | ||||
|             continue | ||||
|         endif | ||||
| 
 | ||||
|         let l:type = l:match[1] | ||||
|         let l:text = l:match[2] | ||||
| 
 | ||||
|         let l:type_marker_str = l:type is# 'warning' || l:type is# 'info' ? 'W' : 'E' | ||||
| 
 | ||||
|         call add(l:output, { | ||||
|         \   'lnum': 1, | ||||
|         \   'text': l:text, | ||||
|         \   'type': l:type_marker_str, | ||||
|         \}) | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('kotlin', { | ||||
| \   'name': 'kotlinc', | ||||
| \   'executable': 'kotlinc', | ||||
| \   'command_chain': [ | ||||
| \       {'callback': 'ale_linters#kotlin#kotlinc#GetImportPaths', 'output_stream': 'stdout'}, | ||||
| \       {'callback': 'ale_linters#kotlin#kotlinc#GetCommand', 'output_stream': 'stderr'}, | ||||
| \   ], | ||||
| \   'callback': 'ale_linters#kotlin#kotlinc#Handle', | ||||
| \   'lint_file': 1, | ||||
| \}) | ||||
| 
 | ||||
| @ -1,54 +0,0 @@ | ||||
| " Author: Francis Agyapong <francisagyapong2@gmail.com> | ||||
| " Description: Lint kotlin files using ktlint | ||||
| 
 | ||||
| call ale#Set('kotlin_ktlint_executable', 'ktlint') | ||||
| call ale#Set('kotlin_ktlint_rulesets', []) | ||||
| call ale#Set('kotlin_ktlint_format', 0) | ||||
| 
 | ||||
| 
 | ||||
| function! ale_linters#kotlin#ktlint#GetCommand(buffer) abort | ||||
|     let l:executable = ale#Var(a:buffer, 'kotlin_ktlint_executable') | ||||
|     let l:file_path = expand('#' . a:buffer . ':p') | ||||
|     let l:options = '' | ||||
| 
 | ||||
|     " Formmatted content written to original file, not sure how to handle | ||||
|     " if ale#Var(a:buffer, 'kotlin_ktlint_format') | ||||
|     "     let l:options = l:options . ' --format' | ||||
|     " endif | ||||
| 
 | ||||
|     for l:ruleset in ale#Var(a:buffer, 'kotlin_ktlint_rulesets') | ||||
|         let l:options = l:options . ' --ruleset ' . l:ruleset | ||||
|     endfor | ||||
| 
 | ||||
|     return l:executable . ' ' . l:options . ' ' . l:file_path | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#kotlin#ktlint#Handle(buffer, lines) abort | ||||
|     let l:message_pattern = '^\(.*\):\([0-9]\+\):\([0-9]\+\):\s\+\(.*\)' | ||||
|     let l:output = [] | ||||
| 
 | ||||
|     for l:match in ale#util#GetMatches(a:lines, l:message_pattern) | ||||
|         let l:line = l:match[2] + 0 | ||||
|         let l:column = l:match[3] + 0 | ||||
|         let l:text = l:match[4] | ||||
| 
 | ||||
|         let l:type = l:text =~? 'not a valid kotlin file' ? 'E' : 'W' | ||||
| 
 | ||||
|         call add(l:output, { | ||||
|         \   'lnum': l:line, | ||||
|         \   'col': l:column, | ||||
|         \   'text': l:text, | ||||
|         \   'type': l:type | ||||
|         \}) | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('kotlin', { | ||||
| \   'name': 'ktlint', | ||||
| \   'executable': 'ktlint', | ||||
| \   'command_callback': 'ale_linters#kotlin#ktlint#GetCommand', | ||||
| \   'callback': 'ale_linters#kotlin#ktlint#Handle', | ||||
| \   'lint_file': 1 | ||||
| \}) | ||||
| @ -1,45 +0,0 @@ | ||||
| " Author: Sol Bekic https://github.com/s-ol | ||||
| " Description: luacheck linter for lua files | ||||
| 
 | ||||
| let g:ale_lua_luacheck_executable = | ||||
| \   get(g:, 'ale_lua_luacheck_executable', 'luacheck') | ||||
| 
 | ||||
| let g:ale_lua_luacheck_options = | ||||
| \   get(g:, 'ale_lua_luacheck_options', '') | ||||
| 
 | ||||
| function! ale_linters#lua#luacheck#GetExecutable(buffer) abort | ||||
|     return ale#Var(a:buffer, 'lua_luacheck_executable') | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#lua#luacheck#GetCommand(buffer) abort | ||||
|     return ale#Escape(ale_linters#lua#luacheck#GetExecutable(a:buffer)) | ||||
|     \   . ' ' . ale#Var(a:buffer, 'lua_luacheck_options') | ||||
|     \   . ' --formatter plain --codes --filename %s -' | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#lua#luacheck#Handle(buffer, lines) abort | ||||
|     " Matches patterns line the following: | ||||
|     " | ||||
|     " artal.lua:159:17: (W111) shadowing definition of loop variable 'i' on line 106 | ||||
|     " artal.lua:182:7: (W213) unused loop variable 'i' | ||||
|     let l:pattern = '^.*:\(\d\+\):\(\d\+\): (\([WE]\)\(\d\+\)) \(.\+\)$' | ||||
|     let l:output = [] | ||||
| 
 | ||||
|     for l:match in ale#util#GetMatches(a:lines, l:pattern) | ||||
|         call add(l:output, { | ||||
|         \   'lnum': l:match[1] + 0, | ||||
|         \   'col': l:match[2] + 0, | ||||
|         \   'text': l:match[3] . l:match[4] . ': ' . l:match[5], | ||||
|         \   'type': l:match[3], | ||||
|         \}) | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('lua', { | ||||
| \   'name': 'luacheck', | ||||
| \   'executable_callback': 'ale_linters#lua#luacheck#GetExecutable', | ||||
| \   'command_callback': 'ale_linters#lua#luacheck#GetCommand', | ||||
| \   'callback': 'ale_linters#lua#luacheck#Handle', | ||||
| \}) | ||||
| @ -1,25 +0,0 @@ | ||||
| " Author: Steve Dignam <steve@dignam.xyz> | ||||
| " Description: Support for mdl, a markdown linter | ||||
| 
 | ||||
| function! ale_linters#markdown#mdl#Handle(buffer, lines) abort | ||||
|     " matches: '(stdin):173: MD004 Unordered list style' | ||||
|     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, | ||||
|         \   'text': l:match[2], | ||||
|         \   'type': 'W', | ||||
|         \}) | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('markdown', { | ||||
| \   'name': 'mdl', | ||||
| \   'executable': 'mdl', | ||||
| \   'command': 'mdl', | ||||
| \   'callback': 'ale_linters#markdown#mdl#Handle' | ||||
| \}) | ||||
| @ -1,9 +0,0 @@ | ||||
| " Author: poohzrn https://github.com/poohzrn | ||||
| " Description: proselint for Markdown files | ||||
| 
 | ||||
| call ale#linter#Define('markdown', { | ||||
| \   'name': 'proselint', | ||||
| \   'executable': 'proselint', | ||||
| \   'command': 'proselint %t', | ||||
| \   'callback': 'ale#handlers#unix#HandleAsWarning', | ||||
| \}) | ||||
| @ -1,9 +0,0 @@ | ||||
| " Author: chew-z https://github.com/chew-z | ||||
| " Description: vale for Markdown files | ||||
| 
 | ||||
| call ale#linter#Define('markdown', { | ||||
| \   'name': 'vale', | ||||
| \   'executable': 'vale', | ||||
| \   'command': 'vale --output=line %t', | ||||
| \   'callback': 'ale#handlers#unix#HandleAsWarning', | ||||
| \}) | ||||
| @ -1,55 +0,0 @@ | ||||
| " Author: awlayton <alex@layton.in> | ||||
| " Description: mlint for MATLAB files | ||||
| 
 | ||||
| let g:ale_matlab_mlint_executable = | ||||
| \   get(g:, 'ale_matlab_mlint_executable', 'mlint') | ||||
| 
 | ||||
| function! ale_linters#matlab#mlint#GetExecutable(buffer) abort | ||||
|     return ale#Var(a:buffer, 'matlab_mlint_executable') | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#matlab#mlint#GetCommand(buffer) abort | ||||
|     let l:executable = ale_linters#matlab#mlint#GetExecutable(a:buffer) | ||||
| 
 | ||||
|     return l:executable . ' -id %t' | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#matlab#mlint#Handle(buffer, lines) abort | ||||
|     " Matches patterns like the following: | ||||
|     " | ||||
|     " L 27 (C 1): FNDEF: Terminate statement with semicolon to suppress output. | ||||
|     " L 30 (C 13-15): FNDEF: A quoted string is unterminated. | ||||
|     let l:pattern = '^L \(\d\+\) (C \([0-9-]\+\)): \([A-Z]\+\): \(.\+\)$' | ||||
|     let l:output = [] | ||||
| 
 | ||||
|     for l:match in ale#util#GetMatches(a:lines, l:pattern) | ||||
|         let l:lnum = l:match[1] + 0 | ||||
|         let l:col = l:match[2] + 0 | ||||
|         let l:code = l:match[3] | ||||
|         let l:text = l:match[4] | ||||
| 
 | ||||
|         " Suppress erroneous waring about filename | ||||
|         " TODO: Enable this error when copying filename is supported | ||||
|         if l:code is# 'FNDEF' | ||||
|             continue | ||||
|         endif | ||||
| 
 | ||||
|         call add(l:output, { | ||||
|         \   'bufnr': a:buffer, | ||||
|         \   'lnum': l:lnum, | ||||
|         \   'col': l:col, | ||||
|         \   'text': l:text, | ||||
|         \   'type': 'W', | ||||
|         \}) | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('matlab', { | ||||
| \   'name': 'mlint', | ||||
| \   'executable_callback': 'ale_linters#matlab#mlint#GetExecutable', | ||||
| \   'command_callback': 'ale_linters#matlab#mlint#GetCommand', | ||||
| \   'output_stream': 'stderr', | ||||
| \   'callback': 'ale_linters#matlab#mlint#Handle', | ||||
| \}) | ||||
| @ -1,58 +0,0 @@ | ||||
| " Author: Baabelfish | ||||
| " Description: Typechecking for nim files | ||||
| 
 | ||||
| function! ale_linters#nim#nimcheck#Handle(buffer, lines) abort | ||||
|     let l:buffer_filename = fnamemodify(bufname(a:buffer), ':p:t') | ||||
|     let l:pattern = '^\(.\+\.nim\)(\(\d\+\), \(\d\+\)) \(.\+\)' | ||||
|     let l:output = [] | ||||
| 
 | ||||
|     for l:match in ale#util#GetMatches(a:lines, l:pattern) | ||||
|         " Only show errors of the current buffer | ||||
|         " NOTE: Checking filename only is OK because nim enforces unique | ||||
|         "       module names. | ||||
| 
 | ||||
|         let l:temp_buffer_filename = fnamemodify(l:match[1], ':p:t') | ||||
|         if l:buffer_filename isnot# '' && l:temp_buffer_filename isnot# l:buffer_filename | ||||
|             continue | ||||
|         endif | ||||
| 
 | ||||
|         let l:line = l:match[2] + 0 | ||||
|         let l:column = l:match[3] + 0 | ||||
|         let l:text = l:match[4] | ||||
|         let l:type = 'W' | ||||
| 
 | ||||
|         " Extract error type from message of type 'Error: Some error message' | ||||
|         let l:textmatch = matchlist(l:match[4], '^\(.\{-}\): .\+$') | ||||
| 
 | ||||
|         if len(l:textmatch) > 0 | ||||
|             let l:errortype = l:textmatch[1] | ||||
|             if l:errortype is# 'Error' | ||||
|                 let l:type = 'E' | ||||
|             endif | ||||
|         endif | ||||
| 
 | ||||
|         call add(l:output, { | ||||
|         \   'lnum': l:line, | ||||
|         \   'col': l:column, | ||||
|         \   'text': l:text, | ||||
|         \   'type': l:type, | ||||
|         \}) | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| 
 | ||||
| function! ale_linters#nim#nimcheck#GetCommand(buffer) abort | ||||
|     return 'nim check --verbosity:0 --colors:off --listFullPaths %s' | ||||
| endfunction | ||||
| 
 | ||||
| 
 | ||||
| call ale#linter#Define('nim', { | ||||
| \    'name': 'nimcheck', | ||||
| \    'executable': 'nim', | ||||
| \    'output_stream': 'both', | ||||
| \    'command_callback': 'ale_linters#nim#nimcheck#GetCommand', | ||||
| \    'callback': 'ale_linters#nim#nimcheck#Handle', | ||||
| \    'lint_file': 1, | ||||
| \}) | ||||
| @ -1,26 +0,0 @@ | ||||
| " Author: Alistair Bill <@alibabzo> | ||||
| " Description: nix-instantiate linter for nix files | ||||
| 
 | ||||
| function! ale_linters#nix#nix#Handle(buffer, lines) abort | ||||
|     let l:pattern = '^\(.\+\): \(.\+\), at .*:\(\d\+\):\(\d\+\)$' | ||||
|     let l:output = [] | ||||
| 
 | ||||
|     for l:match in ale#util#GetMatches(a:lines, l:pattern) | ||||
|         call add(l:output, { | ||||
|         \   'lnum': l:match[3] + 0, | ||||
|         \   'col': l:match[4] + 0, | ||||
|         \   'text': l:match[1] . ': ' . l:match[2], | ||||
|         \   'type': l:match[1] =~# '^error' ? 'E' : 'W', | ||||
|         \}) | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('nix', { | ||||
| \   'name': 'nix', | ||||
| \   'output_stream': 'stderr', | ||||
| \   'executable': 'nix-instantiate', | ||||
| \   'command': 'nix-instantiate --parse -', | ||||
| \   'callback': 'ale_linters#nix#nix#Handle', | ||||
| \}) | ||||
| @ -1,9 +0,0 @@ | ||||
| " Author: Daniel M. Capella https://github.com/polyzen | ||||
| " Description: proselint for nroff files | ||||
| 
 | ||||
| call ale#linter#Define('nroff', { | ||||
| \   'name': 'proselint', | ||||
| \   'executable': 'proselint', | ||||
| \   'command': 'proselint %t', | ||||
| \   'callback': 'ale#handlers#unix#HandleAsWarning', | ||||
| \}) | ||||
| @ -1,23 +0,0 @@ | ||||
| " Author: Bang Lee <https://github.com/Qusic> | ||||
| " Description: clang linter for objc files | ||||
| 
 | ||||
| " Set this option to change the Clang options for warnings for ObjC. | ||||
| if !exists('g:ale_objc_clang_options') | ||||
|     let g:ale_objc_clang_options = '-std=c11 -Wall' | ||||
| endif | ||||
| 
 | ||||
| function! ale_linters#objc#clang#GetCommand(buffer) abort | ||||
|     " -iquote with the directory the file is in makes #include work for | ||||
|     "  headers in the same directory. | ||||
|     return 'clang -S -x objective-c -fsyntax-only ' | ||||
|     \   . '-iquote ' . ale#Escape(fnamemodify(bufname(a:buffer), ':p:h')) | ||||
|     \   . ' ' . ale#Var(a:buffer, 'objc_clang_options') . ' -' | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('objc', { | ||||
| \   'name': 'clang', | ||||
| \   'output_stream': 'stderr', | ||||
| \   'executable': 'clang', | ||||
| \   'command_callback': 'ale_linters#objc#clang#GetCommand', | ||||
| \   'callback': 'ale#handlers#gcc#HandleGCCFormat', | ||||
| \}) | ||||
| @ -1,23 +0,0 @@ | ||||
| " Author: Bang Lee <https://github.com/Qusic> | ||||
| " Description: clang linter for objcpp files | ||||
| 
 | ||||
| " Set this option to change the Clang options for warnings for ObjCPP. | ||||
| if !exists('g:ale_objcpp_clang_options') | ||||
|     let g:ale_objcpp_clang_options = '-std=c++14 -Wall' | ||||
| endif | ||||
| 
 | ||||
| function! ale_linters#objcpp#clang#GetCommand(buffer) abort | ||||
|     " -iquote with the directory the file is in makes #include work for | ||||
|     "  headers in the same directory. | ||||
|     return 'clang++ -S -x objective-c++ -fsyntax-only ' | ||||
|     \   . '-iquote ' . ale#Escape(fnamemodify(bufname(a:buffer), ':p:h')) | ||||
|     \   . ' ' . ale#Var(a:buffer, 'objcpp_clang_options') . ' -' | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('objcpp', { | ||||
| \   'name': 'clang', | ||||
| \   'output_stream': 'stderr', | ||||
| \   'executable': 'clang++', | ||||
| \   'command_callback': 'ale_linters#objcpp#clang#GetCommand', | ||||
| \   'callback': 'ale#handlers#gcc#HandleGCCFormat', | ||||
| \}) | ||||
| @ -1,17 +0,0 @@ | ||||
| " Author: Andrey Popp -- @andreypopp | ||||
| " Description: Report errors in OCaml code with Merlin | ||||
| 
 | ||||
| if !exists('g:merlin') | ||||
|     finish | ||||
| endif | ||||
| 
 | ||||
| function! ale_linters#ocaml#merlin#Handle(buffer, lines) abort | ||||
|     return merlin#ErrorLocList() | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('ocaml', { | ||||
| \   'name': 'merlin', | ||||
| \   'executable': 'ocamlmerlin', | ||||
| \   'command': 'true', | ||||
| \   'callback': 'ale_linters#ocaml#merlin#Handle', | ||||
| \}) | ||||
| @ -1,58 +0,0 @@ | ||||
| " Author: Vincent Lequertier <https://github.com/SkySymbol> | ||||
| " Description: This file adds support for checking perl syntax | ||||
| 
 | ||||
| let g:ale_perl_perl_executable = | ||||
| \   get(g:, 'ale_perl_perl_executable', 'perl') | ||||
| 
 | ||||
| let g:ale_perl_perl_options = | ||||
| \   get(g:, 'ale_perl_perl_options', '-c -Mwarnings -Ilib') | ||||
| 
 | ||||
| function! ale_linters#perl#perl#GetExecutable(buffer) abort | ||||
|     return ale#Var(a:buffer, 'perl_perl_executable') | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#perl#perl#GetCommand(buffer) abort | ||||
|     return ale_linters#perl#perl#GetExecutable(a:buffer) | ||||
|     \   . ' ' . ale#Var(a:buffer, 'perl_perl_options') | ||||
|     \   . ' %t' | ||||
| endfunction | ||||
| 
 | ||||
| let s:begin_failed_skip_pattern = '\v' . join([ | ||||
| \   '^Compilation failed in require', | ||||
| \   '^Can''t locate', | ||||
| \], '|') | ||||
| 
 | ||||
| function! ale_linters#perl#perl#Handle(buffer, lines) abort | ||||
|     let l:pattern = '\(.\+\) at \(.\+\) line \(\d\+\)' | ||||
|     let l:output = [] | ||||
|     let l:basename = expand('#' . a:buffer . ':t') | ||||
| 
 | ||||
|     for l:match in ale#util#GetMatches(a:lines, l:pattern) | ||||
|         let l:line = l:match[3] | ||||
|         let l:text = l:match[1] | ||||
|         let l:type = 'E' | ||||
| 
 | ||||
|         if ale#path#IsBufferPath(a:buffer, l:match[2]) | ||||
|         \ && ( | ||||
|         \   l:text isnot# 'BEGIN failed--compilation aborted' | ||||
|         \   || empty(l:output) | ||||
|         \   || match(l:output[-1].text, s:begin_failed_skip_pattern) < 0 | ||||
|         \ ) | ||||
|             call add(l:output, { | ||||
|             \   'lnum': l:line, | ||||
|             \   'text': l:text, | ||||
|             \   'type': l:type, | ||||
|             \}) | ||||
|         endif | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('perl', { | ||||
| \   'name': 'perl', | ||||
| \   'executable_callback': 'ale_linters#perl#perl#GetExecutable', | ||||
| \   'output_stream': 'both', | ||||
| \   'command_callback': 'ale_linters#perl#perl#GetCommand', | ||||
| \   'callback': 'ale_linters#perl#perl#Handle', | ||||
| \}) | ||||
| @ -1,76 +0,0 @@ | ||||
| " Author: Vincent Lequertier <https://github.com/SkySymbol>, Chris Weyl <cweyl@alumni.drew.edu> | ||||
| " Description: This file adds support for checking perl with perl critic | ||||
| 
 | ||||
| let g:ale_perl_perlcritic_executable = | ||||
| \   get(g:, 'ale_perl_perlcritic_executable', 'perlcritic') | ||||
| 
 | ||||
| let g:ale_perl_perlcritic_profile = | ||||
| \   get(g:, 'ale_perl_perlcritic_profile', '.perlcriticrc') | ||||
| 
 | ||||
| let g:ale_perl_perlcritic_options = | ||||
| \   get(g:, 'ale_perl_perlcritic_options', '') | ||||
| 
 | ||||
| let g:ale_perl_perlcritic_showrules = | ||||
| \   get(g:, 'ale_perl_perlcritic_showrules', 0) | ||||
| 
 | ||||
| function! ale_linters#perl#perlcritic#GetExecutable(buffer) abort | ||||
|     return ale#Var(a:buffer, 'perl_perlcritic_executable') | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#perl#perlcritic#GetProfile(buffer) abort | ||||
| 
 | ||||
|     " first see if we've been overridden | ||||
|     let l:profile = ale#Var(a:buffer, 'perl_perlcritic_profile') | ||||
|     if l:profile is? '' | ||||
|         return '' | ||||
|     endif | ||||
| 
 | ||||
|     " otherwise, iterate upwards to find it | ||||
|     return ale#path#FindNearestFile(a:buffer, l:profile) | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#perl#perlcritic#GetCommand(buffer) abort | ||||
|     let l:critic_verbosity = '%l:%c %m\n' | ||||
|     if ale#Var(a:buffer, 'perl_perlcritic_showrules') | ||||
|         let l:critic_verbosity = '%l:%c %m [%p]\n' | ||||
|     endif | ||||
| 
 | ||||
|     let l:profile = ale_linters#perl#perlcritic#GetProfile(a:buffer) | ||||
|     let l:options = ale#Var(a:buffer, 'perl_perlcritic_options') | ||||
| 
 | ||||
|     let l:command = ale#Escape(ale_linters#perl#perlcritic#GetExecutable(a:buffer)) | ||||
|     \   . " --verbose '". l:critic_verbosity . "' --nocolor" | ||||
| 
 | ||||
|     if l:profile isnot? '' | ||||
|         let l:command .= ' --profile ' . ale#Escape(l:profile) | ||||
|     endif | ||||
|     if l:options isnot? '' | ||||
|         let l:command .= ' ' . l:options | ||||
|     endif | ||||
| 
 | ||||
|     return l:command | ||||
| endfunction | ||||
| 
 | ||||
| 
 | ||||
| function! ale_linters#perl#perlcritic#Handle(buffer, lines) abort | ||||
|     let l:pattern = '\(\d\+\):\(\d\+\) \(.\+\)' | ||||
|     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], | ||||
|         \   'text': l:match[3], | ||||
|         \}) | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('perl', { | ||||
| \   'name': 'perlcritic', | ||||
| \   'output_stream': 'stdout', | ||||
| \   'executable_callback': 'ale_linters#perl#perlcritic#GetExecutable', | ||||
| \   'command_callback': 'ale_linters#perl#perlcritic#GetCommand', | ||||
| \   'callback': 'ale_linters#perl#perlcritic#Handle', | ||||
| \}) | ||||
| @ -1,28 +0,0 @@ | ||||
| " Author: Zefei Xuan <https://github.com/zefei> | ||||
| " Description: Hack type checking (http://hacklang.org/) | ||||
| 
 | ||||
| function! ale_linters#php#hack#Handle(buffer, lines) abort | ||||
|     let l:pattern = '^\(.*\):\(\d\+\):\(\d\+\),\(\d\+\): \(.\+])\)$' | ||||
|     let l:output = [] | ||||
| 
 | ||||
|     for l:match in ale#util#GetMatches(a:lines, l:pattern) | ||||
|         if a:buffer != bufnr(l:match[1]) | ||||
|             continue | ||||
|         endif | ||||
| 
 | ||||
|         call add(l:output, { | ||||
|         \   'lnum': l:match[2] + 0, | ||||
|         \   'col': l:match[3] + 0, | ||||
|         \   'text': l:match[5], | ||||
|         \}) | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('php', { | ||||
| \   'name': 'hack', | ||||
| \   'executable': 'hh_client', | ||||
| \   'command': 'hh_client --retries 0 --retry-if-init false', | ||||
| \   'callback': 'ale_linters#php#hack#Handle', | ||||
| \}) | ||||
| @ -1,34 +0,0 @@ | ||||
| " Author: Eric Stern <eric@ericstern.com> | ||||
| " Description: PHP Language server integration for ALE | ||||
| 
 | ||||
| call ale#Set('php_langserver_executable', 'php-language-server.php') | ||||
| call ale#Set('php_langserver_use_global', 0) | ||||
| 
 | ||||
| function! ale_linters#php#langserver#GetExecutable(buffer) abort | ||||
|     return ale#node#FindExecutable(a:buffer, 'php_langserver', [ | ||||
|     \   'vendor/bin/php-language-server.php', | ||||
|     \]) | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#php#langserver#GetCommand(buffer) abort | ||||
|     return 'php ' . ale#Escape(ale_linters#php#langserver#GetExecutable(a:buffer)) | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#php#langserver#GetLanguage(buffer) abort | ||||
|     return 'php' | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#php#langserver#GetProjectRoot(buffer) abort | ||||
|     let l:git_path = ale#path#FindNearestDirectory(a:buffer, '.git') | ||||
| 
 | ||||
|     return !empty(l:git_path) ? fnamemodify(l:git_path, ':h:h') : '' | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('php', { | ||||
| \   'name': 'langserver', | ||||
| \   'lsp': 'stdio', | ||||
| \   'executable_callback': 'ale_linters#php#langserver#GetExecutable', | ||||
| \   'command_callback': 'ale_linters#php#langserver#GetCommand', | ||||
| \   'language_callback': 'ale_linters#php#langserver#GetLanguage', | ||||
| \   'project_root_callback': 'ale_linters#php#langserver#GetProjectRoot', | ||||
| \}) | ||||
| @ -1,35 +0,0 @@ | ||||
| " Author: Spencer Wood <https://github.com/scwood>, Adriaan Zonnenberg <amz@adriaan.xyz> | ||||
| " Description: This file adds support for checking PHP with php-cli | ||||
| 
 | ||||
| function! ale_linters#php#php#Handle(buffer, lines) abort | ||||
|     " Matches patterns like the following: | ||||
|     " | ||||
|     " Parse error:  syntax error, unexpected ';', expecting ']' in - on line 15 | ||||
|     let l:pattern = '\v^%(Fatal|Parse) error:\s+(.+unexpected ''(.+)%(expecting.+)@<!''.*|.+) in - on line (\d+)' | ||||
|     let l:output = [] | ||||
| 
 | ||||
|     for l:match in ale#util#GetMatches(a:lines, l:pattern) | ||||
|         let l:col = empty(l:match[2]) ? 0 : stridx(getline(l:match[3]), l:match[2]) + 1 | ||||
|         let l:obj = { | ||||
|         \   'lnum': l:match[3] + 0, | ||||
|         \   'col': l:col, | ||||
|         \   'text': l:match[1], | ||||
|         \} | ||||
| 
 | ||||
|         if l:col != 0 | ||||
|             let l:obj.end_col = l:col + strlen(l:match[2]) - 1 | ||||
|         endif | ||||
| 
 | ||||
|         call add(l:output, l:obj) | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('php', { | ||||
| \   'name': 'php', | ||||
| \   'executable': 'php', | ||||
| \   'output_stream': 'stdout', | ||||
| \   'command': 'php -l -d error_reporting=E_ALL -d display_errors=1 --', | ||||
| \   'callback': 'ale_linters#php#php#Handle', | ||||
| \}) | ||||
| @ -1,55 +0,0 @@ | ||||
| " Author: jwilliams108 <https://github.com/jwilliams108>, Eric Stern <https://github.com/firehed> | ||||
| " Description: phpcs for PHP files | ||||
| 
 | ||||
| let g:ale_php_phpcs_standard = get(g:, 'ale_php_phpcs_standard', '') | ||||
| 
 | ||||
| call ale#Set('php_phpcs_executable', 'phpcs') | ||||
| call ale#Set('php_phpcs_use_global', 0) | ||||
| 
 | ||||
| function! ale_linters#php#phpcs#GetExecutable(buffer) abort | ||||
|     return ale#node#FindExecutable(a:buffer, 'php_phpcs', [ | ||||
|     \   'vendor/bin/phpcs', | ||||
|     \   'phpcs' | ||||
|     \]) | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#php#phpcs#GetCommand(buffer) abort | ||||
|     let l:executable = ale_linters#php#phpcs#GetExecutable(a:buffer) | ||||
| 
 | ||||
|     let l:standard = ale#Var(a:buffer, 'php_phpcs_standard') | ||||
|     let l:standard_option = !empty(l:standard) | ||||
|     \   ? '--standard=' . l:standard | ||||
|     \   : '' | ||||
| 
 | ||||
|     return ale#Escape(l:executable) | ||||
|     \   . ' -s --report=emacs --stdin-path=%s ' . l:standard_option | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#php#phpcs#Handle(buffer, lines) abort | ||||
|     " Matches against lines like the following: | ||||
|     " | ||||
|     " /path/to/some-filename.php:18:3: error - Line indented incorrectly; expected 4 spaces, found 2 (Generic.WhiteSpace.ScopeIndent.IncorrectExact) | ||||
|     let l:pattern = '^.*:\(\d\+\):\(\d\+\): \(.\+\) - \(.\+\) \(\(.\+\)\)$' | ||||
|     let l:output = [] | ||||
| 
 | ||||
|     for l:match in ale#util#GetMatches(a:lines, l:pattern) | ||||
|         let l:text = l:match[4] | ||||
|         let l:type = l:match[3] | ||||
| 
 | ||||
|         call add(l:output, { | ||||
|         \   'lnum': l:match[1] + 0, | ||||
|         \   'col': l:match[2] + 0, | ||||
|         \   'text': l:text, | ||||
|         \   'type': l:type is# 'error' ? 'E' : 'W', | ||||
|         \}) | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('php', { | ||||
| \   'name': 'phpcs', | ||||
| \   'executable_callback': 'ale_linters#php#phpcs#GetExecutable', | ||||
| \   'command_callback': 'ale_linters#php#phpcs#GetCommand', | ||||
| \   'callback': 'ale_linters#php#phpcs#Handle', | ||||
| \}) | ||||
| @ -1,36 +0,0 @@ | ||||
| " Author: medains <https://github.com/medains> | ||||
| " Description: phpmd for PHP files | ||||
| 
 | ||||
| " Set to change the ruleset | ||||
| let g:ale_php_phpmd_ruleset = get(g:, 'ale_php_phpmd_ruleset', 'cleancode,codesize,controversial,design,naming,unusedcode') | ||||
| 
 | ||||
| function! ale_linters#php#phpmd#GetCommand(buffer) abort | ||||
|     return 'phpmd %s text ' | ||||
|     \   . ale#Var(a:buffer, 'php_phpmd_ruleset') | ||||
|     \   . ' --ignore-violations-on-exit %t' | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#php#phpmd#Handle(buffer, lines) abort | ||||
|     " Matches against lines like the following: | ||||
|     " | ||||
|     " /path/to/some-filename.php:18 message | ||||
|     let l:pattern = '^.*:\(\d\+\)\t\(.\+\)$' | ||||
|     let l:output = [] | ||||
| 
 | ||||
|     for l:match in ale#util#GetMatches(a:lines, l:pattern) | ||||
|         call add(l:output, { | ||||
|         \   'lnum': l:match[1] + 0, | ||||
|         \   'text': l:match[2], | ||||
|         \   'type': 'W', | ||||
|         \}) | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('php', { | ||||
| \   'name': 'phpmd', | ||||
| \   'executable': 'phpmd', | ||||
| \   'command_callback': 'ale_linters#php#phpmd#GetCommand', | ||||
| \   'callback': 'ale_linters#php#phpmd#Handle', | ||||
| \}) | ||||
| @ -1,46 +0,0 @@ | ||||
| " Author: medains <https://github.com/medains>, ardis <https://github.com/ardisdreelath> | ||||
| " Description: phpstan for PHP files | ||||
| 
 | ||||
| " Set to change the ruleset | ||||
| let g:ale_php_phpstan_executable = get(g:, 'ale_php_phpstan_executable', 'phpstan') | ||||
| let g:ale_php_phpstan_level = get(g:, 'ale_php_phpstan_level', '4') | ||||
| 
 | ||||
| function! ale_linters#php#phpstan#GetExecutable(buffer) abort | ||||
|     return ale#Var(a:buffer, 'php_phpstan_executable') | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#php#phpstan#GetCommand(buffer) abort | ||||
|     let l:executable = ale_linters#php#phpstan#GetExecutable(a:buffer) | ||||
| 
 | ||||
|     return ale#Escape(l:executable) | ||||
|     \   . ' analyze -l' | ||||
|     \   . ale#Var(a:buffer, 'php_phpstan_level') | ||||
|     \   . ' --errorFormat raw' | ||||
|     \   . ' %s' | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#php#phpstan#Handle(buffer, lines) abort | ||||
|     " Matches against lines like the following: | ||||
|     " | ||||
|     " filename.php:15:message | ||||
|     " C:\folder\filename.php:15:message | ||||
|     let l:pattern = '^\([a-zA-Z]:\)\?[^:]\+:\(\d\+\):\(.*\)$' | ||||
|     let l:output = [] | ||||
| 
 | ||||
|     for l:match in ale#util#GetMatches(a:lines, l:pattern) | ||||
|         call add(l:output, { | ||||
|         \   'lnum': l:match[2] + 0, | ||||
|         \   'text': l:match[3], | ||||
|         \   'type': 'W', | ||||
|         \}) | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('php', { | ||||
| \   'name': 'phpstan', | ||||
| \   'executable_callback': 'ale_linters#php#phpstan#GetExecutable', | ||||
| \   'command_callback': 'ale_linters#php#phpstan#GetCommand', | ||||
| \   'callback': 'ale_linters#php#phpstan#Handle', | ||||
| \}) | ||||
| @ -1,9 +0,0 @@ | ||||
| " Author: Daniel M. Capella https://github.com/polyzen | ||||
| " Description: proselint for Pod files | ||||
| 
 | ||||
| call ale#linter#Define('pod', { | ||||
| \   'name': 'proselint', | ||||
| \   'executable': 'proselint', | ||||
| \   'command': 'proselint %t', | ||||
| \   'callback': 'ale#handlers#unix#HandleAsWarning', | ||||
| \}) | ||||
| @ -1,48 +0,0 @@ | ||||
| " Author: w0rp - <devw0rp@gmail.com> | ||||
| " Description: pug-lint for checking Pug/Jade files. | ||||
| 
 | ||||
| call ale#Set('pug_puglint_options', '') | ||||
| call ale#Set('pug_puglint_executable', 'pug-lint') | ||||
| call ale#Set('pug_puglint_use_global', 0) | ||||
| 
 | ||||
| function! ale_linters#pug#puglint#GetExecutable(buffer) abort | ||||
|     return ale#node#FindExecutable(a:buffer, 'pug_puglint', [ | ||||
|     \   'node_modules/.bin/pug-lint', | ||||
|     \]) | ||||
| endfunction | ||||
| 
 | ||||
| function! s:FindConfig(buffer) abort | ||||
|     for l:filename in [ | ||||
|     \   '.pug-lintrc', | ||||
|     \   '.pug-lintrc.js', | ||||
|     \   '.pug-lintrc.json', | ||||
|     \   'package.json', | ||||
|     \] | ||||
|         let l:config = ale#path#FindNearestFile(a:buffer, l:filename) | ||||
| 
 | ||||
|         if !empty(l:config) | ||||
|             return l:config | ||||
|         endif | ||||
|     endfor | ||||
| 
 | ||||
|     return '' | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#pug#puglint#GetCommand(buffer) abort | ||||
|     let l:executable = ale_linters#pug#puglint#GetExecutable(a:buffer) | ||||
|     let l:options = ale#Var(a:buffer, 'pug_puglint_options') | ||||
|     let l:config = s:FindConfig(a:buffer) | ||||
| 
 | ||||
|     return ale#Escape(l:executable) | ||||
|     \   . (!empty(l:options) ? ' ' . l:options : '') | ||||
|     \   . (!empty(l:config) ? ' -c ' . ale#Escape(l:config) : '') | ||||
|     \   . ' -r inline %t' | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('pug', { | ||||
| \   'name': 'puglint', | ||||
| \   'executable_callback': 'ale_linters#pug#puglint#GetExecutable', | ||||
| \   'output_stream': 'stderr', | ||||
| \   'command_callback': 'ale_linters#pug#puglint#GetCommand', | ||||
| \   'callback': 'ale#handlers#unix#HandleAsError', | ||||
| \}) | ||||
| @ -1,27 +0,0 @@ | ||||
| " Author: Alexander Olofsson <alexander.olofsson@liu.se> | ||||
| 
 | ||||
| function! ale_linters#puppet#puppet#Handle(buffer, lines) abort | ||||
|     " Matches patterns like the following: | ||||
|     " Error: Could not parse for environment production: Syntax error at ':' at /root/puppetcode/modules/nginx/manifests/init.pp:43:12 | ||||
| 
 | ||||
|     let l:pattern = '^Error: .*: \(.\+\) at .\+:\(\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, | ||||
|         \   'text': l:match[1], | ||||
|         \}) | ||||
|     endfor | ||||
| 
 | ||||
|     return l:output | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('puppet', { | ||||
| \   'name': 'puppet', | ||||
| \   'executable': 'puppet', | ||||
| \   'output_stream': 'stderr', | ||||
| \   'command': 'puppet parser validate --color=false %t', | ||||
| \   'callback': 'ale_linters#puppet#puppet#Handle', | ||||
| \}) | ||||
| @ -1,26 +0,0 @@ | ||||
| " Author: Alexander Olofsson <alexander.olofsson@liu.se>, Robert Flechtner <flechtner@chemmedia.de> | ||||
| " Description: puppet-lint for puppet files | ||||
| 
 | ||||
| let g:ale_puppet_puppetlint_executable = | ||||
| \   get(g:, 'ale_puppet_puppetlint_executable', 'puppet-lint') | ||||
| 
 | ||||
| let g:ale_puppet_puppetlint_options = | ||||
| \   get(g:, 'ale_puppet_puppetlint_options', '--no-autoloader_layout-check') | ||||
| 
 | ||||
| function! ale_linters#puppet#puppetlint#GetExecutable(buffer) abort | ||||
|     return ale#Var(a:buffer, 'puppet_puppetlint_executable') | ||||
| endfunction | ||||
| 
 | ||||
| function! ale_linters#puppet#puppetlint#GetCommand(buffer) abort | ||||
|     return ale_linters#puppet#puppetlint#GetExecutable(a:buffer) | ||||
|     \   . ' ' . ale#Var(a:buffer, 'puppet_puppetlint_options') | ||||
|     \   . ' --log-format "-:%{line}:%{column}: %{kind}: [%{check}] %{message}"' | ||||
|     \   . ' %t' | ||||
| endfunction | ||||
| 
 | ||||
| call ale#linter#Define('puppet', { | ||||
| \   'name': 'puppetlint', | ||||
| \   'executable_callback': 'ale_linters#puppet#puppetlint#GetExecutable', | ||||
| \   'command_callback': 'ale_linters#puppet#puppetlint#GetCommand', | ||||
| \   'callback': 'ale#handlers#gcc#HandleGCCFormat', | ||||
| \}) | ||||
Some files were not shown because too many files have changed in this diff Show More
					Loading…
					
					
				
		Reference in New Issue
	
	 Buddy Sandidge
						Buddy Sandidge