Compare commits

...

551 Commits

Author SHA1 Message Date
w0rp
76b5c9283d #574 Do not restore items with no columns for highlights from hidden buffers 2017-06-02 19:21:45 +01:00
w0rp
9b6d6344b2 Merge pull request #589 from bardzusny/ember-template-lint-handler-parsing-error
Ember-template-lint handler: properly handle template parsing errors.
2017-05-30 09:47:26 +01:00
w0rp
e94aea9144 Merge pull request #578 from nOkuda/master
Translate pylint output column to 1-based index
2017-05-25 13:38:05 +01:00
w0rp
64b56f84ef Fix #555 - Handle csslint errors without groups 2017-05-15 21:21:25 +01:00
w0rp
72f5aae74e Update the Makefile so tests will run correctly 2017-05-15 20:49:22 +01:00
w0rp
548c1a1007 Fix #553 - Filter out errors from other files for gometalinter 2017-05-15 20:44:09 +01:00
Adriaan Zonnenberg
2503eda68b Merge pull request #533 from pbogut/add_php7_compatibility
Add PHP 7 compatibility
2017-05-09 22:39:00 +01:00
w0rp
8e4bac54a6 #540 Fix shell escaping pretty much everywhere 2017-05-08 23:02:26 +01:00
w0rp
32f21751f4 Do not copy the items for setting highlights, as we do need to modify the items in ale_buffer_info 2017-05-07 19:33:59 +01:00
w0rp
ca120088c7 Fix #539 - Just set our highlights again when buffers are shown after being hidden 2017-05-07 19:30:19 +01:00
w0rp
f6723784e6 #427 Document that the trailing whitespace option can be set differently in each buffer 2017-05-07 17:17:00 +01:00
w0rp
1a157b1cd5 Support python -m flake8 for users who are running flake8 that way 2017-05-07 16:31:33 +01:00
w0rp
05bd4f591c Escape JavaScript executables in commands 2017-05-07 16:19:40 +01:00
w0rp
4228c503f4 #335 Detect flake8 in vritualenv, and escape the executable path 2017-05-07 16:16:17 +01:00
w0rp
02f6fba6cb Remove a comment we don't need any more 2017-05-07 15:29:16 +01:00
w0rp
67beece06c Update the example GIF so it looks a bit nicer 2017-05-07 15:17:30 +01:00
w0rp
673e36b2ef Sleep to fix Travis builds 2017-05-06 23:33:38 +01:00
w0rp
a9c5e14fc9 Fix #363 - Detect virtualenv executables and fix import paths for mypy. Use lint_file for mypy 2017-05-06 23:19:54 +01:00
w0rp
702b203c51 Make the nimcheck tests more reliable 2017-05-06 23:06:51 +01:00
w0rp
07bcbd4c06 Escape the pylint executable appropriately 2017-05-06 21:20:02 +01:00
w0rp
f2c9fc403a Fix #208 - Use the file on disk for pylint, and follow import paths 2017-05-06 19:30:41 +01:00
w0rp
2e1c9b0fa5 #208 Automatically detect pylint in virtualenv directories 2017-05-06 19:11:43 +01:00
w0rp
bf8aae02e8 Fix #534 - Stop other higlights being restored when buffers are hidden and shown again 2017-05-06 16:20:39 +01:00
w0rp
0ac82f0a17 #532 Rename a Vint variable so it's more obvious 2017-05-06 10:14:03 +01:00
w0rp
3ecdb52e6c Make the gobuild tests work better when running them directly 2017-05-06 10:10:24 +01:00
Alexandr
bf0b2cfd84 go build: skip not current buffer (#531)
* go build: skip not current buffer

* fix gobuild_handler.vader
2017-05-06 10:08:34 +01:00
w0rp
ab9afaa2bf Add a has() wrapper we can override for tests, and add a function for generating paths up to the root directory to search through 2017-05-05 23:03:19 +01:00
w0rp
6b15c7c9fd Try and make the sign tests pass more often 2017-05-05 10:36:23 +01:00
w0rp
d1cc1de6a5 Allow the Brakeman tests to be run directly 2017-05-05 10:14:52 +01:00
Eddie Lebow
ba7999dae0 [RFC] Add Brakeman for Ruby on Rails (references #385) (#509)
* Add brakeman for Ruby on Rails
2017-05-05 10:05:53 +01:00
w0rp
14f3fc777f #427 Implement b:ale_warn_about_trailing_whitespace 2017-05-04 23:50:11 +01:00
w0rp
c2a0847f99 #502 Parse more undefined symbol errors 2017-05-04 23:34:52 +01:00
w0rp
8e70dc14f2 Fix #502 - Report undefined symbol errors better for javac 2017-05-04 23:19:58 +01:00
w0rp
528355e2c6 Fix #501 - Do not run javac when it is just a stub asking you to install Java on Mac OSX 2017-05-04 17:14:48 +01:00
w0rp
ab7ab7d6e3 Fix #530 - Fix LaTeX and TeX duplicate entries in documentation 2017-05-03 23:35:33 +01:00
w0rp
0aed51565e Fix #528 remove and restore highlights when buffers are hidden and shown 2017-05-03 23:28:57 +01:00
w0rp
858c1c47ae Merge pull request #524 from adriaanzon/fix-defaulting-to-fish
shell: Don't default to fish
2017-05-03 00:27:55 +01:00
Adriaan Zonnenberg
768a5e7421 Document that ale_sh_shell_default_shell won't default to fish 2017-05-03 00:34:17 +02:00
w0rp
3573975934 Fix #410 - Use compile_commands.json files for clang-tidy, and check files on disk instead 2017-05-02 22:44:08 +01:00
w0rp
eb8bd26776 #392 - Detect and use compile_commands.json for cppcheck 2017-05-02 21:18:17 +01:00
Francis Agyapong
36314aeaf2 Add kotlinc checker for kotlin (#526)
* Add kotlinc checker for kotlin
2017-05-02 18:27:04 +01:00
Adriaan Zonnenberg
dce99faf8f shell: Don't default to fish 2017-05-01 21:24:16 +02:00
Robert J
d5c135cfaf Glue for Vale (#522)
Add Vale linter definitions
2017-05-01 16:06:04 +01:00
w0rp
5dcc77e8c8 Merge pull request #521 from adriaanzon/rename-sh-linter-options
Rename g:ale_linters_sh_* to g:ale_sh_*
2017-05-01 16:05:29 +01:00
Adriaan Zonnenberg
b0bba34ea2 Rename g:ale_linters_sh_* to g:ale_sh_* 2017-04-30 22:38:28 +02:00
w0rp
6547adcf2f Run the lint_file checks synchronously, so the tests will consistently pass 2017-04-30 10:09:26 +01:00
w0rp
a6cadaabef Fix #356 Don't complain about #pragma once in C++ headers 2017-04-30 00:31:52 +01:00
w0rp
2c7d14809d Set GCC flags appropriately for older versions 2017-04-29 20:00:42 +01:00
w0rp
dfb10f1db2 Merge pull request #519 from AlexMasterov/feature/lua-luacheck-options
Add luacheck option to pass in more options
2017-04-29 18:06:55 +01:00
w0rp
6fc3954bd3 Cover the new path functions with some tests 2017-04-29 18:03:08 +01:00
w0rp
0b4acd6453 Fix #518 Fix handling of spaces in filenames for various linters 2017-04-29 17:33:18 +01:00
w0rp
cbb01e32b9 Cache executable calls to make things slightly faster 2017-04-29 11:58:50 +01:00
Alex Masterov
9cea780121 Add luacheck option to pass in more options 2017-04-29 08:58:35 +03:00
w0rp
e417dafa78 Merge pull request #514 from adriaanzon/buffer-local-options-doc
Add tags for buffer-local variants of each linter option
2017-04-28 17:06:38 +01:00
w0rp
944564bb8c Merge pull request #513 from blueyed/custom-checks-dirs
custom-checks: handle multiple dirs
2017-04-28 15:36:12 +01:00
w0rp
49e68fc093 Merge pull request #512 from dansdantas/add-xo-references-on-readme
add xo reference for javascript linters on readme
2017-04-28 15:31:06 +01:00
Adriaan Zonnenberg
7230cbe9e4 Use ale#Var in linters that didn't use it yet 2017-04-28 00:01:01 +02:00
Adriaan Zonnenberg
ba6dbde906 Add tags for buffer-local variants of each linter option 2017-04-27 23:04:34 +02:00
Daniel Hahler
236da06050 custom-checks: handle multiple dirs
This also fixes a [shellcheck issue](https://github.com/koalaman/shellcheck/wiki/SC2013).
2017-04-27 22:09:23 +02:00
Daniel Dantas
248901d589 add xo reference for javascript linters on readme 2017-04-27 14:30:39 -03:00
w0rp
10679b29c3 Sort out some documentation for ReasonML 2017-04-27 00:23:06 +01:00
w0rp
fbed7c15b9 Merge pull request #504 from bassjacob/master
Create reasonml merlin linter
2017-04-27 00:20:24 +01:00
w0rp
447917e348 #427 Output buffer variables when buffer numbers are strings 2017-04-27 00:15:16 +01:00
w0rp
6853d2c304 #427 - Output buffer-local variables with :ALEInfo 2017-04-27 00:07:41 +01:00
w0rp
b25dbd6ea5 Fix #506 - Don't set signs for buffers which don't exist 2017-04-26 23:32:20 +01:00
w0rp
ce2f777e33 Fix #505 Stop g:ale_lint_on_filetype_changed linting when you open buffers 2017-04-26 23:02:00 +01:00
Jacob Bass
4db5f3923d Create reasonml merlin linter
copy @andreypopp 's ocaml merlin linter from this project into reason
2017-04-26 19:29:09 +10:00
w0rp
65fc4aeb1e Merge pull request #503 from adelarsq/patch-1
Correcting wrong link for erubi
2017-04-26 07:25:53 +01:00
Adelar da Silva Queiróz
741d86e137 Update README 2017-04-25 21:53:37 -03:00
w0rp
5d5ba2a780 #427 Allow linters and aliases to be configured in buffer local variables 2017-04-25 23:52:13 +01:00
w0rp
45c2d6b580 Fixes #361, fixes #417 Get classpaths from Maven, and automatically detect src/main/java paths 2017-04-25 22:32:48 +01:00
w0rp
fe51866dfc Credit the original author of the Ruby handler 2017-04-25 20:50:56 +01:00
Matthias Günther
c55064881d Add erb linter (#497)
* Add eruby linter

* Update README with erb linter

* Fix example and contributions

* Remove trailing newline

* Fix for Vimscript style guide

* Eruby-linter: codereview with @w0rp
- read from stderro output_stream

* Eruby-linter: codereview => add handler for ruby

* Eruby-linter: codereview
- eruby and ruby lint use the same ruby-handler (removes
  duplicated handling logic)

* Eruby-linter: try to fix tests
2017-04-25 18:38:02 +01:00
w0rp
a25b55b954 Fix #469 - Remove Unicode quotes from GCC errors, which cause issues 2017-04-24 23:00:43 +01:00
w0rp
3345bf20ca Fix #450 Document how linters are loaded 2017-04-24 22:40:15 +01:00
w0rp
a03121f5b0 Break shared handlers up into their own files, and fix stylelint error handling 2017-04-24 22:27:18 +01:00
w0rp
b4c0335ebc Handle Unix errors with no space after the colon 2017-04-24 21:38:12 +01:00
w0rp
99afe586b3 Simplify some code and format some tests better 2017-04-24 21:11:33 +01:00
w0rp
689921d7e3 Merge pull request #498 from wizzup/haskell-hdevtools
update doc/ale.txt
2017-04-24 19:01:04 +01:00
wisut hantanong
368adb5c3a update doc/ale.txt 2017-04-24 17:27:45 +07:00
w0rp
49c9b689ce Comment-out the explanations in the Issue and PR templates 2017-04-23 18:17:13 +01:00
w0rp
9238976522 Add some more tags to the documentation, for easy references 2017-04-23 18:06:26 +01:00
Jason Tibbitts
c1a2d26711 Disable rpmlint by default (#492)
* Disable rpmlint by default as it is not safe.
2017-04-20 16:55:20 +01:00
w0rp
925f24707f Mention the IRC channel in the README 2017-04-20 16:02:51 +01:00
w0rp
7fd7630153 Fix #398 - Report problems with the eslint configuration file 2017-04-20 13:07:32 +01:00
Eddie Lebow
0384cabd77 Add the Reek checker for Ruby. (#490)
Add the Reek checker for Ruby.
2017-04-20 07:37:08 +01:00
w0rp
c6ef9e28a5 #427 Document the buffer variables, at least slightly 2017-04-19 23:56:02 +01:00
Jason Tibbitts
4eeb4783d3 Add rpm spec file linter (rpmlint) (#486)
* Initial attempt at an rpmlint linter.

* Add some basic documentation.

* Play with indentation in the test file.

* Another attempt to fix the rpmlint test.

* Hopefully this does it.
2017-04-19 23:40:58 +01:00
w0rp
d8dcc56af5 Remove error highlights when buffers are cleaned up 2017-04-19 22:55:06 +01:00
Shane Smith
72449d7cb1 Add missing "use global" var for tslint (#484)
* Add missing "use global" var for tslint
* Add typescript tslint documentation
2017-04-18 09:28:54 +01:00
w0rp
bdad25eefd Add a function for getting matches, and use it to simplify a lot of code 2017-04-18 00:35:53 +01:00
w0rp
e237add9fd Move path functions to their own file 2017-04-17 23:29:02 +01:00
w0rp
6c762237ce Merge pull request #483 from emord/patch-1
Fix link to cppcheck
2017-04-17 17:17:22 +01:00
Jonathan Emord
6dab0efe19 Fix link to cppcheck 2017-04-17 10:30:20 -04:00
w0rp
dc72daaf1e Merge pull request #481 from jonsmithers/jshint-with-html
Make jshint work with html
2017-04-17 08:49:15 +01:00
Jon Smithers
dbf4f03607 Enable jshint to extract javascript from html 2017-04-17 00:11:39 -04:00
w0rp
430bff7532 Merge pull request #479 from adriaanzon/patch-1
Fix htmlhint variable names
2017-04-16 23:49:45 +01:00
Adriaan Zonnenberg
ffda9077aa Fix htmlhint variable names 2017-04-16 21:44:15 +02:00
Rafał Cieślak
2643f9f119 Flow: Fix case where 1st msg points to different file (#477)
* Flow: Fix case where 1st msg points to different file

* Remove `bufnr` from Flow handler output

* Fix the failing test & add a new one
2017-04-16 11:45:42 +01:00
w0rp
e97dada261 #427 Implement buffer variable overrides for all linter options 2017-04-16 01:24:08 +01:00
w0rp
e80116cee0 #427 Add a function for looking up ALE variables in buffer scope, and then global scope 2017-04-16 00:16:48 +01:00
w0rp
7682fab294 Fix #168 - Make the Fortran linter more configurable 2017-04-15 22:06:56 +01:00
w0rp
d824466230 Remove documentation for an option that was removed 2017-04-15 21:17:50 +01:00
w0rp
35c831dd2c Merge pull request #471 from breed808/gometalinter
Add gometalinter linter for go files
2017-04-15 21:09:23 +01:00
w0rp
f0d76bc298 Use g:ale_linters for turning gometalinter on, and update documentation as appropriate 2017-04-15 21:04:43 +01:00
w0rp
296ae92da4 Merge pull request #478 from jordanandree/crystal-lint-file
turn on lint_file for crystal build to resolve `require` path errors
2017-04-15 16:00:25 +01:00
Jordan Andree
11a4af2727 turn on lint_file for crystal build to resolve require path errors 2017-04-15 10:37:32 -04:00
w0rp
706dd050f2 Fix #257 in preparation for #427, standardise options with fallbacks, and make it so every value can be computed dynamically 2017-04-15 13:36:16 +01:00
w0rp
2f009690c3 Fix the custom-checks script, and check for more problems 2017-04-15 12:52:25 +01:00
w0rp
cab68cba25 Make code more consistent 2017-04-15 12:52:08 +01:00
w0rp
c9a5d9845b Explain some code better 2017-04-15 12:13:31 +01:00
w0rp
7c49f5d4cc Mention Crystal in the online documentation 2017-04-15 11:37:09 +01:00
w0rp
d5ccb1a7a1 Merge pull request #474 from jordanandree/add-crystal-lint
Add linter for Crystal lang
2017-04-15 11:34:20 +01:00
Adriaan Zonnenberg
8351bdbc06 Add SQL linter sqlint, closes #395 (#472) 2017-04-15 11:24:05 +01:00
jordanandree
abdfaaf84f add crystal lint
- invokes via `crystal build` command without codegen
- adds vader tests
2017-04-13 21:33:36 -04:00
Ben Reedy
54991f3082 Add documentation for gometalinter 2017-04-13 19:38:32 +10:00
Ben Reedy
1167616726 Add gometalinter for go files
Linter is disabled by default (see g:ale_go_gometalinter_enabled) as it
conflicts with a number of established ALE linters (golint, govet,
gosimple, staticcheck, etc).
2017-04-13 19:38:32 +10:00
w0rp
349b31104a Merge pull request #470 from breed808/gobuild
Fix gobuild linter with multiple source files
2017-04-13 10:25:48 +01:00
Ben Reedy
a2bb45e974 Fix gobuild linter
Resolves issues with gobuild linter with multiple go source files
belonging to the same go package.
2017-04-13 18:58:55 +10:00
w0rp
e2287a42bc Merge pull request #463 from valtermro/multi-ft-aliases
Add support for multiple filetypes in filetype aliasing
2017-04-13 00:02:18 +01:00
w0rp
8afd914c6d Merge pull request #467 from adriaanzon/php-fix-double-errors
PHP: Fix double errors and support fatal errors
2017-04-12 23:58:01 +01:00
valtermro
475dd2e76a Add support for multiple filetypes in filetype aliasing 2017-04-12 19:47:34 -03:00
w0rp
266b3a2ddf Merge pull request #466 from adriaanzon/fix-markdown
Some fixes in markdown documents
2017-04-12 23:37:07 +01:00
w0rp
c2fdb399a7 Set a default for the puppetlint options so the linter will behave like it always has done, by default 2017-04-12 23:25:31 +01:00
rcn
7e0e7359c0 Add puppet-lint config options and documentation (#462) 2017-04-12 23:23:25 +01:00
w0rp
ceb910e78c Make some temporary file tests more reliable 2017-04-12 23:17:55 +01:00
Adriaan Zonnenberg
7dbf32d0d7 PHP: Fix double errors and support fatal errors 2017-04-12 23:59:12 +02:00
Adriaan Zonnenberg
20900dd12f Fix broken links 2017-04-12 22:53:20 +02:00
Adriaan Zonnenberg
10037c5133 Fix markdown headings
They were all the same size
2017-04-12 22:26:19 +02:00
Adriaan Zonnenberg
d2defc8f47 Fix markdown indentation 2017-04-12 22:22:56 +02:00
Ben R
0ce46fe7c8 Make go build linter check files on disk (#465)
* #418 Make `go build` linter check files on disk

* Omit errors from imported go packages
2017-04-12 10:53:33 +01:00
w0rp
65fe914fb8 #392 Handle clang header errors too 2017-04-11 21:05:41 +01:00
w0rp
b06b832447 #392 Report errors inside of headers, in a very basic way 2017-04-11 20:32:57 +01:00
w0rp
8b890caa31 Merge pull request #458 from Szero/master
Added shellcheck executable and options variable
2017-04-11 09:26:58 +01:00
w0rp
5aa52fc450 Merge pull request #460 from TheLonelyGhost/master
Typo correcting 3.0.7 -> 0.3.7 for `vint --no-color`
2017-04-10 22:05:28 +01:00
David Alexander
593dbe7556 Typo correcting 3.0.7 -> 0.3.7 for vint --no-color 2017-04-10 16:44:14 -04:00
Szero
8e33abaeab added shellcheck executable and options variable
updated docs
2017-04-09 19:54:25 +02:00
w0rp
b9bb4adacd Add a pull request template which asks for some common requests by yours truly 2017-04-08 21:53:39 +01:00
w0rp
94d5fcb15a Merge pull request #456 from mathsaey/patch-1
Added a missing space to the nimcheck command
2017-04-08 21:35:49 +01:00
Mathijs Saey
588d338342 Added a missing space to the nimcheck command 2017-04-08 20:32:47 +02:00
Brandon Roehl
4e40e8cb60 Add Ruby MRI linter (#453)
* Added ruby mri linter

* Added to the list of supported linters

* Async and now with 4 spaces

* Vader tests for ruby

* Match style choices

* Vader test for the Ruby handler now works and passes
2017-04-08 11:24:20 +01:00
Shalom Yiblet
cc8eb05860 improved the sml linter (#445)
* improved the sml linter

* made matching operator agnostic to user settings

* added tests for sml
2017-04-08 11:23:11 +01:00
Mathijs Saey
434283ed1a Update nimcheck.vim (#451)
Added a '--threads:on' switch to the nim check command so that it doesn't produce errors when using one of the various modules that require threads.
2017-04-07 15:42:46 +01:00
Adrian
d28d7f732a Add support for linting Handlebars templates with ember-template-lint (#452)
* Ember-template-lint Handlebars template linter: initial handler, test.

* Handlebars support with ember-template-lint: basic documentation entries.
2017-04-07 15:38:50 +01:00
José Júnior
4caf273d53 Adds options to foodcritic linter (#437)
* Adds options to foodcritic linter

Adds a way to pass command line options to the foodcritic command and
documentation about it.

* Creates a simple test for foodcritic command callback

This test simply runs the GetCommand function for the foodcritic linter
and feeds it with some test variables to assert the command line is
being created/escaped correctly.

* Makes foodcritic linter use a command callback

Following review comments, changes the foodcritic linter to use a
`GetCommand` callback for the `command_callback` linter option.

Makes sure that `~` are escaped: flags on foodcritic command line are
negated by adding a `~` in front of the specific cop name:

```
foodcritic -t ~FC011
```

But the way the commands are executed cause foodcritic to fail (since
tilde is recognized as home directory).

* Fixes the doc to include new variables
2017-04-05 18:21:47 +01:00
w0rp
c7bd5cc0ba Cover handling of swiftlint errors with tests 2017-04-03 23:43:31 +01:00
w0rp
f3fa8db4cf #447 Pass a temporary file to the shell linter instead 2017-04-03 23:11:25 +01:00
w0rp
4fc8452838 #447 Support zsh in the shell linter 2017-04-03 22:51:39 +01:00
w0rp
85d86620f7 Cover basic GCC functionality with tests 2017-04-03 22:24:30 +01:00
w0rp
10d8b4bfd7 Update the Makefile to use the latest Docker image 2017-04-03 22:17:39 +01:00
w0rp
22307ccabc Add g++ to the Dockerfile 2017-04-03 21:57:24 +01:00
w0rp
5f02595ea4 #380 Add some experimental code for killing long-running processes in NeoVim 2017-04-03 19:50:57 +01:00
w0rp
9691649b65 #446 Do not run ALE if inside of a command window 2017-04-03 19:21:11 +01:00
w0rp
b7c79974bb #446 Fix g:ale_lint_on_text_changed compatibility issues 2017-04-03 19:04:02 +01:00
w0rp
927ee79026 Update the test suite so it uses the latest Docker image, and use Bourne shell for most tests, so weird shell issues are easier to catch. 2017-04-02 22:57:29 +01:00
w0rp
e7aa079982 Add Bash to the Dockerfile, which no longer comes with vim-testbed by default 2017-04-02 22:44:36 +01:00
w0rp
e4f18770e0 Update the Makefile to use the latest Docker build 2017-04-02 22:29:01 +01:00
w0rp
bfc16ed2ec Allow for any current Python2 and PIP versions in the Docker build 2017-04-02 22:21:19 +01:00
w0rp
e24f9d263c Make the Dockerfile build again 2017-04-02 21:41:53 +01:00
w0rp
480c8504a6 Add C and C++ tools to the Dockerfile 2017-04-02 21:29:06 +01:00
w0rp
7c736579b7 Fix #438 Create Java .class files for javac in a temporary directory 2017-03-31 20:14:53 +01:00
w0rp
7a8dbe1139 Clean up some whitespace 2017-03-31 19:50:52 +01:00
Steven Lu
ef5b900657 adds line highlights style (#436)
* adds line highlights style

* adding doc for the new highlight styles.

* missing space
2017-03-31 19:22:25 +01:00
Adriaan Zonnenberg
4b0f3257dd Remove 'col' from linters where it is hardcoded to 1 (#434)
* Remove 'col' from linters where it is hardcoded to 1

When 'col' is 1, the first column will get highlighted for no reason. It
should be 0 (which is the default).

In the scalac linter there was also a check about the outcome of
`stridx`. It would set l:col to 0 if it was -1, and then it uses
`'col': l:col + 1` to convert the outcome of `stridx` to the actual
column number. This will make 'col' equals 1 when there is no match. We
can remove the check because `-1 + 1 = 0`.

* Remove outdated comments about vcol

vcol was added as a default, and the loclists that follow these comments
do not contain 'vcol' anymore
2017-03-30 23:33:38 +01:00
w0rp
6c97cd335b Merge pull request #429 from breed808/go
Add support for gosimple and staticcheck
2017-03-30 23:28:19 +01:00
taylorskalyo
36f9631512 Add options to facilitate linting only in normal mode (#425)
* [#420] Add options to facilitate linting only in normal mode

ale_lint_on_text_changed:
Allow setting to 'insert' or 'normal' to lint when text is changed only in
insert or normal mode respectively.

ale_lint_on_insert_leave:
This flag can be set to 1 to enable linting when leaving insert mode.

* [#420] Test updated global options

Ale should
- bind to TextChanged events when g:ale_lint_on_text_changed = 1
- bind to TextChanged events when g:ale_lint_on_text_changed = 'always'
- bind to InsertLeave event when g:ale_lint_on_insert_leave = 1
2017-03-30 23:21:37 +01:00
w0rp
3a74d242f9 Merge pull request #431 from janclarin/master
Check for existence of g:ale_emit_conflict_warnings before checking value
2017-03-30 16:37:28 +01:00
Jan Clarin
e59e57d2e4 Document conflicting plugins check 2017-03-30 01:16:40 -06:00
Jan Clarin
f88f59afb8 Fix #426 check for g:ale_emit_conflict_warnings existence 2017-03-30 01:16:34 -06:00
Ben Reedy
43f24f4c01 Add support for gosimple and staticcheck 2017-03-30 11:49:52 +10:00
w0rp
2a88b60ff1 Fix #260 automatically set .csslintrc files from ancestor directories 2017-03-29 00:56:39 +01:00
w0rp
8e71f233da Use the lint_file option so the Cargo linter will only be run against files on disk 2017-03-29 00:34:03 +01:00
w0rp
3f5cb55e73 Make the tslint file match the style in the rest of the codebase 2017-03-29 00:28:01 +01:00
w0rp
a4220b99a6 Fix #421 Automatically detect create-react-app paths 2017-03-29 00:21:27 +01:00
w0rp
4b9b4e3338 #326 Document existing StandardJS options 2017-03-28 23:49:06 +01:00
w0rp
81b49b2dff Merge pull request #424 from adriaanzon/command-enable-disable
Add :ALEEnable and :ALEDisable commands
2017-03-28 23:28:13 +01:00
w0rp
d7f8324c3c Move linter documentation into separate files 2017-03-28 23:25:44 +01:00
Adriaan Zonnenberg
6a5d8ba5d0 Add :ALEEnable and :ALEDisable commands 2017-03-29 00:04:58 +02:00
w0rp
094eeb2673 Merge pull request #423 from adriaanzon/command-bar
Allow commands to be chained using a `|`
2017-03-28 22:17:18 +01:00
Adriaan Zonnenberg
fe47649a23 Allow commands to be chained using a | 2017-03-28 19:27:07 +02:00
w0rp
ab3fd2e849 Fix #130 - Run linters when the filetype is changed 2017-03-27 22:40:25 +01:00
w0rp
c9ee3efc11 Enabling linting on save by default, re #333 2017-03-27 20:36:35 +01:00
w0rp
4abefc189c Cover the rubocop handler with tests 2017-03-27 19:53:12 +01:00
Gabriel Holodak
b9c078da20 Adjust rubocop error levels
Consider rubocop fatal errors as ALE errors, and rubocop style warnings
as ALE warnings.
2017-03-27 19:46:02 +01:00
w0rp
a1be697a02 Add a pause for the command chain test 2017-03-27 13:46:48 +01:00
w0rp
cd82740ade Document the Dogma linter 2017-03-27 13:02:25 +01:00
w0rp
5de084557b Merge branch 'add-dogma' 2017-03-27 12:57:00 +01:00
w0rp
82fde0ea51 Use the same formatting as other files for the dogma linter file, and cover the Handler function with tests 2017-03-27 12:56:54 +01:00
Idan Arye
2f40953e03 Make cargo linter lighter: (#408)
- Use `cargo check` instead of `cargo build` when
  `g:ale_rust_cargo_use_check` is truish.
- Use `--frozen` to avoid locking the project.
2017-03-27 12:37:00 +01:00
w0rp
8ca82af4ab Merge pull request #414 from lucaskolstad/add_asm_linter
Add support for ASM files using GCC
2017-03-27 12:32:42 +01:00
w0rp
c467a07512 Don't export the ISSUE_TEMPLATE in archives 2017-03-26 22:42:37 +01:00
w0rp
5582711680 Fix #413 Stop tests failing randomly due to issues with reading buffers too quickly 2017-03-26 02:13:21 +01:00
Lucas Kolstad
d84d91ff35 Add support for ASM files using GCC 2017-03-25 16:36:17 -07:00
w0rp
822b19ac83 Merge pull request #411 from lucaskolstad/lint_on_enter_bugfix
#272 Check if quickfix window is open before reopening
2017-03-24 21:04:49 +00:00
Lucas Kolstad
b3f6f56745 Fix #272 by checking if quickfix is open before reopening to avoid triggering a BufEnter event that causes quickly repeating linting runs when g:ale_lint_on_enter = 1.
Add test assertions that quickfix window closes when lists become empty again.
2017-03-24 10:39:37 -07:00
w0rp
a5ac3e4e4b Merge pull request #409 from lucaskolstad/document_hdevtools_support
Document support for hdevtools
2017-03-23 23:56:45 +00:00
Lucas Kolstad
3ca4c7de96 Document support for hdevtools 2017-03-23 15:57:37 -07:00
Blaž Hrastnik
ba97017380 Add the dogma checker. 2017-03-23 01:13:33 +09:00
baabelfish
9f3cdf8270 Fix problems with nim check (#404)
* Fix problems with nim check

- Multi file errors are not shown in the same buffer
- Fixes parsing of error type that contain ':'

* Remove redundant fnameescape
2017-03-22 09:11:32 +00:00
w0rp
59b5644fb3 Clean up the documentation some more, and make the description of the ALELint autocmd clearer 2017-03-22 08:57:29 +00:00
w0rp
18bae7da2e #333 Finish implementing the lint_file option 2017-03-21 14:52:02 +00:00
w0rp
c59204b94f Remove a test for experimental functionality which was removed 2017-03-21 13:58:08 +00:00
w0rp
3e13e10e03 #333 Change arguments for ale#Queue so they are more obvious, and check files in more places 2017-03-21 13:38:27 +00:00
w0rp
2d1d6fb850 Add some utility functions for changing directories for commands 2017-03-21 13:09:02 +00:00
w0rp
6550cdfbd0 Make it clearer that global variables should be set in vimrc, in the Rust documentation 2017-03-21 12:39:12 +00:00
Dylan Araps
551d53aa67 Fix shellcheck typo in docs. shellckeck -> shellcheck (#402) 2017-03-21 12:35:44 +00:00
Ruben Paz
5122dc498d tslint parameterized executable and config path (#400)
* Allow modifying the location of the tsling executable

* Allow definition of config file path

* fnameescape configuration file
2017-03-21 12:30:32 +00:00
w0rp
51729346bf Merge pull request #399 from baabelfish/master
Add support for nim check
2017-03-19 20:34:11 +00:00
baabelfish
297bc8553c Add support for nim check 2017-03-18 19:45:37 +02:00
w0rp
e7d32fe376 #333 Pass in a flag indicating that linters should be run against files, and clear more jobs 2017-03-14 23:51:57 +00:00
w0rp
790c614b7a #333 Update line numbers for loclist items when current sign_id values are set 2017-03-14 23:04:25 +00:00
w0rp
d19a35485f #333 Keep any loclist items which have match_id values set on them 2017-03-14 20:26:44 +00:00
w0rp
5836d9a9a7 Stop using globstar for tests, so they can be run on Mac OSX 2017-03-14 15:08:26 +00:00
w0rp
6f0fc965ab #394 Attempt to fix running linters when bufwinid() doesn't exist 2017-03-13 23:45:32 +00:00
Markus Doits
fae26369d4 add slim-lint (#388)
* add slim-lint

* add slim readme entry

* add slim entry to doc

* add slimlint vader test
2017-03-13 23:21:59 +00:00
w0rp
3f3d8b0014 Merge pull request #393 from naoina/fix-coffeelint-pattern
Fix pattern of output for coffeelint
2017-03-13 23:18:06 +00:00
Naoya Inada
e969d97843 Fix pattern of output for coffeelint 2017-03-13 20:09:49 +09:00
w0rp
711ab99362 #333 Remember the IDs for highlights 2017-03-12 22:46:33 +00:00
w0rp
382e569f66 Revert "Don't save the sign ID on loclist items. This approach won't work."
This reverts commit f25a543260.
2017-03-12 22:34:32 +00:00
w0rp
f25a543260 Don't save the sign ID on loclist items. This approach won't work. 2017-03-12 21:48:40 +00:00
w0rp
a4ae5ca997 Merge pull request #389 from jparise/erlc-output-tmpdir
Write erlc output files to the temporary directory
2017-03-12 16:50:17 +00:00
Jon Parise
f3eab445ee Use tempname() to create the temporary output file
Also, "manage" this filename so ALE can clean it up.
2017-03-11 19:33:32 -08:00
w0rp
4bf6784d7d #333 Save sign IDs back on loclist items, and make it possible to get line numbers again 2017-03-11 20:33:29 +00:00
w0rp
ca78e4c150 Support older versions of Vint 2017-03-11 19:45:33 +00:00
w0rp
892fff03cc Cover error priority in the sign tests 2017-03-11 17:39:51 +00:00
w0rp
d58a18b8ed #277 #318 Support all same-directory includes for gcc and clang 2017-03-11 16:48:49 +00:00
Paul Johnson
c2ceb9e085 FIX #344 - Add options to Perl linter
Conflicts:
	doc/ale.txt
2017-03-11 14:53:30 +00:00
Jon Parise
7d6b313065 Write erlc output files to the temporary directory
In particular, if we're working with a leex (.xrl) or yecc (.yrl) source
file, erlc would otherwise generate the corresponding .erl file in the
current directory (often the project root), which is generally not what
we want.

Unconditionally writing erlc output to a temporary directory also
matches Flycheck's behavior.
2017-03-10 08:24:21 -08:00
w0rp
bd07d04670 Cover parsing of Italian signs with tests 2017-03-10 13:21:08 +00:00
w0rp
3b981e22cc Fix sign tests. 2017-03-09 22:45:22 +00:00
w0rp
587360e760 Group sign tests 2017-03-09 22:18:45 +00:00
w0rp
3cababc83b Fix #386 report problems with eslint configuration files 2017-03-09 21:05:00 +00:00
w0rp
fc072a0772 Get milliseconds timestamps without system() calls for tests 2017-03-09 20:22:02 +00:00
w0rp
ad49846a48 #376 Use the window ID for a given buffer for setting the loclist 2017-03-09 00:43:53 +00:00
w0rp
1c3f0b1e19 #333 Add the List needed for the lint_file option, and option itself. Neither do anything meaningful yet 2017-03-08 00:23:14 +00:00
w0rp
21caf54543 Make the navigation commands only work with ALE's pre-sorted list 2017-03-07 23:31:25 +00:00
w0rp
b487c62130 Speed up and simplify the custom checks a lot 2017-03-07 00:16:35 +00:00
w0rp
b3ab89ac15 Make sure to reset linters after running the nix handler test 2017-03-06 23:34:19 +00:00
w0rp
663d8f832f Group handler test cases in a directory 2017-03-06 23:32:48 +00:00
w0rp
75a2dc5ff5 Complain loudly when other conflicting plugins are installed 2017-03-06 23:15:34 +00:00
w0rp
70fb1606ad Merge pull request #383 from alibabzo/add-nix-linter
Add support for nix linting
2017-03-06 18:33:00 +00:00
Alistair Bill
f659d97504 Add nix handler test cases 2017-03-05 20:36:29 +00:00
Alistair Bill
be57b545b7 Add support for nix linting 2017-03-05 20:36:29 +00:00
w0rp
76df2d393b Fix detailed messages with newline characters 2017-03-04 23:55:12 +00:00
w0rp
c1947d13cf #384 Try and stop stupid errors coming from the gobuild functions 2017-03-04 23:34:57 +00:00
w0rp
fb8df75ac3 Remove a now redundant line 2017-03-04 01:22:44 +00:00
Patrick Lewis
9e9e15bc87 Add hamllint linter for Haml (#377)
* Add hamllint linter for Haml

* Simplify hamllint
2017-03-03 20:27:07 +00:00
w0rp
2750c605c1 Fix cursor issues, and clean up the cursor tests 2017-03-03 20:14:03 +00:00
w0rp
da8a0f25cc Fix the tests again 2017-03-03 19:37:24 +00:00
w0rp
1f211dbe3e Merge pull request #374 from jwoudenberg/master
WIP: Add support for error details
2017-03-03 19:36:52 +00:00
Jasper Woudenberg
7030758da6 Fix documentation error. 2017-03-02 23:20:00 -08:00
Jasper Woudenberg
edc5dee226 Merge remote-tracking branch 'upstream/master' 2017-03-02 19:04:28 -08:00
Jasper Woudenberg
ae88263f0f Add documentation for ALEDetail 2017-03-02 18:55:22 -08:00
Jasper Woudenberg
f5ddc51d85 Address some feedback 2017-03-02 18:40:07 -08:00
w0rp
969274ccc2 Try and fix issues on Travis 2017-03-03 01:01:24 +00:00
w0rp
0e50a7d278 Fix #373 - echo the cursor message after lint cycles or when leaving Insert mode 2017-03-02 23:36:31 +00:00
w0rp
fab9e8f5ea Merge pull request #375 from manuelvio/patch-1
Update sign regex for LANG = it_IT.UTF-8
2017-03-02 22:04:55 +00:00
Manuel Unno Vio
79f18e7d87 Update sign regex for LANG = it_IT.UTF-8
I've noticed that signs weren't unplaced and, learning that this was an issue depending on locale and :sign place, I've fixed the regular expression used to match those messages in my locale (it_IT.UTF-8).
2017-03-02 12:17:43 +01:00
Jasper Woudenberg
70711022db Add support for error details
Some review needed.
2017-03-01 23:27:48 -08:00
Daniel M. Capella
18508f7453 proselint: Add more supported filetypes (#367)
* proselint: Add more suported filetypes

* proselint: Minor consistency fixes

* Vim help: Disable linters by default
2017-03-02 00:06:09 +00:00
Adriaan Zonnenberg
6befe9e37c Fix PHP column matching for unexpected single quotes (#370)
* PHP: Fix column matching for unexpected single quotes

Unexpected single quotes resulted in an empty match, because PHP
surrounds the errors with quotes, and we check for the next quote to be
the ending delimiter.

For example: an unexpected string 'foo' would be presented as
`unexpected ''foo''`, and then the match would be `''`. The inner part
of that match is an empty string.

This adds a check for the keyword "expecting". Any quote after
"expecting" won't be matched, so we can use greedy matching instead of
non-greedy.

* PHP: Use "very magic"

The pattern started to get unreadable

Also replaced non-greedy matching (`\{-}`) by greedy matching, because
we don't need to match non-greedily anymore and it reads a little nicer.

* PHP: Add tests for column matches

And with that, also a test for unexpected single quotes.
2017-03-01 23:26:03 +00:00
w0rp
f578c4a792 Merge pull request #369 from equal-l2/fix-cpp-clang-standard-flag
Use latest C++ standard
2017-03-01 15:19:52 +00:00
equal-l2
4fa52fd98a Use latest C++ standard 2017-03-01 02:42:35 +09:00
w0rp
ceeff6c723 Fix #288 - Add a command for running ALE 2017-02-28 09:10:58 +00:00
w0rp
31d328b272 Fix a mistake in the documentation 2017-02-27 22:22:39 +00:00
w0rp
7a92c3a046 Merge pull request #366 from kbenzie/cmakelint
Add cmakelint support for cmake filetype
2017-02-27 22:21:42 +00:00
w0rp
b2fe1b2567 Copy all loclist items returned from handlers, and set up defaults for convenience 2017-02-26 14:51:22 +00:00
w0rp
f1e80b800c Merge pull request #364 from jsivak/feature/pylint_symbol
Add the pylint symbol name for the msg_id of the error/warning.
2017-02-25 19:19:45 +00:00
John Sivak
9c93e79a66 Add display of the pylint symbol name for the msg_id. 2017-02-25 13:23:36 -05:00
Kenneth Benzie (Benie)
b5e603bbc5 Add cmakelint support for cmake filetype 2017-02-25 17:27:03 +00:00
w0rp
f48f306ab9 Create a Contributing section in the README 2017-02-23 22:51:08 +00:00
Jon Parise
c2c6c9f491 Fix Credo's line-matching pattern (#360)
* Fix Credo's line-matching pattern

In d3e7d3d5, the line matching pattern was changed to handle filenames
other than `stdin`. Unfortunately, this broke the pattern's ability to
reliably extract both line and column numbers because the latter is an
optional match and the filename portion was very greedy. This resulted
in line numbers being discarded (treated as part of the filename) and
column numbers being interpreted as line numbers.

This change simplifies the pattern to only anchor on the line's suffix,
ignoring the filename portion entirely.

Alternatively, we could use vim's `\f` ("file name characters") class,
but that could still run into problems when `:`'s naturally appear in
the filename.

* Add a Vader test case for the Credo handler
2017-02-22 23:33:05 +00:00
Chris Paul
fef3276f34 escape dot in maker regex (#357)
* escape dot in maker regex

* Create test_typecheck_handler

* Rename test_typecheck_handler to test_typecheck_handler.vader
2017-02-21 20:32:37 +00:00
w0rp
6a02c5812c Fix #314 - quickfix should take precedence over loclist for jumping 2017-02-21 12:51:49 +00:00
w0rp
c310080359 #314 filter both lists, and add tests to cover the list retrieval 2017-02-21 12:46:07 +00:00
w0rp
1a9c8b8d06 Merge pull request #353 from pauloalem/master
Add sml support via smlnj
2017-02-21 12:10:48 +00:00
w0rp
884109c6f4 Add an extra custom check for using endif instead of end, etc. 2017-02-21 11:50:59 +00:00
w0rp
3c4af280f0 Remove a flaky PHP handler 2017-02-21 11:35:37 +00:00
w0rp
3786322cf0 Merge remote-tracking branch 'adriaanzon/php-columns' 2017-02-21 11:34:39 +00:00
w0rp
8eca101fd1 Merge pull request #348 from rob-b/add-hdevtools-linter
Add hdevtools linter for haskell
2017-02-21 11:09:15 +00:00
paulo alem
677e55df0f Add sml support via smlnj 2017-02-18 00:05:33 -02:00
Adriaan Zonnenberg
cca0222cf1 PHP: Make parser work with more error messages 2017-02-18 00:51:33 +01:00
Adriaan Zonnenberg
a18e172a96 PHP: Fix test for column highlighting 2017-02-18 00:04:59 +01:00
Rob Berry
06fe8a043f Add hdevtools linter for haskell
This adds support for the hdevtools haskell linter
https://github.com/hdevtools/hdevtools

The output for hdevtools is near identical to the ghc output so this
also extracts the ghc handler into the handle file and adds tests

* Add testing for previous major release of ghc
2017-02-17 17:18:38 +00:00
w0rp
b21ca4ed4e Use a more reliable method for getting an ID for a job 2017-02-17 10:19:44 +00:00
w0rp
bdbf36991d Prevent some stupid exceptions 2017-02-17 09:56:36 +00:00
w0rp
5041246c0e Modify the issue template to note how to capture the output of commands 2017-02-16 23:24:23 +00:00
w0rp
eac0a41ae1 #254 Add an option for logging the output of commands 2017-02-16 23:18:57 +00:00
w0rp
843370b96f #254 Capture command exit codes in the history 2017-02-16 22:19:53 +00:00
w0rp
ca17b5aebd Add an option for completely disabling command history, and add documentation 2017-02-16 21:33:44 +00:00
w0rp
3a2286a1b8 Refactor history management functions into their own file 2017-02-16 21:18:03 +00:00
w0rp
434ff01f59 Add a missing question mark 2017-02-16 21:00:39 +00:00
w0rp
8c3c84c45e Add an FAQ section to address concerns about battery life 2017-02-16 20:59:37 +00:00
w0rp
406d784f7a Merge pull request #350 from qantik/clang-fix
Fix clang++ flag typo
2017-02-16 20:38:51 +00:00
Andrea Caforio
a7272466f7 Fix clang++ flag typo. 2017-02-16 18:12:41 +01:00
Rob Berry
c4afd72792 Add hdevtools linter for haskell
This adds support for the hdevtools haskell linter
https://github.com/hdevtools/hdevtools

The output for hdevtools is near identical to the ghc output so this
also extracts the ghc handler into the handle file and adds tests
2017-02-16 10:06:48 +00:00
w0rp
8c758e339c Fix a typo 2017-02-15 23:01:15 +00:00
w0rp
9e7034c6e2 Fix #319 - Enable only cargo for Rust by default 2017-02-15 22:59:33 +00:00
Adriaan Zonnenberg
b2241e991b Support columns on php handler
Also added some tests for different error messages
2017-02-15 23:59:18 +01:00
w0rp
732e8a813f Merge pull request #346 from AlexMasterov/fix/yaml-yamllint-syntax
Fix 'yamllint' syntax
2017-02-15 22:24:58 +00:00
w0rp
ba1eb90212 #338 Don't do anything from tags files. 2017-02-15 22:03:18 +00:00
Alex Masterov
903a6dc885 Fix 'yamllint' syntax 2017-02-16 00:58:48 +03:00
w0rp
c49819e892 Merge pull request #345 from AlexMasterov/feature/yaml-yamllint-options
Add yamllint option to pass in more options
2017-02-15 21:45:19 +00:00
w0rp
cb60a2c06e Cover ALEToggle with Vader tests 2017-02-15 21:36:16 +00:00
w0rp
2e7050dbe2 Create a make target and variable for running specific tests 2017-02-15 20:40:50 +00:00
w0rp
721a850e21 Merge pull request #343 from vimeitor/master
Fix spelling
2017-02-15 19:48:41 +00:00
Alex Masterov
7ef1d485fe Add yamllint option to pass in more options 2017-02-15 11:36:16 +03:00
w0rp
14679f0bd4 Add an issue template 2017-02-14 23:56:14 +00:00
w0rp
0131526261 #254 Add a command for copying ALEInfo to your clipboard quickly 2017-02-14 23:45:22 +00:00
w0rp
ed370667c8 #254 Add command history to ALEInfo 2017-02-14 23:44:37 +00:00
w0rp
c460602cbb #338 Try and stop ALE from throwing ALEs when run from a sandbox 2017-02-14 21:02:49 +00:00
Adrià Farrés
4afa415bd9 Fix spelling 2017-02-14 20:26:19 +01:00
w0rp
78135103fb Merge pull request #342 from Exteris/bugfix/gfortran-6.3.1
Update line marker pattern for new gfortran
2017-02-14 19:06:25 +00:00
Daan van Vugt
68b6be57f1 Update line marker pattern for new gfortran
Add tests for GCC 4.1.2, 4.9.2 and 6.3.1
2017-02-14 14:31:31 +01:00
w0rp
afd0730248 #274 Stop airline from doing anything if ALE doesn't load by using a different flag for loading with a very ugly name 2017-02-14 09:18:54 +00:00
w0rp
810e420510 #274 Don't emit the warning if ALE isn't working for git commits or blank files 2017-02-13 23:48:36 +00:00
w0rp
f39e88cfa8 #274 - Fix airline integration when ALE is not loaded fully 2017-02-13 23:31:29 +00:00
w0rp
c0814934af Output ALE global variables for :ALEInfo 2017-02-13 23:15:52 +00:00
w0rp
0589022c76 Include most linter variables in ALEInfo 2017-02-13 22:11:35 +00:00
w0rp
f6bc73b749 Fix a style issue 2017-02-13 12:52:44 +00:00
w0rp
a5ec5366c4 Actually catch all Job ID problems 2017-02-13 12:13:54 +00:00
w0rp
f9815fcdef Merge pull request #336 from ninjawithaneedle/master
Highlighting should not filter linter messages without column info
2017-02-13 11:02:51 +00:00
ninjawithaneedle
a2f59049dc Highlighting should not filter linter messages without column info 2017-02-13 16:30:32 +05:30
w0rp
5cdd1498b4 #283 Fix linting buffers with no filename, by creating a filename with a guess for the file extension 2017-02-13 10:36:38 +00:00
w0rp
3aa1d57b57 Fix #171 - Implement basic error highlighting 2017-02-13 00:24:25 +00:00
w0rp
a995daa827 Fix #325 - document the ALEToggle option 2017-02-12 19:26:18 +00:00
w0rp
83b46f66f8 Make a note to ask for Vader tests 2017-02-12 17:59:05 +00:00
w0rp
f0bd08ec11 Merge pull request #331 from AlexMasterov/feature/css-stylelint-options
Add stylelint option to pass in more options
2017-02-12 17:49:22 +00:00
Alex Masterov
4e082b9217 Add stylelint option to pass in more options 2017-02-12 09:25:40 +03:00
w0rp
820896315d Update the contributing guide 2017-02-12 00:26:45 +00:00
w0rp
ed269b8831 Fix the clangtidy linter, and document everything 2017-02-11 23:45:06 +00:00
Tim van Deurzen
355608b031 Add clang-tidy linter for cpp. (#275)
* Add clang-tidy linter for cpp.

* Use stdin-wrapper to allow linting as you type.
2017-02-11 23:32:56 +00:00
w0rp
4a71638061 Feed files to commands via stdin by first writing the file to a temporary file, and then piping them in via the shell instead 2017-02-11 22:43:13 +00:00
w0rp
341ea5f367 Fix the custom check issue. 2017-02-11 22:06:20 +00:00
w0rp
112f71fb17 Make javac work in a basic way 2017-02-11 22:02:38 +00:00
Valentin Finini
8c4846b68a Added support for javac (with eclipse classpath support for now) (#141)
* A try at javac support for ALE

* Small cleanup: moved '/tmp/java_ale' string into script var

* Fixed Travis-CI build failing on autocmd not being in augroup and stupid omission

* One more fix for Travis-CI

* For some reason, expandtab was not set

* Indentation and removal of header guard.

Used examples from ale_linters/c/gcc.vim and
ale_linters/javascript/eslint.vim for the indentation of string concat blocks.
2017-02-11 21:29:48 +00:00
w0rp
3551bde012 Fix #330 - Explain how to check JSX with eslint and stylelint 2017-02-11 21:18:24 +00:00
w0rp
2078255ec3 Fix filename substitution, especially on Windows 2017-02-11 20:34:14 +00:00
w0rp
ecbb276805 Replace every stdin-wrapper script with the new %t formatting support 2017-02-11 19:40:57 +00:00
w0rp
c33602534e Fix Pug linting 2017-02-11 18:49:12 +00:00
w0rp
beeef28b1a Use writefile() for temporary files, which works better 2017-02-11 18:19:01 +00:00
w0rp
03ab963d1a Add support for temporary filename substitution, for replacing stdin_wrapper 2017-02-11 18:14:18 +00:00
w0rp
88192e8662 Add support for managing temporary files/directories 2017-02-11 15:16:08 +00:00
w0rp
8ad85858b8 Merge pull request #329 from tomotanakamura/AddClangToCpp
Add clang to cpp linters.
2017-02-11 13:10:18 +00:00
tomotanakamura
2ba2aff65e Add clang to cpp linters. 2017-02-11 21:35:34 +09:00
w0rp
4737e09bcf Try and fix Travis builds again 2017-02-11 00:20:16 +00:00
w0rp
14c38cdb63 Fix #116 - Send SIGKILL to processes if they don't respond to SIGTERM 2017-02-11 00:08:05 +00:00
w0rp
81779e60bb Document the command empty string behaviour 2017-02-10 23:11:26 +00:00
w0rp
49f7ce4f6d Fix #246 Don't run flow if there's no .flowconfig 2017-02-10 22:47:56 +00:00
w0rp
926cd1a953 Fix #283 Add an option for using ch_sendraw(), which can be better for some users 2017-02-10 19:34:44 +00:00
w0rp
c528ab1eaa Fix #269 Set $TMPDIR to a default value, if not set 2017-02-10 09:45:42 +00:00
w0rp
5bda827143 Merge pull request #327 from jparise/credo-stdin-filename
Pass the buffer's filename to Credo
2017-02-10 09:20:45 +00:00
Jon Parise
d3e7d3d5e7 Pass the buffer's filename to Credo
By default, Credo attributes input from STDIN as though it came from a
file named `stdin`. This change passes the buffer's filename, too, so
that Credo can use that information when applying its configuration.

This is a nice improvement because files like `mix.exs` are normally
excluded from Credo-based linting. Previously, ALE would show lint
warnings for those files as they were edited. Now, they are correctly
honor the Credo configuration and don't produce lint output.
2017-02-09 19:24:28 -08:00
w0rp
5de445c041 Fix #315 Implement the read_buffer option 2017-02-09 23:32:57 +00:00
w0rp
9f8c76b5b9 Make ALE complain when conflicting command options are used 2017-02-09 20:44:13 +00:00
w0rp
38d9802d12 Don't export the custom-checks script in archives 2017-02-09 20:14:03 +00:00
w0rp
b0190fd080 Merge pull request #306 from ahmedelgabri/standardjs
Add standard linter
2017-02-09 18:56:40 +00:00
Daniel Lupu
d8efd4fa73 add xo support (#304)
* add xo support

* add documentation

* Fix a screw up when fixing conflicts

* Fix it harder
2017-02-09 18:54:49 +00:00
Daniel Lupu
6dfed8576e add ALEToggle command (#303)
* add ALEToggle command

* stop active jobs when toggled off

* small logic cleanup & ensure ale can be ran manually while toggled off
2017-02-09 18:47:14 +00:00
w0rp
943fe9b4b0 Merge pull request #295 from metakirby5/pr/coffeelint-local
Add support for locally installed coffee and coffeelint
2017-02-09 18:44:52 +00:00
w0rp
f67cf17070 Merge pull request #285 from medains/master
Linter addition of PHP Mess Detector
2017-02-09 18:43:26 +00:00
w0rp
73e0f87eba Document the command_chain option 2017-02-09 09:42:17 +00:00
w0rp
bf2075cd0c Revert "Add a Batch stdin wrapper script"
This reverts commit 76a03b0709.
2017-02-09 00:28:32 +00:00
w0rp
db835fa0a1 Make some corrections in the README 2017-02-08 22:25:08 +00:00
w0rp
325fcc25dd #314 Use the quickfix list for jumping between errors if that is set instead of the loclist 2017-02-08 22:14:07 +00:00
w0rp
eb37d9c1fc #39 Don't send the Vim buffer to commands before the last in a chain 2017-02-08 09:37:22 +00:00
w0rp
df2c6df819 Add a test to cover sign placement after linting 2017-02-07 22:55:23 +00:00
w0rp
c3ebe7bd9e Cover the Rust handler with some tests 2017-02-07 21:17:10 +00:00
Joshua Rubin
472631573e try fixing go build (#297)
* try fixing go build

* cache some system calls

* fix /dev/null

* use chained commands, use `go test -c` instead of `go tool compile`

* fix some unescaped shell commands

* fix a bug with explicitly setting GOPATH

* implement changes requested in code review. handle errors from multiple files. fix issue when starting a new package

* run `go env` as a job

* ensure all functions return the proper type

* fix loclist line numbers in some cases

* remove multibuffer support for now
2017-02-07 20:36:04 +00:00
w0rp
c0ac393297 #256 Attempt to fix Rust linter issues again 2017-02-07 15:19:37 +00:00
w0rp
da8408501c #256 Attempt to fix Rust linter issues 2017-02-07 15:15:22 +00:00
w0rp
a3b7056cad #289 Only use the --stdin-display-name flag if the flake8 version supports it 2017-02-06 11:12:27 +00:00
w0rp
a9a76241ac Merge pull request #307 from yous/rubocop-comment
Update comments for RuboCop pattern
2017-02-06 09:59:20 +00:00
w0rp
ccf78c40b1 Merge pull request #305 from notkild/master
Fix rust linting with cargo when multiple targets are present
2017-02-06 09:34:27 +00:00
notkild
0143eb6a53 Fix rust linting with cargo when multiple targets are present 2017-02-06 09:21:06 +01:00
Chayoung You
6f40cdca65 Update comments for RuboCop pattern 2017-02-06 15:13:13 +09:00
w0rp
9d85590421 Take the rubocop filename from the buffer number given to the function 2017-02-05 22:32:38 +00:00
w0rp
0a14bbe78d Merge pull request #299 from derekprior/dp-fix-rubocop-again
Fix Rubocop filename handling
2017-02-05 22:31:43 +00:00
Ahmed El Gabri
119695bd08 Add standard linter 2017-02-05 21:19:34 +01:00
w0rp
744d7d789f Merge pull request #294 from tpict/master
Add vint support for Neovim commands
2017-02-05 15:58:15 +00:00
w0rp
eb410b4ee6 Update the contributing guide to offer some more advice 2017-02-05 15:55:50 +00:00
w0rp
9a5fc6f932 Make a note in the FAQ about how to use quickfix errors 2017-02-05 15:34:35 +00:00
w0rp
d953c68ebb Fix mypy error parsing when column numbers are included. 2017-02-04 19:47:37 +00:00
w0rp
829f87bc6a Fix #124 Finish implementing command chaining, and make it work for DMD 2017-02-04 18:30:30 +00:00
Derek Prior
f2fc7072b9 Fix Rubocop filename handling
In my previous change, I updated the Rubocop linter to pass the filename
to Rubocop. This change was tested on a file I expected Rubocop to
ignore and the experience in vim was as I expected. However, I soon
found that ALE wasn't finding errors in files that should not be
ignored. After investigation, I found a few issues that this commit
fixes:

1. We were not properly passing the current filename. We now use
   `expand` to get the filename.
2. The regular expression used in the callback was expecting the static
   value of `_` for the filename in output. We now use a looser regular
   expression that begins matching on the first `:`.
3. The linter was defined statically. By using the current filename when
   defining the command the linter would always use the filename of the
   first Ruby file the user opened. We now use a `command_callback` to
   inject the proper filename.

I tested these changes on a configuration with included and excluded
files and found it to work as I expected. Apologies for the earlier
incorrect change.
2017-02-03 16:03:52 -05:00
Ethan Chan
69ce8502a4 add support for locally installed coffee 2017-02-02 17:03:26 -08:00
Ethan Chan
1da187a6e5 add support for locally installed coffeelint 2017-02-02 16:56:09 -08:00
w0rp
97131262ab Add a default alias for the Dockerfile filetype, which is capitalised for some users. 2017-02-02 22:26:46 +00:00
tpict
32c8d02d62 Add --enable-neovim flag to vint when appropriate 2017-02-02 19:48:18 +00:00
medains
ff096124c6 Linter addition of PHP Mess Detector 2017-02-01 16:28:51 +00:00
w0rp
512b6e00d9 Merge pull request #284 from EinfachToll/fix-gcc-command
Tell gcc to use C, not C++, when linting C source files
2017-02-01 10:46:06 +00:00
EinfachToll
e8123b3d5e Tell gcc to use C, not C++, when linting C source files
A regression bug introduced with PR #232
Ref #278
2017-02-01 11:22:21 +01:00
Łukasz Jan Niemier
a1458e9c07 Dockerfile linting via hadolint (#282)
* Add hadolint linter for Dockerfiles

* Fix path

* Fix typo

* Update docs
2017-01-30 15:27:26 +00:00
w0rp
03bab835d9 Fix #249 Mention how to clear sign background colors in the README 2017-01-30 15:22:14 +00:00
w0rp
aff56e69a9 Merge pull request #281 from derekprior/dp-fix-rubocop
Enable Rubocop to exclude files based on config
2017-01-30 15:04:09 +00:00
Derek Prior
a82ead0dc1 Enable Rubocop to exclude files based on config
When using `--stdin`, Rubocop requires that you also pass the associated
file name. ALE was previously passing `_` as the filename. By passing
the actual relative path to the file and enabling the
`--force-exclusion` option, we can get Rubocop to respect excluded files
in the configuration.

Closes #197
2017-01-27 16:29:58 -05:00
DiscoViking
a9c650cd05 Add ALEInfo command to get list of available/enabled linters (#273)
* Add ALEInfo command to get list of available/enabled linters for current filetype

* Add Vader tests for ALEInfo command

* Fix ALEInfo tests breaking CI by echoing too much output to screen

* Speculative change to Makefile which seems to fix test hanging problem locally.

* Fix Vader tests to not require a TTY
2017-01-24 15:50:49 +00:00
w0rp
fd89da113d Document the new quickfix and loclist options. 2017-01-22 15:31:28 +00:00
w0rp
b2696b105a Sort the global options in the documentation by name. 2017-01-22 15:06:33 +00:00
w0rp
d7ed49f849 Add a script for custom checks to enforce using the abort flag for functions and trailing whitespace, and fix existing issues. 2017-01-22 14:54:57 +00:00
w0rp
e4a4fcd26b Make the Erlang linter code match the style used in the rest of the codebase. Make the options match the new standard. 2017-01-22 13:51:57 +00:00
Magnus
cae153b3ac Add erlc lint for Erlang (#248) (#255)
* Add erlc lint for Erlang (#248)

* Ignore certain errors in Erlang .hrl files (#248)

A .hrl file does not need to have a -module definition. Additionally, it
is common to have unused elements in such a file, as the entities will
be used in a file including the header.

* Address change requests to Erlang linter
2017-01-22 13:42:18 +00:00
EinfachToll
23f8e7ddc5 Fix parsing of currently shown signs with Spanish locale (#268)
* Fix parsing of currently shown signs with spanish locale

* Add a test for parsing of Spanish signs
2017-01-22 13:40:23 +00:00
w0rp
a37970facd Clean up the list opening tests 2017-01-22 13:33:16 +00:00
yfery
a23173eeb2 Add option to open loclist/quicklist when there are errors (#266)
* Add option to open loclist/quicklist when there are errors

I copied PR #137, and tries to complete it by correcting some issues and
adding vader tests.

About tests, first time with vader, can you give some feedback if there
are what you expected in PR #137.

* Remove old code + fix indent issue

* add g:ale_keep_list_window_open option

* Correct bug with keep open option

* Add comment into vader file

* Fix errors for Travis CI build
2017-01-22 12:57:05 +00:00
w0rp
9820899b9e Improve mypy handling a little bit more 2017-01-20 17:30:34 +00:00
w0rp
ea438be5c1 REVERT "Fix some naming conventions and use abort for all Rust functions, and disable the rust linters for now, re #256"
This reverts commit f412b4f96f.

Conflicts:
	doc/ale.txt
2017-01-19 20:21:54 +00:00
EinfachToll
831f783493 Join the lines Neovim passes to ale (#263)
* Join the lines Neovim passes to ale

Fixes #256

* Refactor line joining into own function

* Add test for line joining

* Fix the test. Sorry.
2017-01-19 20:01:51 +00:00
w0rp
2478d7d925 Merge pull request #262 from KenjiTakahashi/fix_swiftlint
Fix SwiftLint
2017-01-19 13:23:46 +00:00
w0rp
1560f4ce03 Merge pull request #265 from aswins/mypy_fix
Fix using variable g:ale_python_mypy_options that was not defined
2017-01-18 10:35:52 +00:00
Aswin
d45505e135 Fix using variable g:ale_python_mypy_options that was not defined 2017-01-18 16:01:36 +05:30
KenjiTakahashi
62b492c727 Fix SwiftLint
1. Should be defined for 'swift' files, not 'swiftlint'.
2. Use `--use-stdin` option instead of the stdin-wrapper.
2017-01-17 19:59:45 +01:00
w0rp
41686980fd Document the mypy options, and fix spacing issues, largely in the documentation 2017-01-15 13:20:23 +00:00
w0rp
35bdd6f478 Merge pull request #237 from keith/ks/mypy-linter
Add python mypy support
2017-01-15 13:05:37 +00:00
w0rp
f1ac7c9f73 Rename pylint _args variables to _options variables 2017-01-15 13:05:07 +00:00
w0rp
548ff299f4 Merge pull request #243 from SabatierBoris/master
Add options for pylint linter
2017-01-15 13:02:51 +00:00
Junfeng Li
8762a6fa66 Support C# linting with mono compiler mcs. (#250)
* Support netcore project linting.

* Support check on the fly.

* Remove debug.

* Rename csc.vim to mcs.vim as it should be.

* Update README.

* Update doc.

* Using `=~#` instead of `=~`.
2017-01-15 12:42:17 +00:00
Masahiro H
74e7a283c0 Improve Verilator support (#205) (#258)
* improve-verilator-support

* fix for linter
2017-01-15 12:39:13 +00:00
SABATIER Boris
dc8166384c Add doc for pylint options 2017-01-13 11:04:29 +01:00
SABATIER Boris
0a9f9c0811 Add executable and arguments options for pylint linter 2017-01-13 10:59:39 +01:00
w0rp
f412b4f96f Fix some naming conventions and use abort for all Rust functions, and disable the rust linters for now, re #256 2017-01-13 09:23:03 +00:00
w0rp
3b486d3475 Prefix mandatory flake8 arguments with extra spaces so they will always work 2017-01-12 13:11:10 +00:00
w0rp
9191750b5b Fix #175 - Fix the error types for rubocop 2017-01-12 12:57:07 +00:00
EinfachToll
9c5f092b4f Add support for Rust using rustc and cargo (#230)
* Add rustc checker for rust files

* Add documentation for rustc

* Use a nice helper function

* Add cargo as linter

* Complete the doc for rust linters

* Put l: in front of every local variable

* Apply the requested stylistic changes
2017-01-12 09:33:55 +00:00
w0rp
75485d53f6 Merge pull request #245 from zefei/add-eslint-options
Add eslint option to pass in more options
2017-01-12 09:28:06 +00:00
Zefei Xuan
2c176a234e added eslint option to pass in more options 2017-01-05 00:28:32 -08:00
Zefei Xuan
5a0c3fd01e Added hack linter for php (#239)
* added hack linter

* updated docs for hack (hh_client)

* naming
2017-01-04 17:07:21 +00:00
w0rp
ed43b17201 Merge pull request #244 from icgood/fix-perlcritic-typo-exception
Fix typo in perlcritic linter dictionary
2017-01-04 13:10:35 +00:00
w0rp
c17123b631 Fix #238 Make the README show the proper linter name for Flow 2017-01-04 13:05:17 +00:00
w0rp
c9b58136bf Merge pull request #236 from Chronial/patch-1
Pass file name to flake8
2017-01-04 12:57:40 +00:00
w0rp
871c09c123 Merge pull request #235 from still-dreaming-1/fix-php-generic-error
Fix PHP lint generic error without line number
2017-01-04 12:54:54 +00:00
Ian Good
c97ad01bcb Fix typo in perlcritic linter dictionary
The linter validation logic was checking for `stdout`, `stderr`, or
`both`, resulting in an exception being thrown when loading the
perlcritic linter.
2017-01-03 14:55:23 -05:00
Keith Smiley
4566bd65c9 Add python mypy support
This adds support for the official optional python typechecker.
2016-12-30 16:12:30 -08:00
Chronial
e0928d0991 Pass file name to flake8 2016-12-30 17:06:49 +01:00
still-dreaming-1
2b251a2cee Fix PHP lint generic error without line number
This makes php output more specific error messages. The format is the normal one ALE expects, but on some systems ALE does not work with PHP unless the display_errors=1 option is used. Without that option php will only output a generic message without a line number like "Errors parsing index.php"
2016-12-28 11:10:47 -07:00
w0rp
3e1486fc92 Merge pull request #233 from LubergAlexander/master
Fixed a typo scss -> sass
2016-12-26 16:47:02 +00:00
Alexander Luberg
14aff89fb2 Fixed a typo scss -> sass 2016-12-26 08:35:22 -08:00
w0rp
fcfd8d5f56 Merge pull request #232 from grzebiel/master
Added ability to reload compilation flags for c and c++
2016-12-26 13:28:43 +00:00
w0rp
12e99489b2 Merge pull request #231 from fannheyward/master
Redirect go build output to /dev/null
2016-12-26 13:27:46 +00:00
grzebiel
9767fd8732 Added ability to reload compilation flags for c and c++ after loading plugin 2016-12-24 00:18:14 +01:00
Heyward Fann
e46ef0ae19 Redirect go build output to /dev/null
Named file file will be created after ALE, this can redirect the output to /dev/null if go build failed.
2016-12-23 14:56:44 +08:00
dzhou121
55827a9493 add go build for build errors (#180)
* add go build for build errors

* Add go build to doc and README

* Improvement for Go build

Go build works on package level, so copy over the other files
that belong to the same package to the temp folder as well.

* revert back to simple go build

* change gobuild script var name
2016-12-22 12:10:21 +00:00
diartyz
6c0996eb9c [enhancement] add node_modules support for stylelint & htmlhint (#226)
* Add node_modules support for stylelint

* add node_modules support for htmlhint

* fix stdin

* update doc about stylelint & htmlhint
2016-12-22 11:39:01 +00:00
w0rp
cd6d8f2ab6 Fix #229 Disable text linters by default 2016-12-22 11:32:20 +00:00
w0rp
771bfe3b18 #193 Fix a parsing error for parsing errors with eslint 2016-12-22 11:16:22 +00:00
Eric Lehner
bda6df61a0 Elm file filter & Windows bug fixes (#223)
* Filters out unrelated errors in Elm linter

The function now filters out errors that are unrelated to the file,
those that were found in imported modules.

It does this by comparing the temp directory environment variable to the
file name in the elm output. If the file begins with the temp directory,
then it sould be included (it's from the buffer).

* Changing output to '/dev/null'

Turns out the compiler only accepts /dev/null as an ignorable name. It's
hard-coded here
https://github.com/elm-lang/elm-make/blob/master/src/Flags.hs

Changing this allows Windows linting to work. Otherwise the compiler
errors when using "nul"

* Fixes for Windows

Should now be able to successfully handle Windows.

Windows seemed to not handle the ";" properly, so I switched it to "&&",
which probably should've been done anyway to prevent false positives.

Oddly, matchend(l:error.file, l:temp_dir), and various other regex
solutions, couldn't properly match the two. Subsetting did though, hence
the new solution.

* Applying corrections

Made the file check case-insensitive for Windows, case-sensitive for
Unix/non-windows.

Added comment explaining hard coding of 'dev/null'

* Spelling correction

* Minor corrections

Actually uses the is_file_buffer variable now, added space between the
if statements, and added space between '-'
2016-12-16 10:41:21 +00:00
w0rp
8cb9b2ba4e Make sign parsing testable, and add tests for it against various languages. 2016-12-16 10:01:28 +00:00
w0rp
7e6d5292f7 Merge pull request #224 from cympfh/master
Fix: sign pattern
2016-12-16 09:33:52 +00:00
cympfh
8df2444ec4 Fix: sign pattern 2016-12-15 13:57:26 +09:00
w0rp
4ad5c4757c Merge pull request #221 from rob-b/improve-formatting-of-haskell-linters
Improve formatting of ghc and hlint haskell linters
2016-12-14 19:13:19 +00:00
w0rp
54b55bb39c Merge pull request #222 from justinmk/fixfuncref
Nvim: pass functions as funcrefs
2016-12-14 19:09:56 +00:00
Justin M. Keyes
1ae851878a Nvim: pass functions as funcrefs
neovim/neovim#5529 merged support for Vim's partial functions, which
made nvim more strict about dictionary functions and callbacks, to
match Vim behavior.
2016-12-14 17:40:45 +01:00
Rob Berry
0ffef758ae Improve formatting of ghc and hlint haskell linters
For ghc, it seemed that the conditional

```
if l:corrected_lines[-1] =~# ': error:$'
    let l:line = substitute(l:line, '\v^\s+', ' ', '')
endif
```

was never being reached. It's actually better to unconditionally
collapse whitespace anyway and so I simply removed the conditional
check.

For hlint I added more information about the error. This changes the
reported error from `Error:` to something like:
` Error: Avoid lambda. Found: \ x -> foo x Why not: foo`
2016-12-14 12:50:14 +00:00
David Mohundro
3418faf054 Add support for Swift with swiftlint (#214)
* Add support for swift with swiftlint

* Fix issue by adding '.swift' file extension
2016-12-13 15:28:20 +00:00
w0rp
10777d3421 Add tests to cover definitions for linters so far. 2016-12-13 13:33:19 +00:00
w0rp
f950c29035 Implement command chaining. Tests and documentation to come. 2016-12-13 10:19:56 +00:00
w0rp
88f4598ea2 Fix the proeslint linter for plaintext files 2016-12-13 10:19:19 +00:00
w0rp
76a03b0709 Add a Batch stdin wrapper script 2016-12-13 10:00:40 +00:00
Eric Lehner
70e379cc46 Add Elm linting via elm-make (#213)
* Add support for Elm linting

* Adding documentation for Elm

* Adjusting spacing

* Addressing concerns listed in pull request

Removed the s:FindRootDirectory function as it does not make much sense
in this context. Adjusted the rest of the code to handle the removal of
that function, including using the ale#util function to find the nearest
file.

Ensured that when an empty filepath is found, the code does not attempt
to change directories.

Ensured that the linter would take from stdin using the wrapper.
2016-12-13 09:06:04 +00:00
w0rp
25f6445c50 Merge pull request #210 from apuignav/error-cpp
Catch g++ fatal error
2016-12-08 09:05:36 +00:00
Albert Puig
b5013ba54b Catch g++ fatal error 2016-12-08 09:32:57 +01:00
w0rp
815be12649 Merge pull request #209 from apuignav/ignore-pylint
Skip I0011 messages in pylint.
2016-12-07 22:57:12 +00:00
Albert Puig
88c203b686 Skip I0011 messages in pylint.
Ignore 'Locally disabling %s' messages from pylint.
2016-12-07 23:54:41 +01:00
w0rp
aee339f401 Document the new stylelint linter 2016-12-06 13:26:06 +00:00
w0rp
d5c626667e Merge pull request #207 from diartyz/master
[new linter] add stylelint support
2016-12-06 13:22:47 +00:00
diartyz
725957de6e add stylelint support 2016-12-06 21:14:14 +08:00
w0rp
1a749a6b43 Merge pull request #201 from kyrisu/fix-proper_extension_handling_for_tslint
Fix proper extension handling for tslint
2016-12-05 11:14:08 +00:00
Krystian Paszkiewicz
ff8f3673eb Fix proper extension handling for tslint 2016-12-05 08:42:00 +00:00
w0rp
d77e5a9308 #200 Make systemverilog files use the verilog linters by default 2016-12-04 23:13:57 +00:00
Andrew Balmos
35307c0585 LaTeX Linters (#190)
* Add chktex linter

* Alias plaintex to tex

* Add lacheck linter

Closes #179

* Add the chktex warning code

This very useful to have when you want to suppress lint warnings with LaTeX
comments. chktex tends to be a bit noisy so this often needed.

* lacheck: Make regex less specific

To be more robust future changes in `stdin-wrapper`
2016-12-04 22:19:06 +00:00
kyrisu
bbdff82aee Add support for tslint.json file detection in tslint (#198)
* Add support for tslint.json file detection in tslint

* Fix tslint.json path building for tslint
2016-12-04 22:17:22 +00:00
w0rp
3a1caca907 Merge pull request #195 from mortonfox/rubocop-options
Add options variable for ruby-rubocop
2016-12-02 09:18:18 +00:00
Po Shan Cheah
5636626da1 Add options variable for ruby-rubocop 2016-12-01 12:28:27 -05:00
w0rp
f5a4e11894 Add an FAQ section describing how to run linters when files are saved. 2016-12-01 09:52:43 +00:00
w0rp
66b183e1ba Fix #188: Revert to and older version of the Haskell linter, which works better 2016-11-28 09:53:07 +00:00
poohzrn
900b4cdff3 Add Proselint (#185)
* Add Proselint
- Markdown
- Tex
- Text

* Use ale#handler#HandleUnixFormatAsWarning

* Indentation
2016-11-28 09:36:11 +00:00
Alexander "Ace" Olofsson
e03df80a09 Add puppet linters (#183)
* Start adding Puppet linters

* Use the correct output stream for puppet parser

* Finish Puppet and puppet-lint linters

* Add Puppet information to documentation
2016-11-25 12:00:07 +00:00
w0rp
da37989960 Merge pull request #186 from poohzrn/patch-1
Fix links to handlers.vim
2016-11-25 11:53:26 +00:00
poohzrn
10bacf0996 Fix links to handlers.vim 2016-11-24 20:19:24 +01:00
Andrey Popp
f7e6236fe8 Add ocaml linter: merlin (#177)
* Add ocaml linter: merlin

* Add docs for ocaml-merlin integration.

* Remove annoying error message from ocaml merlin linter

* Update doc to list merlin linter
2016-11-23 15:19:36 +00:00
Andrey Popp
d700da8cb8 Flow linter improvements (#176)
* Fix flow linter to provide filename of the buffer

Related #173

* Fix flow linter not to fail on empty response

* Various improvement to message parsing
2016-11-21 09:53:18 +00:00
Marius Gedminas
713a6910d4 Add g:ale_python_flake8_executable (#174)
* Add g:ale_python_flake8_executable

Closes #172.

* Add g:ale_python_flake8_args

* Always add - to flake8 invocations
2016-11-14 17:52:31 +00:00
w0rp
498a9435de Document that typecheck is now supported 2016-11-10 16:24:17 +00:00
w0rp
7669550ae2 Merge pull request #170 from mkusher/typescript_typecheck_linter
Add typecheck linter for typescript
2016-11-10 16:20:28 +00:00
Aleh Kashnikau
0a3faa60f7 removed useless echom from typecheck.vim 2016-11-10 18:48:09 +03:00
Aleh Kashnikau
2e5f3899d1 Add typecheck linter for typescript 2016-11-10 18:41:02 +03:00
w0rp
ccc08d08f6 Merge pull request #164 from delianides/master
flow linting should only happen on flow typed files.
2016-11-05 21:02:59 +00:00
purpleP
60b89abd9c changed while read -r loop to cat > for portability and simplicity (#165)
* changed while read -r loop to cat > for portability and simplicity

* typo fix
2016-11-05 20:43:57 +00:00
w0rp
ec2845eefa Take sign information out of the buffer variables, and make it so dummy signs are set and removed more reliably. 2016-11-04 11:58:56 +00:00
w0rp
ca18a80e3e #159 Change the condition for checking for Vim 8 features to work better in MacVim 7. 2016-11-04 10:17:49 +00:00
delianides
8d5353831e flow linting should only happen on flow typed files. 2016-11-03 15:51:49 -04:00
w0rp
f9cbc69ce1 Re-align documentation markers. 2016-11-03 10:17:25 +00:00
w0rp
175db78f35 Merge pull request #162 from mshr-h/fix-document
Fix docment for c-clang
2016-11-02 09:08:58 +00:00
Masahiro H
8ba5b3cb76 Update ale.txt 2016-11-02 15:19:24 +09:00
mshr-h
afa37e6855 Fix docment for c-clang 2016-11-02 15:16:42 +09:00
w0rp
5b8410f868 Merge pull request #156 from edwlarkey/add_foodcritic
Added support for foodcritic
2016-11-01 20:44:25 +00:00
Edward Larkey
8632e6b4e0 Added support for foodcritic
Adding support the foodcritic linter for Chef files.
Listing all issues as warnings for now
Doesn't get in the way of rubocop linting if ft=ruby.chef
Updated documentation

Closes #127
2016-11-01 15:36:08 -05:00
w0rp
f03fb64e51 #160 Switch back to using readline for writing stdin to the temporary file, because it actually works on all machines. 2016-11-01 20:30:15 +00:00
Zach Perrault
4088347901 Add FlowType support (#157)
* Add `javascript/flow` linter

* Add documentation for flow

* Remove a line from the docs that was from eslint

* Only run if flow gives output; Correct link in doc

* Address PR feedback #157
2016-11-01 09:00:08 +00:00
w0rp
614a30a508 Improve file blacklisting to make Unite.vim not fuck up. 2016-10-31 14:47:08 +00:00
w0rp
cb410927d1 Reduce sign column juttering by waiting for all jobs to complete before updating everything. 2016-10-31 13:45:22 +00:00
w0rp
f44756f347 Merge pull request #158 from mshr-h/support-clang-for-c
Add support for clang for C language
2016-10-31 10:58:40 +00:00
mshr-h
e3a8829d67 Add support for clang for c 2016-10-31 14:38:13 +09:00
w0rp
9028d1f132 Add pylint to the list of supported tools. 2016-10-30 09:47:06 +00:00
w0rp
a6ca60203f Increase the delay for linting on entering a buffer. 2016-10-30 09:29:11 +00:00
w0rp
629e6a3675 Merge pull request #153 from keith/ks/shellcheck
Choose shell dialect based on vim syntax
2016-10-30 09:24:39 +00:00
w0rp
c4ab4855b7 Merge pull request #155 from deathmaz/feature/htmlhint-args
Added options variable for htmlhint
2016-10-30 09:21:55 +00:00
w0rp
8bee64d1b7 Update the documentation to match the code 2016-10-30 09:21:34 +00:00
w0rp
e9bbbbdf3e Merge pull request #151 from keith/ks/pylint
Add pylint formatter
2016-10-30 09:20:02 +00:00
deathmaz
9a4645fc7f Default stdin in htmlhint options 2016-10-28 12:42:55 +03:00
Keith Smiley
5fc2f8f6c0 Choose shell dialect based on vim syntax
Shellcheck is smart enough to check the shebang in a given file to
determine which dialect to use. Unfortunately this doesn't work for
files without shebangs, even if it might be apparent what dialect should
be used, such as "bashrc" or "foo.bash". Luckily `filetype.vim` defines
specific vars based on which shell dialect is being used based on a huge
list of conditions. With this change we take those into account for all
the types shellcheck supports, otherwise we fallback to letting it try
and decide.
2016-10-27 18:46:58 -07:00
Keith Smiley
86cc2aab71 Add pylint formatter
This customizes the output format of pylint in order to use the same
pep8 parser
2016-10-27 18:38:26 -07:00
deathmaz
5b56103c69 Added optoins variable for htmlhint 2016-10-27 18:31:49 +03:00
w0rp
c8821fc049 #144 - Implement commands for moving through warnings/errors 2016-10-26 10:36:53 +01:00
w0rp
1bcee7ef33 Mention the Google Vimscript Style Guide in the contributing file. 2016-10-25 17:41:34 +01:00
w0rp
454dbbe33e Merge remote-tracking branch 'origin/echo-less' 2016-10-25 16:51:50 +01:00
w0rp
aa4c669ea0 #148 - Check the cursor position so we don't try to echo too frequently. 2016-10-25 16:07:20 +01:00
w0rp
60762d5018 Merge pull request #143 from w0rp/better-buffer-cleanup
Stop jobs when buffers close
2016-10-25 16:02:47 +01:00
w0rp
222d9e6908 Fix the autocmd suggestion some more 2016-10-25 15:46:18 +01:00
w0rp
9a019e2342 Fix a mistake in the FAQ code for the autocmd event 2016-10-25 15:01:10 +01:00
w0rp
73c9a1f965 #148 Do not run ALE for NERDTree or Unite.vim buffers. 2016-10-25 14:09:58 +01:00
w0rp
0fbf7bcc99 Fix the headings and table of contents. 2016-10-25 10:44:50 +01:00
w0rp
2bcb21f350 Restructure the README. 2016-10-25 10:39:06 +01:00
w0rp
d6a7b0f518 #119 - Stop ALE clearing the echo message when it doesn't need to. 2016-10-24 20:55:20 +01:00
w0rp
b9428b7db0 Merge #139 - Add Markdown linting support 2016-10-24 20:40:24 +01:00
Alex Layton
95373ddab5 Add support for mlint, a MATLAB linter (#145)
* Add support for mlint, a MATLAB linter

* Fix mlint linter as requested

* Clean up leftover loaded flag for mlint
2016-10-24 20:32:52 +01:00
w0rp
6e66b60b63 Limit Travis to only building master on push. 2016-10-24 20:27:36 +01:00
w0rp
79552872f3 Merge pull request #142 from w0rp/use-local-jshint-program
Add node_modules support for JSHint, and use the global config as a fallback
2016-10-24 20:23:15 +01:00
w0rp
c546f47cc0 Merge everything into the one global map. 2016-10-24 20:21:42 +01:00
w0rp
0dbf08f6d5 Add some comments to some lines to make things clearer. 2016-10-24 09:58:45 +01:00
w0rp
7481facd73 #107 Stop jobs when buffers close 2016-10-23 22:41:00 +01:00
w0rp
226b4ed586 Add node_modules support for JSHint, and use the global config as a fallback. 2016-10-23 13:25:50 +01:00
w0rp
36461b69d7 Support loading eslint from node_modules, re issue #118. 2016-10-23 13:04:41 +01:00
w0rp
f94865c4ce Merge pull request #140 from neersighted/cleanup
Clean up some test filenames and extraneous code
2016-10-23 10:41:58 +01:00
Bjorn Neergaard
dc99282f79 Clean up some test filenames and extraneous code 2016-10-22 08:53:28 -05:00
w0rp
89d8f2a0bc Merge pull request #138 from neersighted/dotft
Add support for dot-seperate linters, improve linter tests
2016-10-22 14:35:13 +01:00
Bjorn Neergaard
99aebcafac Docs! 2016-10-22 08:31:29 -05:00
w0rp
cd00a18c3a Make builds fail again when there are Vint warnings. 2016-10-22 14:20:05 +01:00
Łukasz Jan Niemier
e293e0b5ab Use cat instead of read -r to stream stdin to file (#120)
* Use `cat` instead of `read -r` to stream stdin to file

* Cleanup dmd-wrapper

* Fix typo

* Make wrapper work on macOS

* Use fifo instead of temporary file

* Fix stdin-wrapper

* Use `awk` instead of `read` hackery

* Finish refactoring

* Fix `exec` issue

* Add myself as an coauthor of wrapper scripts (no shame at all :P)

* Fix dmd-wrapper

* Extract check_dubfile
2016-10-22 13:52:49 +01:00
Bjorn Neergaard
f49f615ef6 Add support for dot-seperate linters, improve linter tests
This PR first and formost implements support for dot-seperate filetypes,
a very trivial change.

This closes #132

But more importantly, this PR vastly improves the test quality for
`ale#linter#Get`. It enables us to reset the state of ale's internal
linter cache, to facilitate better testing, as well as making use of
mocked linters instead of depending on linters on disk (which may
change). In addition, a dummy linter is defined to test the autoloading
behavior.

Header guards were removed from all linters as:

* A: ale won't try and load linters if they already exist in memory
* B: we can't reset state for testing if they can't be loaded again
2016-10-21 21:02:20 -05:00
w0rp
216eadbcbe Merge pull request #133 from ehzShelter/master
Added c++14 standard support and POSIX API compile time linker flags and ISO c++14 atomic and thread library support…
2016-10-21 18:08:25 +01:00
ehzShelter
1e83489691 make it less verbose for c and cpp 2016-10-21 20:02:20 +06:00
w0rp
5eee70cf37 Merge pull request #129 from neersighted/ansible
Add ansible-lint support and factor out PEP8 handler
2016-10-21 09:21:50 +01:00
ehzShelter
ce3d79550d Added c++14 standard support and POSIX API compile time linker flags for avoiding annoying errors and warnings 2016-10-21 13:07:51 +06:00
Bjorn Neergaard
c697ef05bb Add PEP8 handler test. 2016-10-20 22:52:25 -05:00
w0rp
7a06d276c2 #131 Keep the error types in the message for eslint 2016-10-20 18:07:55 +01:00
Bjorn Neergaard
a2e4af1626 Document ansible-lint 2016-10-20 09:27:57 -05:00
Bjorn Neergaard
c34664120b Add ansible-lint support and factor out PEP8 handler 2016-10-20 09:23:23 -05:00
Bart Libert
a34fb0a6a7 Add support for cppcheck (#126)
* Add support for cppcheck

* Fix vint error in cppcheck handler

* Add vader test for CppCheck format handler
2016-10-20 12:30:45 +01:00
w0rp
acb209aa11 Fix the D error parsing to handle output without column numbers. 2016-10-19 23:42:00 +01:00
w0rp
6df632218e Add a test which checks that we can find the stdin-wrapper script. 2016-10-19 23:26:07 +01:00
315 changed files with 14386 additions and 2174 deletions

3
.gitattributes vendored
View File

@@ -1,7 +1,10 @@
.* 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
/test export-ignore

1
.gitignore vendored
View File

@@ -2,3 +2,4 @@
/doc/tags
.*
*.obj
tags

View File

@@ -2,6 +2,9 @@
sudo: required
services:
- docker
branches:
only:
- master
language: python
script: |
make test

View File

@@ -1,25 +1,66 @@
# Contributing to ALE
1. [Guidelines](#guidelines)
2. [Creating Pull Requests](#pull-requests)
3. [Creating Pull Requests](#compiling)
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
## 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>
# 2. Creating Pull Requests
## 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.
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 to the best language ever.
" Description: This file adds support for awesomelinter for the best language ever.
```
If you want to credit multiple authors, you can comma separate them.
@@ -28,34 +69,105 @@ If you want to credit multiple authors, you can comma separate them.
" Author: John Smith <john.smith@gmail.com>, Jane Doe <https://jane-doe.info>
```
# 2.1. Adding a New Linter
<a name="adding-a-new-linter"></a>
If you add a new linter, look for existing handlers first in the [handlers.vim](plugin/ale/handlers.vim) file. 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.vim](plugin/ale/handlers.vim) file, and use the generic handler in both places.
### 3.i. Adding a New Linter
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 are sorted alphabetically in the
table and list.
If you add a new linter, look for existing handlers first in the
[handlers.vim](autoload/ale/handlers.vim) file. 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.vim](autoload/ale/handlers.vim) file, and use the generic handler in
both places.
# 2.2. Adding New Options
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.
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, and options specific to a particular linter should go in the section
for that linter.
<a name="adding-new-options"></a>
<a name="compiling"></a>
### 3.ii. Adding New Options
# 3. Compiling the Windows stdin wrapper
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.
To compile the stdin wrapper program for Windows, when updating the D program, you will need to compile the program with
[LDC](https://github.com/ldc-developers/ldc) in release mode. Download and install the Community edition of Visual Studio
from [the Visual Studio website](https://www.visualstudio.com/downloads/) first before installing LDC. LDC typically comes in
a ZIP you can just extract somewhere.
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.
Make sure to compile with the 32-bit architecture flag, otherwise the EXE will not run on 32-bit machines.
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...`.
```
ldc2 -m32 -Oz -release stdin_wrapper.d -of=stdin-wrapper.exe
```
<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.

View File

@@ -3,11 +3,16 @@ FROM tweekmonster/vim-testbed:latest
RUN install_vim -tag v8.0.0000 -build \
-tag v8.0.0027 -build
# the clang package includes clang-tidy
ENV PACKAGES="\
bash \
git \
python=2.7.12-r0 \
py-pip=8.1.2-r0 \
python \
py-pip \
nodejs \
gcc \
g++ \
clang \
"
RUN apk --update add $PACKAGES && \
rm -rf /var/cache/apk/* /tmp/* /var/tmp/*

12
ISSUE_TEMPLATE.md Normal file
View File

@@ -0,0 +1,12 @@
<!--
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.
If you are experiencing a bug where ALE is not correctly parsing the output of
commands, set g:ale_history_log_output to 1, and run ALE again, and then
:ALEInfo should include the full output of each command which ran.
Whatever the case, describe the your issue here.
-->

View File

@@ -1,10 +1,20 @@
IMAGE ?= w0rp/ale
CURRENT_IMAGE_ID = 107e4efc4267
SHELL := /usr/bin/env bash
IMAGE ?= w0rp/ale:30a9967dbdb1
CURRENT_IMAGE_ID = 30a9967dbdb1
DOCKER_FLAGS = --rm -v $(PWD):/testplugin -v $(PWD)/test:/home "$(IMAGE)"
tests = test/*.vader test/*/*.vader test/*/*/*.vader test/*/*/*/*.vader
test-setup:
docker images -q w0rp/ale | grep ^$(CURRENT_IMAGE_ID) > /dev/null || \
docker pull $(IMAGE)
docker pull w0rp/ale
vader: test-setup
@:; \
vims=$$(docker run --rm $(IMAGE) ls /vim-build/bin | grep -E '^n?vim'); \
if [ -z "$$vims" ]; then echo "No Vims found!"; exit 1; fi; \
for vim in $$vims; do \
docker run -a stderr $(DOCKER_FLAGS) $$vim '+Vader! $(tests)'; \
done
test: test-setup
@:; \
@@ -17,7 +27,7 @@ test: test-setup
echo "Running tests for $$vim"; \
echo '========================================'; \
echo; \
docker run -a stderr $(DOCKER_FLAGS) $$vim '+Vader! test/*' || EXIT=$$?; \
docker run -a stderr $(DOCKER_FLAGS) $$vim '+Vader! $(tests)' || EXIT=$$?; \
done; \
echo; \
echo '========================================'; \
@@ -25,8 +35,18 @@ test: test-setup
echo '========================================'; \
echo 'Vint warnings/errors follow:'; \
echo; \
set -o pipefail; \
docker run -a stdout $(DOCKER_FLAGS) vint -s /testplugin | sed s:^/testplugin/:: || EXIT=$$?; \
set +o pipefail; \
echo; \
echo '========================================'; \
echo 'Running custom checks'; \
echo '========================================'; \
echo 'Custom warnings/errors follow:'; \
echo; \
set -o pipefail; \
docker run -v $(PWD):/testplugin "$(IMAGE)" /testplugin/custom-checks /testplugin | sed s:^/testplugin/:: || EXIT=$$?; \
set +o pipefail; \
echo; \
exit $$EXIT;

17
PULL_REQUEST_TEMPLATE.md Normal file
View File

@@ -0,0 +1,17 @@
<!--
When creating new pull requests, please consider the following.
* 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!
-->

422
README.md
View File

@@ -15,7 +15,31 @@ back to a filesystem.
In other words, this plugin allows you to lint while you type.
## Supported Languages and Tools
## Table of Contents
1. [Supported Languages and Tools](#supported-languages)
2. [Usage](#usage)
3. [Installation](#installation)
1. [Installation with Pathogen](#installation-with-pathogen)
2. [Installation with Vundle](#installation-with-vundle)
3. [Manual Installation](#manual-installation)
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.
@@ -28,44 +52,76 @@ 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/)|
| 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 | [gcc](https://gcc.gnu.org/) |
| C++ (filetype cpp)| [gcc](https://gcc.gnu.org/) |
| C | [cppcheck](http://cppcheck.sourceforge.net), [gcc](https://gcc.gnu.org/), [clang](http://clang.llvm.org/)|
| C++ (filetype cpp) | [clang](http://clang.llvm.org/), [clangtidy](http://clang.llvm.org/extra/clang-tidy/), [cppcheck](http://cppcheck.sourceforge.net), [gcc](https://gcc.gnu.org/)|
| 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) |
| CSS | [csslint](http://csslint.net/) |
| 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)^ |
| Elixir | [credo](https://github.com/rrrene/credo) |
| D | [dmd](https://dlang.org/dmd-linux.html) |
| 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) |
| Erlang | [erlc](http://erlang.org/doc/man/erlc.html) |
| Fortran | [gcc](https://gcc.gnu.org/) |
| Go | [gofmt -e](https://golang.org/cmd/gofmt/), [go vet](https://golang.org/cmd/vet/), [golint](https://godoc.org/github.com/golang/lint) |
| Haskell | [ghc](https://www.haskell.org/ghc/), [hlint](https://hackage.haskell.org/package/hlint) |
| HTML | [HTMLHint](http://htmlhint.com/), [tidy](http://www.html-tidy.org/) |
| JavaScript | [eslint](http://eslint.org/), [jscs](http://jscs.info/), [jshint](http://jshint.com/) |
| 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) |
| 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/), [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/) |
| Java | [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/), [xo](https://github.com/sindresorhus/xo)
| JSON | [jsonlint](http://zaa.ch/jsonlint/) |
| Kotlin | [kotlinc](https://kotlinlang.org) 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/)|
| 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 | [php -l](https://secure.php.net/), [phpcs](https://github.com/squizlabs/PHP_CodeSniffer) |
| PHP | [hack](http://hacklang.org/), [php -l](https://secure.php.net/), [phpcs](https://github.com/squizlabs/PHP_CodeSniffer), [phpmd](https://phpmd.org) |
| Pod | [proselint](http://proselint.com/)|
| Pug | [pug-lint](https://github.com/pugjs/pug-lint) |
| Python | [flake8](http://flake8.pycqa.org/en/latest/) |
| Ruby | [rubocop](https://github.com/bbatsov/rubocop) |
| SASS | [sass-lint](https://www.npmjs.com/package/sass-lint) |
| SCSS | [sass-lint](https://www.npmjs.com/package/sass-lint), [scss-lint](https://github.com/brigade/scss-lint) |
| Puppet | [puppet](https://puppet.com), [puppet-lint](https://puppet-lint.com) |
| Python | [flake8](http://flake8.pycqa.org/en/latest/), [mypy](http://mypy-lang.org/), [pylint](https://www.pylint.org/) |
| 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/), [reek](https://github.com/troessner/reek), [rubocop](https://github.com/bbatsov/rubocop), [ruby](https://www.ruby-lang.org) |
| Rust | [rustc](https://www.rust-lang.org/), cargo (see `:help ale-integration-rust` for configuration instructions) |
| 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) |
| TypeScript | [tslint](https://github.com/palantir/tslint) |
| Slim | [slim-lint](https://github.com/sds/slim-lint)
| SML | [smlnj](http://www.smlnj.org/) |
| SQL | [sqlint](https://github.com/purcell/sqlint) |
| Swift | [swiftlint](https://swift.org/) |
| Texinfo | [proselint](http://proselint.com/)|
| Text^ | [proselint](http://proselint.com/), [vale](https://github.com/ValeLint/vale) |
| TypeScript | [tslint](https://github.com/palantir/tslint), 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/)|
| YAML | [yamllint](https://yamllint.readthedocs.io/) |
*^ Supported only on Unix machines via a wrapper script.*
* *^ No linters for text or Vim help filetypes are enabled by default.*
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 more tools.
<a name="usage"></a>
## Usage
## 2. Usage
Once this plugin is installed, while editing your files in supported
languages and tools which have been correctly installed,
@@ -74,32 +130,107 @@ 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.
### Options
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 full list of options supported for configuring this plugin in your
vimrc file for all given linters is as follows:
<a name="installation"></a>
| Option | Description | Default |
| ------ | ----------- | ------- |
| `g:ale_echo_cursor` | echo errors when the cursor is over them | `1` |
| `g:ale_echo_msg_format` | string format to use for the echoed message | `'%s'` |
| `g:ale_echo_msg_error_str` | string used for error severity in echoed message | `'Error'` |
| `g:ale_echo_msg_warning_str` | string used for warning severity in echoed message | `'Warning'` |
| `g:ale_lint_delay` | milliseconds to wait before linting | `200` |
| `g:ale_linters` | a dictionary of linters to whitelist | _not set_ |
| `g:ale_lint_on_enter` | lint when opening a file | `1` |
| `g:ale_lint_on_save` | lint when saving a file | `0` |
| `g:ale_lint_on_text_changed` | lint while typing | `1` |
| `g:ale_set_loclist` | set the loclist with errors | `1` |
| `g:ale_set_signs` | set gutter signs with error markers | `has('signs')` |
| `g:ale_sign_column_always` | always show the sign gutter | `0` |
| `g:ale_sign_error` | the text to use for errors in the gutter | `'>>'` |
| `g:ale_sign_offset` | an offset for sign ids | `1000000` |
| `g:ale_sign_warning` | the text to use for warnings in the gutter | `'--'` |
| `g:ale_statusline_format` | string format to use in statusline flag | `['%d error(s)', '%d warning(s)', 'OK']` |
| `g:ale_warn_about_trailing_whitespace` | enable trailing whitespace warnings for some linters | `1` |
## 3. Installation
### Selecting Particular Linters
To install this plugin, you should use one of the following methods.
For Windows users, replace usage of the Unix `~/.vim` directory with
`%USERPROFILE%\_vim`, or another directory if you have configured
Vim differently. On Windows, your `~/.vimrc` file will be similarly
stored in `%USERPROFILE%\_vimrc`.
<a name="installation-with-pathogen"></a>
### 3.i. 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.ii. 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="manual-installation"></a>
### 3.iii. Manual Installation
For installation without a package manager, you can clone this git repository
into a bundle directory as with pathogen, and add the repository to your
runtime path yourself. First clone the repository.
```bash
cd ~/.vim/bundle
git clone https://github.com/w0rp/ale.git
```
Then, modify your `~/.vimrc` file to add this plugin to your runtime path.
```vim
set nocompatible
filetype off
let &runtimepath.=',~/.vim/bundle/ale'
filetype plugin on
```
You can add the following line 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
silent! helptags ALL
```
Because the author of this plugin is a weird nerd, this is his preferred
installation method.
<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
@@ -121,15 +252,20 @@ 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.
### Always showing gutter
<a name="faq-keep-signs"></a>
You can keep the sign gutter open at all times by setting the `g:ale_sign_column_always` to 1
### 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
```
### Customize signs
<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:
@@ -138,7 +274,18 @@ let g:ale_sign_error = '>>'
let g:ale_sign_warning = '--'
```
### Statusline
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?
You can use `ALEGetStatusLine()` to integrate ALE into vim statusline.
To enable it, you should have in your `statusline` settings
@@ -163,15 +310,16 @@ let g:ale_statusline_format = ['⨉ %d', '⚠ %d', '⬥ ok']
![Statusline with issues](img/issues.png)
![Statusline with no issues](img/no_issues.png)
<a name="faq-echo-format"></a>
### Customize echoed message
### 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
* `%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.
@@ -187,58 +335,138 @@ Will give you:
![Echoed message](img/echo.png)
## Installation
<a name="faq-autocmd"></a>
To install this plugin, you should use one of the following methods.
For Windows users, replace usage of the Unix `~/.vim` directory with
`%USERPROFILE%\_vim`, or another directory if you have configured
Vim differently. On Windows, your `~/.vimrc` file will be similarly
stored in `%USERPROFILE%\_vimrc`.
### 5.vi. How can I execute some code when ALE stops linting?
### 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
```
### 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.
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
Plugin 'w0rp/ale'
augroup YourGroup
autocmd!
autocmd User ALELint call YourFunction()
augroup END
```
See the Vundle documentation for more information.
<a name="faq-navigation"></a>
### Manual Installation
### 5.vii. How can I navigate between errors quickly?
For installation without a package manager, you can clone this git repository
into a bundle directory as with pathogen, and add the repository to your
runtime path yourself. First clone the repository.
```bash
cd ~/.vim/bundle
git clone https://github.com/w0rp/ale.git
```
Then, modify your `~/.vimrc` file to add this plugin to your runtime path.
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
set nocompatible
filetype off
let &runtimepath.=',~/.vim/bundle/ale'
filetype plugin on
nmap <silent> <C-k> <Plug>(ale_previous_wrap)
nmap <silent> <C-j> <Plug>(ale_next_wrap)
```
Because the author of this plugin is a weird nerd, this is his preferred
installation method.
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
[https://github.com/styled-components/stylelint-processor-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
`:call ale#Lint()`.

37
after/plugin/ale.vim Normal file
View File

@@ -0,0 +1,37 @@
" Author: w0rp <devw0rp@gmail.com>
" Description: Follow-up checks for the plugin: warn about conflicting plugins.
" A flag for ensuring that this is not run more than one time.
if exists('g:loaded_ale_after')
finish
endif
" Set the flag so this file is not run more than one time.
let g:loaded_ale_after = 1
" Check if the flag is available and set to 0 to disable checking for and
" emitting conflicting plugin warnings.
if exists('g:ale_emit_conflict_warnings') && !g:ale_emit_conflict_warnings
finish
endif
" Conflicting Plugins Checks
function! s:GetConflictingPluginWarning(plugin_name) abort
return 'ALE conflicts with ' . a:plugin_name
\ . '. Uninstall it, or disable this warning with '
\ . '`let g:ale_emit_conflict_warnings = 0` in your vimrc file, '
\ . '*before* plugins are loaded.'
endfunction
if exists('g:loaded_syntastic_plugin')
throw s:GetConflictingPluginWarning('Syntastic')
endif
if exists('g:loaded_neomake')
throw s:GetConflictingPluginWarning('Neomake')
endif
if exists('g:loaded_validator_plugin')
throw s:GetConflictingPluginWarning('Validator')
endif

View File

@@ -0,0 +1,9 @@
" Author: Bjorn Neergaard <bjorn@neersighted.com>
" Description: ansible-lint for ansible-yaml files
call ale#linter#Define('ansible', {
\ 'name': 'ansible',
\ 'executable': 'ansible',
\ 'command': 'ansible-lint -p %t',
\ 'callback': 'ale#handlers#python#HandlePEP8Format',
\})

View File

@@ -0,0 +1,9 @@
" Author: Daniel M. Capella https://github.com/polyzen
" Description: proselint for AsciiDoc files
call ale#linter#Define('asciidoc', {
\ 'name': 'proselint',
\ 'executable': 'proselint',
\ 'command': 'proselint %t',
\ 'callback': 'ale#handlers#unix#HandleAsWarning',
\})

33
ale_linters/asm/gcc.vim Normal file
View File

@@ -0,0 +1,33 @@
" 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 ' . shellescape(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',
\})

26
ale_linters/c/clang.vim Normal file
View File

@@ -0,0 +1,26 @@
" Author: Masahiro H https://github.com/mshr-h
" Description: clang linter for c files
" Set this option to change the Clang options for warnings for C.
if !exists('g:ale_c_clang_options')
" let g:ale_c_clang_options = '-Wall'
" let g:ale_c_clang_options = '-std=c99 -Wall'
" c11 compatible
let g:ale_c_clang_options = '-std=c11 -Wall'
endif
function! ale_linters#c#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 c -fsyntax-only '
\ . '-iquote ' . shellescape(fnamemodify(bufname(a:buffer), ':p:h'))
\ . ' ' . ale#Var(a:buffer, 'c_clang_options') . ' -'
endfunction
call ale#linter#Define('c', {
\ 'name': 'clang',
\ 'output_stream': 'stderr',
\ 'executable': 'clang',
\ 'command_callback': 'ale_linters#c#clang#GetCommand',
\ 'callback': 'ale#handlers#gcc#HandleGCCFormat',
\})

View File

@@ -0,0 +1,34 @@
" Author: Bart Libert <bart.libert@gmail.com>
" Description: cppcheck linter for c files
" Set this option to change the cppcheck options
let g:ale_c_cppcheck_options = get(g:, 'ale_c_cppcheck_options', '--enable=style')
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
\ . 'cppcheck -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': 'cppcheck',
\ 'command_callback': 'ale_linters#c#cppcheck#GetCommand',
\ 'callback': 'ale#handlers#cppcheck#HandleCppCheckFormat',
\})

View File

@@ -1,23 +1,26 @@
" Author: w0rp <devw0rp@gmail.com>
" Description: gcc linter for c files
if exists('g:loaded_ale_linters_c_gcc')
finish
endif
let g:loaded_ale_linters_c_gcc = 1
" Set this option to change the GCC options for warnings for C.
if !exists('g:ale_c_gcc_options')
let g:ale_c_gcc_options = '-Wall'
" let g:ale_c_gcc_options = '-Wall'
" let g:ale_c_gcc_options = '-std=c99 -Wall'
" c11 compatible
let g:ale_c_gcc_options = '-std=c11 -Wall'
endif
function! ale_linters#c#gcc#GetCommand(buffer) abort
" -iquote with the directory the file is in makes #include work for
" headers in the same directory.
return 'gcc -S -x c -fsyntax-only '
\ . '-iquote ' . shellescape(fnamemodify(bufname(a:buffer), ':p:h'))
\ . ' ' . ale#Var(a:buffer, 'c_gcc_options') . ' -'
endfunction
call ale#linter#Define('c', {
\ 'name': 'gcc',
\ 'output_stream': 'stderr',
\ 'executable': 'gcc',
\ 'command': 'gcc -S -x c -fsyntax-only '
\ . g:ale_c_gcc_options
\ . ' -',
\ 'callback': 'ale#handlers#HandleGCCFormat',
\ 'command_callback': 'ale_linters#c#gcc#GetCommand',
\ 'callback': 'ale#handlers#gcc#HandleGCCFormat',
\})

View File

@@ -0,0 +1,42 @@
" 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',
\})

View File

@@ -0,0 +1,24 @@
" Author: Kenneth Benzie <k.benzie83@gmail.com>
" Description: cmakelint for cmake files
let g:ale_cmake_cmakelint_executable =
\ get(g:, 'ale_cmake_cmakelint_executable', 'cmakelint')
let g:ale_cmake_cmakelint_options =
\ get(g:, 'ale_cmake_cmakelint_options', '')
function! ale_linters#cmake#cmakelint#Executable(buffer) abort
return ale#Var(a:buffer, 'cmake_cmakelint_executable')
endfunction
function! ale_linters#cmake#cmakelint#Command(buffer) abort
return ale_linters#cmake#cmakelint#Executable(a:buffer)
\ . ' ' . ale#Var(a:buffer, 'cmake_cmakelint_options') . ' %t'
endfunction
call ale#linter#Define('cmake', {
\ 'name': 'cmakelint',
\ 'executable_callback': 'ale_linters#cmake#cmakelint#Executable',
\ 'command_callback': 'ale_linters#cmake#cmakelint#Command',
\ 'callback': 'ale#handlers#unix#HandleAsWarning',
\})

View File

@@ -1,17 +1,23 @@
" Author: KabbAmine - https://github.com/KabbAmine
" Description: Coffee for checking coffee files
if exists('g:loaded_ale_linters_coffee_coffee')
finish
endif
function! ale_linters#coffee#coffee#GetExecutable(buffer) abort
return ale#path#ResolveLocalPath(
\ a:buffer,
\ 'node_modules/.bin/coffee',
\ 'coffee'
\)
endfunction
let g:loaded_ale_linters_coffee_coffee = 1
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': 'coffee',
\ 'command': 'coffee -cp -s',
\ 'executable_callback': 'ale_linters#coffee#coffee#GetExecutable',
\ 'command_callback': 'ale_linters#coffee#coffee#GetCommand',
\ 'output_stream': 'stderr',
\ 'callback': 'ale#handlers#HandleGCCFormat',
\ 'callback': 'ale#handlers#gcc#HandleGCCFormat',
\})

View File

@@ -1,43 +1,34 @@
" Author: Prashanth Chandra https://github.com/prashcr
" Description: coffeelint linter for coffeescript files
if exists('g:loaded_ale_linters_coffee_coffeelint')
finish
endif
function! ale_linters#coffee#coffeelint#GetExecutable(buffer) abort
return ale#path#ResolveLocalPath(
\ a:buffer,
\ 'node_modules/.bin/coffeelint',
\ 'coffeelint'
\)
endfunction
let g:loaded_ale_linters_coffee_coffeelint = 1
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)
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*\),\(.\+\),\(.\+\)'
let l:pattern = 'stdin,\(\d\+\),\(\d*\),\(.\{-1,}\),\(.\+\)'
let l:output = []
for l:line in a:lines
let l:match = matchlist(l:line, l:pattern)
if len(l:match) == 0
continue
endif
let l:line = l:match[1] + 0
let l:column = 1
let l:type = l:match[3] ==# 'error' ? 'E' : 'W'
let l:text = l:match[4]
" vcol is needed to indicate that the column is a character
for l:match in ale#util#GetMatches(a:lines, l:pattern)
call add(l:output, {
\ 'bufnr': a:buffer,
\ 'lnum': l:line,
\ 'vcol': 0,
\ 'col': l:column,
\ 'text': l:text,
\ 'type': l:type,
\ 'nr': -1,
\ 'lnum': str2nr(l:match[1]),
\ 'type': l:match[3] ==# 'error' ? 'E' : 'W',
\ 'text': l:match[4],
\})
endfor
@@ -46,7 +37,7 @@ endfunction
call ale#linter#Define('coffee', {
\ 'name': 'coffeelint',
\ 'executable': 'coffeelint',
\ 'command': 'coffeelint --stdin --reporter csv',
\ 'executable_callback': 'ale_linters#coffee#coffeelint#GetExecutable',
\ 'command_callback': 'ale_linters#coffee#coffeelint#GetCommand',
\ 'callback': 'ale_linters#coffee#coffeelint#Handle',
\})

23
ale_linters/cpp/clang.vim Normal file
View File

@@ -0,0 +1,23 @@
" Author: Tomota Nakamura <https://github.com/tomotanakamura>
" Description: clang linter for cpp files
" Set this option to change the Clang options for warnings for CPP.
if !exists('g:ale_cpp_clang_options')
let g:ale_cpp_clang_options = '-std=c++14 -Wall'
endif
function! ale_linters#cpp#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 c++ -fsyntax-only '
\ . '-iquote ' . shellescape(fnamemodify(bufname(a:buffer), ':p:h'))
\ . ' ' . ale#Var(a:buffer, 'cpp_clang_options') . ' -'
endfunction
call ale#linter#Define('cpp', {
\ 'name': 'clang',
\ 'output_stream': 'stderr',
\ 'executable': 'clang++',
\ 'command_callback': 'ale_linters#cpp#clang#GetCommand',
\ 'callback': 'ale#handlers#gcc#HandleGCCFormat',
\})

View File

@@ -0,0 +1,31 @@
" Author: vdeurzen <tim@kompiler.org>, w0rp <devw0rp@gmail.com>
" Description: clang-tidy linter for cpp files
" Set this option to check the checks clang-tidy will apply.
let g:ale_cpp_clangtidy_checks = get(g:, 'ale_cpp_clangtidy_checks', ['*'])
" Set this option to manually set some options for clang-tidy.
" This will disable compile_commands.json detection.
let g:ale_cpp_clangtidy_options = get(g:, 'ale_cpp_clangtidy_options', '')
function! ale_linters#cpp#clangtidy#GetCommand(buffer) abort
let l:check_list = ale#Var(a:buffer, 'cpp_clangtidy_checks')
let l:check_option = !empty(l:check_list)
\ ? '-checks=' . shellescape(join(l:check_list, ',')) . ' '
\ : ''
let l:user_options = ale#Var(a:buffer, 'cpp_clangtidy_options')
let l:extra_options = !empty(l:user_options)
\ ? ' -- ' . l:user_options
\ : ''
return 'clang-tidy ' . l:check_option . '%s' . l:extra_options
endfunction
call ale#linter#Define('cpp', {
\ 'name': 'clangtidy',
\ 'output_stream': 'stdout',
\ 'executable': 'clang-tidy',
\ 'command_callback': 'ale_linters#cpp#clangtidy#GetCommand',
\ 'callback': 'ale#handlers#gcc#HandleGCCFormat',
\ 'lint_file': 1,
\})

View File

@@ -0,0 +1,34 @@
" Author: Bart Libert <bart.libert@gmail.com>
" Description: cppcheck linter for cpp files
" Set this option to change the cppcheck options
let g:ale_cpp_cppcheck_options = get(g:, 'ale_cpp_cppcheck_options', '--enable=style')
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
\ . 'cppcheck -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': 'cppcheck',
\ 'command_callback': 'ale_linters#cpp#cppcheck#GetCommand',
\ 'callback': 'ale#handlers#cppcheck#HandleCppCheckFormat',
\})

View File

@@ -1,23 +1,33 @@
" Author: geam <mdelage@student.42.fr>
" Description: gcc linter for cpp files
if exists('g:loaded_ale_linters_cpp_gcc')
finish
endif
let g:loaded_ale_linters_cpp_gcc = 1
" Set this option to change the GCC options for warnings for C.
if !exists('g:ale_cpp_gcc_options')
let g:ale_cpp_gcc_options = '-Wall'
let s:version = ale#handlers#gcc#ParseGCCVersion(systemlist('gcc --version'))
if !empty(s:version) && ale#semver#GreaterOrEqual(s:version, [4, 9, 0])
" Use c++14 support in 4.9 and above.
let g:ale_cpp_gcc_options = '-std=c++14 -Wall'
else
" Use c++1y in older versions.
let g:ale_cpp_gcc_options = '-std=c++1y -Wall'
endif
unlet! s:version
endif
function! ale_linters#cpp#gcc#GetCommand(buffer) abort
" -iquote with the directory the file is in makes #include work for
" headers in the same directory.
return 'gcc -S -x c++ -fsyntax-only '
\ . '-iquote ' . shellescape(fnamemodify(bufname(a:buffer), ':p:h'))
\ . ' ' . ale#Var(a:buffer, 'cpp_gcc_options') . ' -'
endfunction
call ale#linter#Define('cpp', {
\ 'name': 'gcc',
\ 'name': 'g++',
\ 'output_stream': 'stderr',
\ 'executable': 'gcc',
\ 'command': 'gcc -S -x c++ -fsyntax-only '
\ . g:ale_cpp_gcc_options
\ . ' -',
\ 'callback': 'ale#handlers#HandleGCCFormat',
\ 'executable': 'g++',
\ 'command_callback': 'ale_linters#cpp#gcc#GetCommand',
\ 'callback': 'ale#handlers#gcc#HandleGCCFormat',
\})

View File

@@ -0,0 +1,41 @@
" Author: Jordan Andree <https://github.com/jordanandree>
" Description: This file adds support for checking Crystal with crystal build
function! ale_linters#crystal#crystal#Handle(buffer, lines) abort
let l:output = []
let l:lines = join(a:lines, '')
if !empty(l:lines)
let l:errors = json_decode(l:lines)
for l:error in l:errors
call add(l:output, {
\ 'bufnr': a:buffer,
\ 'lnum': l:error.line + 0,
\ 'col': l:error.column + 0,
\ 'text': l:error.message,
\ 'type': 'E',
\})
endfor
endif
return l:output
endfunction
function! ale_linters#crystal#crystal#GetCommand(buffer) abort
let l:crystal_cmd = 'crystal build -f json --no-codegen -o '
let l:crystal_cmd .= shellescape(g:ale#util#nul_file)
let l:crystal_cmd .= ' %s'
return l:crystal_cmd
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',
\})

32
ale_linters/cs/mcs.vim Normal file
View File

@@ -0,0 +1,32 @@
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',
\})

View File

@@ -1,15 +1,18 @@
" Author: w0rp <devw0rp@gmail.com>
" Description: This file adds support for checking CSS code with csslint.
if exists('g:loaded_ale_linters_css_csslint')
finish
endif
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=' . shellescape(l:csslintrc)
\ : ''
let g:loaded_ale_linters_css_csslint = 1
return 'csslint --format=compact ' . l:config_option . ' %t'
endfunction
call ale#linter#Define('css', {
\ 'name': 'csslint',
\ 'executable': 'csslint',
\ 'command': g:ale#util#stdin_wrapper . ' .css csslint --format=compact',
\ 'callback': 'ale#handlers#HandleCSSLintFormat',
\ 'command_callback': 'ale_linters#css#csslint#GetCommand',
\ 'callback': 'ale#handlers#css#HandleCSSLintFormat',
\})

View File

@@ -0,0 +1,35 @@
" Author: diartyz <diartyz@gmail.com>
let g:ale_css_stylelint_executable =
\ get(g:, 'ale_css_stylelint_executable', 'stylelint')
let g:ale_css_stylelint_options =
\ get(g:, 'ale_css_stylelint_options', '')
let g:ale_css_stylelint_use_global =
\ get(g:, 'ale_css_stylelint_use_global', 0)
function! ale_linters#css#stylelint#GetExecutable(buffer) abort
if ale#Var(a:buffer, 'css_stylelint_use_global')
return ale#Var(a:buffer, 'css_stylelint_executable')
endif
return ale#path#ResolveLocalPath(
\ a:buffer,
\ 'node_modules/.bin/stylelint',
\ ale#Var(a:buffer, 'css_stylelint_executable')
\)
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',
\})

View File

@@ -1,60 +1,67 @@
" Author: w0rp <devw0rp@gmail.com>
" Description: "dmd for D files"
if exists('g:loaded_ale_linters_d_dmd')
finish
endif
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)
let g:loaded_ale_linters_d_dmd = 1
" A function for finding the dmd-wrapper script in the Vim runtime paths
function! s:FindWrapperScript()
for l:parent in split(&runtimepath, ',')
" Expand the path to deal with ~ issues.
let l:path = expand(l:parent . '/' . 'dmd-wrapper')
if filereadable(l:path)
return l:path
if !empty(l:dub_file)
return l:dub_file
endif
endfor
return ''
endfunction
function! ale_linters#d#dmd#GetCommand(buffer)
let l:wrapper_script = s:FindWrapperScript()
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:command = l:wrapper_script . ' -o- -vcolumns -c'
let l:dub_file = s:FindDUBConfig(a:buffer)
return l:command
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 ' . shellescape(fnamemodify(l:dub_file, ':h'))
\ . ' && dub describe --import-paths'
endfunction
function! ale_linters#d#dmd#Handle(buffer, lines)
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' . shellescape(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:pattern = '^[^(]\+(\([0-9]\+\)\,\?\([0-9]*\)): \([^:]\+\): \(.\+\)'
let l:output = []
for l:line in a:lines
let l:match = matchlist(l:line, l:pattern)
if len(l:match) == 0
break
endif
let l:line = l:match[1] + 0
let l:column = l:match[2] + 0
let l:type = l:match[3]
let l:text = l:match[4]
" vcol is Needed to indicate that the column is a character.
for l:match in ale#util#GetMatches(a:lines, l:pattern)
call add(l:output, {
\ 'bufnr': bufnr('%'),
\ 'lnum': l:line,
\ 'vcol': 0,
\ 'col': l:column,
\ 'text': l:text,
\ 'type': l:type ==# 'Warning' ? 'W' : 'E',
\ 'nr': -1,
\ 'lnum': l:match[1],
\ 'col': l:match[2],
\ 'type': l:match[3] ==# 'Warning' ? 'W' : 'E',
\ 'text': l:match[4],
\})
endfor
@@ -63,8 +70,10 @@ endfunction
call ale#linter#Define('d', {
\ 'name': 'dmd',
\ 'output_stream': 'stderr',
\ 'executable': 'dmd',
\ 'command_callback': 'ale_linters#d#dmd#GetCommand',
\ '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',
\})

View File

@@ -0,0 +1,37 @@
" Author: hauleth - https://github.com/hauleth
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] !=# ''
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
call ale#linter#Define('dockerfile', {
\ 'name': 'hadolint',
\ 'executable': 'hadolint',
\ 'command': 'hadolint -',
\ 'callback': 'ale_linters#dockerfile#hadolint#Handle',
\})

View File

@@ -1,51 +1,37 @@
" Author: hauleth - https://github.com/haulethe
" Author: hauleth - https://github.com/hauleth
if exists('g:loaded_ale_linters_elixir_credo')
finish
endif
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 = []
let g:loaded_ale_linters_elixir_credo = 1
for l:match in ale#util#GetMatches(a:lines, l:pattern)
let l:type = l:match[3]
let l:text = l:match[4]
function! ale_linters#elixir#credo#Handle(buffer, lines)
" Matches patterns line the following:
"
" stdin:19: F: Pipe chain should start with a raw value.
let l:pattern = '\v^stdin:(\d+):?(\d+)?: (.): (.+)$'
let l:output = []
if l:type ==# 'C'
let l:type = 'E'
elseif l:type ==# 'R'
let l:type = 'W'
endif
for l:line in a:lines
let l:match = matchlist(l:line, l:pattern)
call add(l:output, {
\ 'bufnr': a:buffer,
\ 'lnum': l:match[1] + 0,
\ 'col': l:match[2] + 0,
\ 'type': l:type,
\ 'text': l:text,
\})
endfor
if len(l:match) == 0
continue
endif
let l:type = l:match[3]
let l:text = l:match[4]
if l:type ==# 'C'
let l:type = 'E'
elseif l:type ==# 'R'
let l:type = 'W'
endif
" vcol is Needed to indicate that the column is a character.
call add(l:output, {
\ 'bufnr': a:buffer,
\ 'lnum': l:match[1] + 0,
\ 'vcol': 0,
\ 'col': l:match[2] + 0,
\ 'type': l:type,
\ 'text': l:text,
\ 'nr': -1,
\})
endfor
return l:output
return l:output
endfunction
call ale#linter#Define('elixir', {
\ 'name': 'credo',
\ 'executable': 'mix',
\ 'command': 'mix credo suggest --format=flycheck --read-from-stdin',
\ 'callback': 'ale_linters#elixir#credo#Handle' })
\ 'name': 'credo',
\ 'executable': 'mix',
\ 'command': 'mix credo suggest --format=flycheck --read-from-stdin %s',
\ 'callback': 'ale_linters#elixir#credo#Handle',
\})

View File

@@ -0,0 +1,38 @@
" 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 ==# 'C'
let l:type = 'E'
elseif l:type ==# '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',
\})

64
ale_linters/elm/make.vim Normal file
View File

@@ -0,0 +1,64 @@
" 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
for l:line in a:lines
if l:line[0] ==# '['
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] ==? l:temp_dir
else
let l:file_is_buffer = l:error.file[0:len(l:temp_dir) - 1] ==# l:temp_dir
endif
if l:file_is_buffer
call add(l:output, {
\ 'bufnr': a:buffer,
\ 'lnum': l:error.region.start.line,
\ 'col': l:error.region.start.column,
\ 'type': (l:error.type ==? 'error') ? 'E' : 'W',
\ 'text': l:error.overview,
\ 'detail': l:error.overview . "\n\n" . l:error.details
\})
endif
endfor
endif
endfor
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 ' . shellescape(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='.shellescape('/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'
\})

View File

@@ -0,0 +1,96 @@
" 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 ' . shellescape(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') ==# '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',
\})

View File

@@ -0,0 +1,11 @@
" 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',
\})

View File

@@ -1,24 +1,27 @@
" Author: w0rp <devw0rp@gmail.com>
" Description: gcc for Fortran files
if exists('g:loaded_ale_linters_fortran_gcc')
finish
" 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
let g:loaded_ale_linters_fortran_gcc = 1
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)
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:line_marker_pattern = ':\(\d\+\)[.:]\=\(\d\+\)\=:\=$'
let l:message_pattern = '^\(Error\|Warning\): \(.\+\)$'
let l:looking_for_message = 0
let l:last_loclist_obj = {}
@@ -47,9 +50,7 @@ function! ale_linters#fortran#gcc#Handle(buffer, lines)
let l:last_loclist_obj = {
\ 'bufnr': a:buffer,
\ 'lnum': l:match[1] + 0,
\ 'vcol': 0,
\ 'col': l:match[2] + 0,
\ 'nr': -1,
\}
" Start looking for the message and error type.
@@ -60,12 +61,26 @@ function! ale_linters#fortran#gcc#Handle(buffer, lines)
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': 'gcc',
\ 'command': 'gcc -S -x f95 -fsyntax-only -ffree-form '
\ . g:ale_fortran_gcc_options
\ . ' -',
\ 'executable_callback': 'ale_linters#fortran#gcc#GetExecutable',
\ 'command_callback': 'ale_linters#fortran#gcc#GetCommand',
\ 'callback': 'ale_linters#fortran#gcc#Handle',
\})

View File

@@ -0,0 +1,70 @@
" 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,
\})

View File

@@ -1,17 +1,10 @@
" Author: neersighted <bjorn@neersighted.com>
" Description: gofmt for Go files
if exists('g:loaded_ale_linters_go_gofmt')
finish
endif
let g:loaded_ale_linters_go_gofmt = 1
call ale#linter#Define('go', {
\ 'name': 'gofmt',
\ 'output_stream': 'stderr',
\ 'executable': 'gofmt',
\ 'command': g:ale#util#stdin_wrapper . ' .go gofmt -e',
\ 'callback': 'ale#handlers#HandleUnixFormatAsError',
\ 'command': 'gofmt -e %t',
\ 'callback': 'ale#handlers#unix#HandleAsError',
\})

View File

@@ -1,15 +1,9 @@
" Author: neersighted <bjorn@neersighted.com>
" Description: golint for Go files
if exists('g:loaded_ale_linters_go_golint')
finish
endif
let g:loaded_ale_linters_go_golint = 1
call ale#linter#Define('go', {
\ 'name': 'golint',
\ 'executable': 'golint',
\ 'command': g:ale#util#stdin_wrapper . ' .go golint',
\ 'callback': 'ale#handlers#HandleUnixFormatAsWarning',
\ 'command': 'golint %t',
\ 'callback': 'ale#handlers#unix#HandleAsWarning',
\})

View File

@@ -0,0 +1,46 @@
" Author: Ben Reedy <https://github.com/breed808>
" Description: Adds support for the gometalinter suite for Go files
if !exists('g:ale_go_gometalinter_options')
let g:ale_go_gometalinter_options = ''
endif
function! ale_linters#go#gometalinter#GetCommand(buffer) abort
return 'gometalinter '
\ . ale#Var(a:buffer, 'go_gometalinter_options')
\ . ' ' . shellescape(fnamemodify(bufname(a:buffer), ':p: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)
" Omit errors from files other than the one currently open
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,
\ 'type': tolower(l:match[4]) ==# 'warning' ? 'W' : 'E',
\ 'text': l:match[5],
\})
endfor
return l:output
endfunction
call ale#linter#Define('go', {
\ 'name': 'gometalinter',
\ 'executable': 'gometalinter',
\ 'command_callback': 'ale_linters#go#gometalinter#GetCommand',
\ 'callback': 'ale_linters#go#gometalinter#Handler',
\ 'lint_file': 1,
\})

View File

@@ -0,0 +1,9 @@
" 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',
\})

View File

@@ -1,17 +1,10 @@
" Author: neersighted <bjorn@neersighted.com>
" Description: go vet for Go files
if exists('g:loaded_ale_linters_go_govet')
finish
endif
let g:loaded_ale_linters_go_govet = 1
call ale#linter#Define('go', {
\ 'name': 'go vet',
\ 'output_stream': 'stderr',
\ 'executable': 'go',
\ 'command': g:ale#util#stdin_wrapper . ' .go go vet',
\ 'callback': 'ale#handlers#HandleUnixFormatAsError',
\ 'command': 'go vet %t',
\ 'callback': 'ale#handlers#unix#HandleAsError',
\})

View File

@@ -0,0 +1,9 @@
" 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',
\})

View File

@@ -0,0 +1,26 @@
" 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'
\})

View File

@@ -0,0 +1,65 @@
" Author: Adrian Zalewski <aazalewski@hotmail.com>
" Description: Ember-template-lint for checking Handlebars files
let g:ale_handlebars_embertemplatelint_executable =
\ get(g:, 'ale_handlebars_embertemplatelint_executable', 'ember-template-lint')
let g:ale_handlebars_embertemplatelint_use_global =
\ get(g:, 'ale_handlebars_embertemplatelint_use_global', 0)
function! ale_linters#handlebars#embertemplatelint#GetExecutable(buffer) abort
if ale#Var(a:buffer, 'handlebars_embertemplatelint_use_global')
return ale#Var(a:buffer, 'handlebars_embertemplatelint_executable')
endif
return ale#path#ResolveLocalPath(
\ a:buffer,
\ 'node_modules/.bin/ember-template-lint',
\ ale#Var(a:buffer, 'handlebars_embertemplatelint_executable')
\)
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
if len(a:lines) == 0
return []
endif
let l:output = []
let l:input_json = json_decode(join(a:lines, ''))
let l:file_errors = values(l:input_json)[0]
for l:error in l:file_errors
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',
\})

View File

@@ -1,24 +1,18 @@
" Author: w0rp <devw0rp@gmail.com>
" Description: ghc for Haskell files
if exists('g:loaded_ale_linters_haskell_ghc')
finish
endif
let g:loaded_ale_linters_haskell_ghc = 1
call ale#linter#Define('haskell', {
\ 'name': 'ghc',
\ 'output_stream': 'stderr',
\ 'executable': 'ghc',
\ 'command': g:ale#util#stdin_wrapper . ' .hs ghc -fno-code -v0',
\ 'callback': 'ale#handlers#HandleUnixFormatAsError',
\ 'command': 'ghc -fno-code -v0 %t',
\ 'callback': 'ale#handlers#haskell#HandleGHCFormat',
\})
call ale#linter#Define('haskell', {
\ 'name': 'stack-ghc',
\ 'output_stream': 'stderr',
\ 'executable': 'stack',
\ 'command': g:ale#util#stdin_wrapper . ' .hs stack ghc -- -fno-code -v0',
\ 'callback': 'ale#handlers#HandleUnixFormatAsError',
\ 'command': 'stack ghc -- -fno-code -v0 %t',
\ 'callback': 'ale#handlers#haskell#HandleGHCFormat',
\})

View File

@@ -0,0 +1,9 @@
" Author: rob-b
" Description: hdevtools for Haskell files
call ale#linter#Define('haskell', {
\ 'name': 'hdevtools',
\ 'executable': 'hdevtools',
\ 'command': 'hdevtools check -g -Wall -p %s %t',
\ 'callback': 'ale#handlers#haskell#HandleGHCFormat',
\})

View File

@@ -1,25 +1,17 @@
" Author: jparoz <jesse.paroz@gmail.com>
" Description: hlint for Haskell files
if exists('g:loaded_ale_linters_haskell_hlint')
finish
endif
let g:loaded_ale_linters_haskell_hlint = 1
function! ale_linters#haskell#hlint#Handle(buffer, lines)
function! ale_linters#haskell#hlint#Handle(buffer, lines) abort
let l:errors = json_decode(join(a:lines, ''))
let l:output = []
for l:error in l:errors
" vcol is Needed to indicate that the column is a character.
call add(l:output, {
\ 'bufnr': a:buffer,
\ 'lnum': l:error.startLine + 0,
\ 'vcol': 0,
\ 'col': l:error.startColumn + 0,
\ 'text': l:error.severity . ': ' . l:error.hint,
\ 'text': l:error.severity . ': ' . l:error.hint . '. Found: ' . l:error.from . ' Why not: ' . l:error.to,
\ 'type': l:error.severity ==# 'Error' ? 'E' : 'W',
\})
endfor

View File

@@ -0,0 +1,9 @@
" 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',
\})

View File

@@ -1,15 +1,32 @@
" Author: KabbAmine <amine.kabb@gmail.com>
" Author: KabbAmine <amine.kabb@gmail.com>, deathmaz <00maz1987@gmail.com>, diartyz <diartyz@gmail.com>
" Description: HTMLHint for checking html files
if exists('g:loaded_ale_linters_html_htmlhint')
finish
endif
" CLI options
let g:ale_html_htmlhint_options = get(g:, 'ale_html_htmlhint_options', '--format=unix')
let g:ale_html_htmlhint_executable = get(g:, 'ale_html_htmlhint_executable', 'htmlhint')
let g:ale_html_htmlhint_use_global = get(g:, 'ale_html_htmlhint_use_global', 0)
let g:loaded_ale_linters_html_htmlhint = 1
function! ale_linters#html#htmlhint#GetExecutable(buffer) abort
if ale#Var(a:buffer, 'html_htmlhint_use_global')
return ale#Var(a:buffer, 'html_htmlhint_executable')
endif
return ale#path#ResolveLocalPath(
\ a:buffer,
\ 'node_modules/.bin/htmlhint',
\ ale#Var(a:buffer, 'html_htmlhint_executable')
\)
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': 'htmlhint',
\ 'command': 'htmlhint --format=unix stdin',
\ 'callback': 'ale#handlers#HandleUnixFormatAsError',
\ 'executable_callback': 'ale_linters#html#htmlhint#GetExecutable',
\ 'command_callback': 'ale_linters#html#htmlhint#GetCommand',
\ 'callback': 'ale#handlers#unix#HandleAsError',
\})

View File

@@ -0,0 +1,9 @@
" 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',
\})

View File

@@ -1,15 +1,11 @@
" Author: KabbAmine <amine.kabb@gmail.com>
" Description: This file adds support for checking HTML code with tidy.
if exists('g:loaded_ale_linters_html_tidy')
finish
endif
let g:loaded_ale_linters_html_tidy = 1
" CLI options
let g:ale_html_tidy_executable = get(g:, 'ale_html_tidy_executable', 'tidy')
let g:ale_html_tidy_args = get(g:, 'ale_html_tidy_args', '-q -e -language en')
" 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
@@ -30,10 +26,14 @@ function! ale_linters#html#tidy#GetCommand(buffer) abort
\ }, &fileencoding, '-utf8')
return printf('%s %s %s -',
\ g:ale_html_tidy_executable,
\ g:ale_html_tidy_args,
\ 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
@@ -43,27 +43,17 @@ function! ale_linters#html#tidy#Handle(buffer, lines) abort
let l:pattern = '^line \(\d\+\) column \(\d\+\) - \(Warning\|Error\): \(.\+\)$'
let l:output = []
for l:line in a:lines
let l:match = matchlist(l:line, l:pattern)
if len(l:match) == 0
continue
endif
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] ==# 'Error' ? 'E' : 'W'
let l:text = l:match[4]
" vcol is Needed to indicate that the column is a character.
call add(l:output, {
\ 'bufnr': a:buffer,
\ 'lnum': l:line,
\ 'vcol': 0,
\ 'col': l:col,
\ 'text': l:text,
\ 'type': l:type,
\ 'nr': -1,
\})
endfor
@@ -72,7 +62,7 @@ endfunction
call ale#linter#Define('html', {
\ 'name': 'tidy',
\ 'executable': g:ale_html_tidy_executable,
\ 'executable_callback': 'ale_linters#html#tidy#GetExecutable',
\ 'output_stream': 'stderr',
\ 'command_callback': 'ale_linters#html#tidy#GetCommand',
\ 'callback': 'ale_linters#html#tidy#Handle',

117
ale_linters/java/javac.vim Normal file
View File

@@ -0,0 +1,117 @@
" 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', '')
" Detect if the javac command just shows an annoying popup for Mac OSX.
if has('macunix')
function s:GetIsJavacAnAppStoreStub() abort
let l:path = resolve(systemlist('which javac')[0])
for l:line in readfile(l:path)
" This string is present inside the executable for the popup.
if l:line =~? 'No Java runtime present'
return 1
endif
endfor
return 0
endfunction
let s:is_javac_an_app_store_stub = s:GetIsJavacAnAppStoreStub()
delfunction s:GetIsJavacAnAppStoreStub
else
let s:is_javac_an_app_store_stub = 0
endif
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 ' . shellescape(join(l:class_paths, s:classpath_sep))
\ : ''
endfunction
function! ale_linters#java#javac#GetCommand(buffer, import_paths) abort
" If running the command will just show a popup, then don't run it.
if s:is_javac_an_app_store_stub
return ''
endif
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 ' . shellescape(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 ' . shellescape(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:symbol_pattern = '\v^ +symbol: *(class|method) +([^ ]+)'
let l:output = []
for l:match in ale#util#GetMatches(a:lines, [l:pattern, l:symbol_pattern])
if empty(l:match[3])
" Add symbols to 'cannot find symbol' errors.
if l:output[-1].text ==# '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] ==# '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',
\})

View File

@@ -1,48 +1,88 @@
" Author: w0rp <devw0rp@gmail.com>
" Description: eslint for JavaScript files
if exists('g:loaded_ale_linters_javascript_eslint')
finish
endif
let g:loaded_ale_linters_javascript_eslint = 1
let g:ale_javascript_eslint_executable =
\ get(g:, 'ale_javascript_eslint_executable', 'eslint')
function! ale_linters#javascript#eslint#Handle(buffer, lines)
let g:ale_javascript_eslint_options =
\ get(g:, 'ale_javascript_eslint_options', '')
let g:ale_javascript_eslint_use_global =
\ get(g:, 'ale_javascript_eslint_use_global', 0)
function! ale_linters#javascript#eslint#GetExecutable(buffer) abort
if ale#Var(a:buffer, 'javascript_eslint_use_global')
return ale#Var(a:buffer, 'javascript_eslint_executable')
endif
" Look for the kinds of paths that create-react-app generates first.
let l:executable = ale#path#ResolveLocalPath(
\ a:buffer,
\ 'node_modules/eslint/bin/eslint.js',
\ ''
\)
if !empty(l:executable)
return l:executable
endif
return ale#path#ResolveLocalPath(
\ a:buffer,
\ 'node_modules/.bin/eslint',
\ ale#Var(a:buffer, 'javascript_eslint_executable')
\)
endfunction
function! ale_linters#javascript#eslint#GetCommand(buffer) abort
return shellescape(ale_linters#javascript#eslint#GetExecutable(a:buffer))
\ . ' ' . ale#Var(a:buffer, 'javascript_eslint_options')
\ . ' -f unix --stdin --stdin-filename %s'
endfunction
function! ale_linters#javascript#eslint#Handle(buffer, lines) abort
let l:config_error_pattern = '\v^ESLint couldn''t find a configuration file'
\ . '|^Cannot read config file'
\ . '|^.*Configuration for rule .* is invalid'
" Look for a message in the first few lines which indicates that
" a configuration file couldn't be found.
for l:line in a:lines[:10]
if len(matchlist(l:line, l:config_error_pattern)) > 0
return [{
\ 'lnum': 1,
\ 'text': 'eslint configuration error (type :ALEDetail for more information)',
\ 'detail': join(a:lines, "\n"),
\}]
endif
endfor
" Matches patterns line the following:
"
" /path/to/some-filename.js:47:14: Missing trailing comma. [Warning/comma-dangle]
" /path/to/some-filename.js:56:41: Missing semicolon. [Error/semi]
let l:pattern = '^.*:\(\d\+\):\(\d\+\): \(.\+\) \[\(.\+\)\]$'
" This second pattern matches lines like the following:
"
" /path/to/some-filename.js:13:3: Parsing error: Unexpected token
let l:parsing_pattern = '^.*:\(\d\+\):\(\d\+\): \(.\+\)$'
let l:output = []
for l:line in a:lines
let l:match = matchlist(l:line, l:pattern)
if len(l:match) == 0
continue
endif
for l:match in ale#util#GetMatches(a:lines, [l:pattern, l:parsing_pattern])
let l:type = 'Error'
let l:text = l:match[3]
let l:marker = l:match[4]
let l:marker_parts = split(l:marker, '/')
let l:type = l:marker_parts[0]
if len(l:marker_parts) == 2
let l:text = l:text . ' (' . l:marker_parts[1] . ')'
" Take the error type from the output if available.
if !empty(l:match[4])
let l:type = split(l:match[4], '/')[0]
let l:text .= ' [' . l:match[4] . ']'
endif
" vcol is Needed to indicate that the column is a character.
call add(l:output, {
\ 'bufnr': a:buffer,
\ 'lnum': l:match[1] + 0,
\ 'vcol': 0,
\ 'col': l:match[2] + 0,
\ 'text': l:text,
\ 'type': l:type ==# 'Warning' ? 'W' : 'E',
\ 'nr': -1,
\})
endfor
@@ -51,7 +91,7 @@ endfunction
call ale#linter#Define('javascript', {
\ 'name': 'eslint',
\ 'executable': g:ale_javascript_eslint_executable,
\ 'command': g:ale_javascript_eslint_executable . ' -f unix --stdin --stdin-filename %s',
\ 'executable_callback': 'ale_linters#javascript#eslint#GetExecutable',
\ 'command_callback': 'ale_linters#javascript#eslint#GetCommand',
\ 'callback': 'ale_linters#javascript#eslint#Handle',
\})

View File

@@ -0,0 +1,86 @@
" Author: Zach Perrault -- @zperrault
" Description: FlowType checking for JavaScript files
let g:ale_javascript_flow_executable =
\ get(g:, 'ale_javascript_flow_executable', 'flow')
let g:ale_javascript_flow_use_global =
\ get(g:, 'ale_javascript_flow_use_global', 0)
function! ale_linters#javascript#flow#GetExecutable(buffer) abort
if ale#Var(a:buffer, 'javascript_flow_use_global')
return ale#Var(a:buffer, 'javascript_flow_executable')
endif
return ale#path#ResolveLocalPath(
\ a:buffer,
\ 'node_modules/.bin/flow',
\ ale#Var(a:buffer, 'javascript_flow_executable')
\)
endfunction
function! ale_linters#javascript#flow#GetCommand(buffer) 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
return shellescape(ale_linters#javascript#flow#GetExecutable(a:buffer))
\ . ' check-contents --respect-pragma --json --from ale %s'
endfunction
function! ale_linters#javascript#flow#Handle(buffer, lines) abort
let l:str = join(a:lines, '')
if 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 ==# 0 && l:message.loc.source ==# expand('#' . a:buffer . ':p')
let l:line = l:message.loc.start.line + 0
let l:col = l:message.loc.start.column + 0
endif
if l:text ==# ''
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 ==# 'error' ? 'E' : 'W',
\})
endfor
return l:output
endfunction
call ale#linter#Define('javascript', {
\ 'name': 'flow',
\ 'executable_callback': 'ale_linters#javascript#flow#GetExecutable',
\ 'command_callback': 'ale_linters#javascript#flow#GetCommand',
\ 'callback': 'ale_linters#javascript#flow#Handle',
\})

View File

@@ -1,15 +1,9 @@
" Author: Chris Kyrouac - https://github.com/fijshion
" Description: jscs for JavaScript files
if exists('g:loaded_ale_linters_javascript_jscs')
finish
endif
let g:loaded_ale_linters_javascript_jscs = 1
call ale#linter#Define('javascript', {
\ 'name': 'jscs',
\ 'executable': 'jscs',
\ 'command': 'jscs -r unix -n -',
\ 'callback': 'ale#handlers#HandleUnixFormatAsError',
\ 'callback': 'ale#handlers#unix#HandleAsError',
\})

View File

@@ -1,29 +1,37 @@
" Author: Chris Kyrouac - https://github.com/fijshion
" Description: JSHint for Javascript files
if exists('g:loaded_ale_linters_javascript_jshint')
finish
endif
let g:loaded_ale_linters_javascript_jshint = 1
let g:ale_javascript_jshint_executable =
\ get(g:, 'ale_javascript_jshint_executable', 'jshint')
function! ale_linters#javascript#jshint#GetCommand(buffer)
" Set this to the location of the jshint configuration file to
" use a fixed location for .jshintrc
if exists('g:ale_jshint_config_loc')
let l:jshint_config = g:ale_jshint_config_loc
else
" Look for the JSHint config in parent directories.
let l:jshint_config = ale#util#FindNearestFile(a:buffer, '.jshintrc')
let g:ale_javascript_jshint_use_global =
\ get(g:, 'ale_javascript_jshint_use_global', 0)
function! ale_linters#javascript#jshint#GetExecutable(buffer) abort
if ale#Var(a:buffer, 'javascript_jshint_use_global')
return ale#Var(a:buffer, 'javascript_jshint_executable')
endif
let l:command = g:ale_javascript_jshint_executable . ' --reporter unix'
return ale#path#ResolveLocalPath(
\ a:buffer,
\ 'node_modules/.bin/jshint',
\ ale#Var(a:buffer, 'javascript_jshint_executable')
\)
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 = shellescape(ale_linters#javascript#jshint#GetExecutable(a:buffer))
let l:command .= ' --reporter unix --extract auto'
if !empty(l:jshint_config)
let l:command .= ' --config ' . fnameescape(l:jshint_config)
let l:command .= ' --config ' . shellescape(l:jshint_config)
endif
let l:command .= ' -'
@@ -33,7 +41,7 @@ endfunction
call ale#linter#Define('javascript', {
\ 'name': 'jshint',
\ 'executable': g:ale_javascript_jshint_executable,
\ 'executable_callback': 'ale_linters#javascript#jshint#GetExecutable',
\ 'command_callback': 'ale_linters#javascript#jshint#GetCommand',
\ 'callback': 'ale#handlers#HandleUnixFormatAsError',
\ 'callback': 'ale#handlers#unix#HandleAsError',
\})

View File

@@ -0,0 +1,62 @@
" Author: Ahmed El Gabri <@ahmedelgabri>
" Description: standardjs for JavaScript files
let g:ale_javascript_standard_executable =
\ get(g:, 'ale_javascript_standard_executable', 'standard')
let g:ale_javascript_standard_options =
\ get(g:, 'ale_javascript_standard_options', '')
let g:ale_javascript_standard_use_global =
\ get(g:, 'ale_javascript_standard_use_global', 0)
function! ale_linters#javascript#standard#GetExecutable(buffer) abort
if ale#Var(a:buffer, 'javascript_standard_use_global')
return ale#Var(a:buffer, 'javascript_standard_executable')
endif
return ale#path#ResolveLocalPath(
\ a:buffer,
\ 'node_modules/.bin/standard',
\ ale#Var(a:buffer, 'javascript_standard_executable')
\)
endfunction
function! ale_linters#javascript#standard#GetCommand(buffer) abort
return shellescape(ale_linters#javascript#standard#GetExecutable(a:buffer))
\ . ' ' . ale#Var(a:buffer, 'javascript_standard_options')
\ . ' --stdin %s'
endfunction
function! ale_linters#javascript#standard#Handle(buffer, lines) abort
" Matches patterns line the following:
"
" /path/to/some-filename.js:47:14: Strings must use singlequote.
" /path/to/some-filename.js:56:41: Expected indentation of 2 spaces but found 4.
" /path/to/some-filename.js:13:3: Parsing error: Unexpected token
let l:pattern = '^.*:\(\d\+\):\(\d\+\): \(.\+\)$'
let l:output = []
for l:match in ale#util#GetMatches(a:lines, l:pattern)
let l:type = 'Error'
let l:text = l:match[3]
call add(l:output, {
\ 'bufnr': a:buffer,
\ 'lnum': l:match[1] + 0,
\ 'col': l:match[2] + 0,
\ 'text': l:text,
\ 'type': 'E',
\})
endfor
return l:output
endfunction
call ale#linter#Define('javascript', {
\ 'name': 'standard',
\ 'executable_callback': 'ale_linters#javascript#standard#GetExecutable',
\ 'command_callback': 'ale_linters#javascript#standard#GetCommand',
\ 'callback': 'ale_linters#javascript#standard#Handle',
\})

View File

@@ -0,0 +1,41 @@
" Author: Daniel Lupu <lupu.daniel.f@gmail.com>
" Description: xo for JavaScript files
let g:ale_javascript_xo_executable =
\ get(g:, 'ale_javascript_xo_executable', 'xo')
let g:ale_javascript_xo_options =
\ get(g:, 'ale_javascript_xo_options', '')
let g:ale_javascript_xo_use_global =
\ get(g:, 'ale_javascript_xo_use_global', 0)
function! ale_linters#javascript#xo#GetExecutable(buffer) abort
if ale#Var(a:buffer, 'javascript_xo_use_global')
return ale#Var(a:buffer, 'javascript_xo_executable')
endif
return ale#path#ResolveLocalPath(
\ a:buffer,
\ 'node_modules/.bin/xo',
\ ale#Var(a:buffer, 'javascript_xo_executable')
\)
endfunction
function! ale_linters#javascript#xo#GetCommand(buffer) abort
return shellescape(ale_linters#javascript#xo#GetExecutable(a:buffer))
\ . ' ' . ale#Var(a:buffer, 'javascript_xo_options')
\ . ' --reporter unix --stdin --stdin-filename %s'
endfunction
function! ale_linters#javascript#xo#Handle(buffer, lines) abort
" xo uses eslint and the output format is the same
return ale_linters#javascript#eslint#Handle(a:buffer, a:lines)
endfunction
call ale#linter#Define('javascript', {
\ 'name': 'xo',
\ 'executable_callback': 'ale_linters#javascript#xo#GetExecutable',
\ 'command_callback': 'ale_linters#javascript#xo#GetCommand',
\ 'callback': 'ale_linters#javascript#xo#Handle',
\})

View File

@@ -1,34 +1,17 @@
" Author: KabbAmine <amine.kabb@gmail.com>
if exists('g:loaded_ale_linters_json_jsonlint')
finish
endif
let g:loaded_ale_linters_json_jsonlint = 1
function! ale_linters#json#jsonlint#Handle(buffer, lines)
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:line in a:lines
let l:match = matchlist(l:line, l:pattern)
if len(l:match) == 0
continue
endif
" vcol is needed to indicate that the column is a character
for l:match in ale#util#GetMatches(a:lines, l:pattern)
call add(l:output, {
\ 'bufnr': a:buffer,
\ 'lnum': l:match[1] + 0,
\ 'vcol': 0,
\ 'col': l:match[2] + 0,
\ 'text': l:match[3],
\ 'type': 'E',
\ 'nr': -1,
\})
endfor

View File

@@ -0,0 +1,116 @@
" 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')
function! ale_linters#kotlin#kotlinc#GetCommand(buffer) 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')
if filereadable(expand(ale#Var(a:buffer, 'kotlin_kotlinc_config_file'), 1))
execute 'source ' . shellescape(expand(ale#Var(a:buffer, 'kotlin_kotlinc_config_file'), 1))
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 = shellescape(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') !=# ''
let l:kotlinc_opts .= ' -cp ' . ale#Var(a:buffer, 'kotlin_kotlinc_classpath')
endif
let l:fname = ''
if ale#Var(a:buffer, 'kotlin_kotlinc_sourcepath') !=# ''
let l:fname .= expand(ale#Var(a:buffer, 'kotlin_kotlinc_sourcepath'), 1) . ' '
endif
let l:fname .= shellescape(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 !=# l:curbuf_abspath
continue
endif
let l:type_marker_str = l:type ==# '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 ==# 'warning' || l:type ==# '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',
\ 'output_stream': 'stderr',
\ 'executable': 'kotlinc',
\ 'command_callback': 'ale_linters#kotlin#kotlinc#GetCommand',
\ 'callback': 'ale_linters#kotlin#kotlinc#Handle',
\ 'lint_file': 1,
\})

View File

@@ -1,16 +1,23 @@
" Author: Sol Bekic https://github.com/s-ol
" Description: luacheck linter for lua files
if exists('g:loaded_ale_linters_lua_luacheck')
finish
endif
let g:loaded_ale_linters_lua_luacheck = 1
let g:ale_lua_luacheck_executable =
\ get(g:, 'ale_lua_luacheck_executable', 'luacheck')
function! ale_linters#lua#luacheck#Handle(buffer, lines)
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 shellescape(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
@@ -18,22 +25,12 @@ function! ale_linters#lua#luacheck#Handle(buffer, lines)
let l:pattern = '^.*:\(\d\+\):\(\d\+\): (\([WE]\)\d\+) \(.\+\)$'
let l:output = []
for l:line in a:lines
let l:match = matchlist(l:line, l:pattern)
if len(l:match) == 0
continue
endif
" vcol is Needed to indicate that the column is a character.
for l:match in ale#util#GetMatches(a:lines, l:pattern)
call add(l:output, {
\ 'bufnr': a:buffer,
\ 'lnum': l:match[1] + 0,
\ 'vcol': 0,
\ 'col': l:match[2] + 0,
\ 'text': l:match[4],
\ 'type': l:match[3],
\ 'nr': -1,
\})
endfor
@@ -42,7 +39,7 @@ endfunction
call ale#linter#Define('lua', {
\ 'name': 'luacheck',
\ 'executable': g:ale_lua_luacheck_executable,
\ 'command': g:ale_lua_luacheck_executable . ' --formatter plain --codes --filename %s -',
\ 'executable_callback': 'ale_linters#lua#luacheck#GetExecutable',
\ 'command_callback': 'ale_linters#lua#luacheck#GetCommand',
\ 'callback': 'ale_linters#lua#luacheck#Handle',
\})

View File

@@ -0,0 +1,25 @@
" 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'
\})

View File

@@ -0,0 +1,9 @@
" 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',
\})

View File

@@ -0,0 +1,9 @@
" 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',
\})

View File

@@ -0,0 +1,55 @@
" 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 ==# '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',
\})

View File

@@ -0,0 +1,60 @@
" 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 !=# '' && l:temp_buffer_filename !=# 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 ==# '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
let l:directory = shellescape(fnamemodify(bufname(a:buffer), ':p:h'))
return 'nim check --path:' . l:directory
\ . ' --threads:on --verbosity:0 --colors:off --listFullPaths %t'
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'
\})

26
ale_linters/nix/nix.vim Normal file
View File

@@ -0,0 +1,26 @@
" 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',
\})

View File

@@ -0,0 +1,9 @@
" 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',
\})

View File

@@ -0,0 +1,17 @@
" 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',
\})

View File

@@ -1,36 +1,35 @@
" Author: Vincent Lequertier <https://github.com/SkySymbol>
" Description: This file adds support for checking perl syntax
if exists('g:loaded_ale_linters_perl_perlcritic')
finish
endif
let g:ale_perl_perl_executable =
\ get(g:, 'ale_perl_perl_executable', 'perl')
let g:loaded_ale_linters_perl_perl = 1
function! ale_linters#perl#perl#Handle(buffer, lines)
let g:ale_perl_perl_options =
\ get(g:, 'ale_perl_perl_options', '-X -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
function! ale_linters#perl#perl#Handle(buffer, lines) abort
let l:pattern = '\(.\+\) at \(.\+\) line \(\d\+\)'
let l:output = []
for l:line in a:lines
let l:match = matchlist(l:line, l:pattern)
if len(l:match) == 0
continue
endif
for l:match in ale#util#GetMatches(a:lines, l:pattern)
let l:line = l:match[3]
let l:column = 1
let l:text = l:match[1]
let l:type = 'E'
" vcol is Needed to indicate that the column is a character.
call add(l:output, {
\ 'bufnr': a:buffer,
\ 'lnum': l:line,
\ 'vcol': 0,
\ 'col': l:column,
\ 'text': l:text,
\ 'type': l:type,
\ 'nr': -1,
\})
endfor
@@ -39,8 +38,8 @@ endfunction
call ale#linter#Define('perl', {
\ 'name': 'perl',
\ 'executable': 'perl',
\ 'executable_callback': 'ale_linters#perl#perl#GetExecutable',
\ 'output_stream': 'both',
\ 'command': 'perl -X -c -Mwarnings -Ilib',
\ 'command_callback': 'ale_linters#perl#perl#GetCommand',
\ 'callback': 'ale_linters#perl#perl#Handle',
\})

View File

@@ -1,36 +1,14 @@
" Author: Vincent Lequertier <https://github.com/SkySymbol>
" Description: This file adds support for checking perl with perl critic
if exists('g:loaded_ale_linters_perl_perlcritic')
finish
endif
let g:loaded_ale_linters_perl_perlcritic = 1
function! ale_linters#perl#perlcritic#Handle(buffer, lines)
function! ale_linters#perl#perlcritic#Handle(buffer, lines) abort
let l:pattern = '\(.\+\) at \(.\+\) line \(\d\+\)'
let l:output = []
for l:line in a:lines
let l:match = matchlist(l:line, l:pattern)
if len(l:match) == 0
continue
endif
let l:line = l:match[3]
let l:column = 1
let l:text = l:match[1]
let l:type = 'E'
" vcol is Needed to indicate that the column is a character.
for l:match in ale#util#GetMatches(a:lines, l:pattern)
call add(l:output, {
\ 'bufnr': a:buffer,
\ 'lnum': l:line,
\ 'vcol': 0,
\ 'col': l:column,
\ 'text': l:text,
\ 'type': l:type,
\ 'nr': -1,
\ 'text': l:match[1],
\ 'lnum': l:match[3],
\})
endfor
@@ -40,7 +18,7 @@ endfunction
call ale#linter#Define('perl', {
\ 'name': 'perlcritic',
\ 'executable': 'perlcritic',
\ 'output_stream': 'sdtout',
\ 'output_stream': 'stdout',
\ 'command': 'perlcritic --verbose 3 --nocolor',
\ 'callback': 'ale_linters#perl#perlcritic#Handle',
\})

28
ale_linters/php/hack.vim Normal file
View File

@@ -0,0 +1,28 @@
" 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',
\})

View File

@@ -1,35 +1,19 @@
" Author: Spencer Wood <https://github.com/scwood>
" Author: Spencer Wood <https://github.com/scwood>, Adriaan Zonnenberg <amz@adriaan.xyz>
" Description: This file adds support for checking PHP with php-cli
if exists('g:loaded_ale_linters_php_php')
finish
endif
let g:loaded_ale_linters_php_php = 1
function! ale_linters#php#php#Handle(buffer, lines)
function! ale_linters#php#php#Handle(buffer, lines) abort
" Matches patterns like the following:
"
" Parse error: parse error in - on line 7
let l:pattern = 'Parse error:\s\+\(.\+\) on line \(\d\+\)'
" PHP 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:line in a:lines
let l:match = matchlist(l:line, l:pattern)
if len(l:match) == 0
continue
endif
" vcol is needed to indicate that the column is a character.
for l:match in ale#util#GetMatches(a:lines, l:pattern)
call add(l:output, {
\ 'bufnr': a:buffer,
\ 'lnum': l:match[2] + 0,
\ 'vcol': 0,
\ 'col': 1,
\ 'lnum': l:match[3] + 0,
\ 'col': empty(l:match[2]) ? 0 : stridx(getline(l:match[3]), l:match[2]) + 1,
\ 'text': l:match[1],
\ 'type': 'E',
\ 'nr': -1,
\})
endfor
@@ -39,7 +23,7 @@ endfunction
call ale#linter#Define('php', {
\ 'name': 'php',
\ 'executable': 'php',
\ 'output_stream': 'both',
\ 'command': 'php -l --',
\ 'output_stream': 'stdout',
\ 'command': 'php -l -d error_reporting=E_ALL -d display_errors=1 --',
\ 'callback': 'ale_linters#php#php#Handle',
\})

View File

@@ -1,49 +1,33 @@
" Author: jwilliams108 <https://github.com/jwilliams108>
" Description: phpcs for PHP files
if exists('g:loaded_ale_linters_php_phpcs')
finish
endif
let g:ale_php_phpcs_standard = get(g:, 'ale_php_phpcs_standard', '')
let g:loaded_ale_linters_php_phpcs = 1
function! ale_linters#php#phpcs#GetCommand(buffer) abort
let l:standard = ale#Var(a:buffer, 'php_phpcs_standard')
let l:standard_option = !empty(l:standard)
\ ? '--standard=' . l:standard
\ : ''
function! ale_linters#php#phpcs#GetCommand(buffer)
let l:command = 'phpcs -s --report=emacs --stdin-path=%s'
" This option can be set to change the standard used by phpcs
if exists('g:ale_php_phpcs_standard')
let l:command .= ' --standard=' . g:ale_php_phpcs_standard
endif
return l:command
return 'phpcs -s --report=emacs --stdin-path=%s ' . l:standard_option
endfunction
function! ale_linters#php#phpcs#Handle(buffer, lines)
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:line in a:lines
let l:match = matchlist(l:line, l:pattern)
if len(l:match) == 0
continue
endif
for l:match in ale#util#GetMatches(a:lines, l:pattern)
let l:text = l:match[4]
let l:type = l:match[3]
" vcol is Needed to indicate that the column is a character.
call add(l:output, {
\ 'bufnr': a:buffer,
\ 'lnum': l:match[1] + 0,
\ 'vcol': 0,
\ 'col': l:match[2] + 0,
\ 'text': l:text,
\ 'type': l:type ==# 'error' ? 'E' : 'W',
\ 'nr': -1,
\})
endfor

36
ale_linters/php/phpmd.vim Normal file
View File

@@ -0,0 +1,36 @@
" 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',
\})

View File

@@ -0,0 +1,9 @@
" 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',
\})

View File

@@ -1,16 +1,10 @@
" Author: w0rp - <devw0rp@gmail.com>
" Description: pug-lint for checking Pug/Jade files.
if exists('g:loaded_ale_linters_pug_puglint')
finish
endif
let g:loaded_ale_linters_pug_puglint = 1
call ale#linter#Define('pug', {
\ 'name': 'puglint',
\ 'executable': 'pug-lint',
\ 'output_stream': 'stderr',
\ 'command': g:ale#util#stdin_wrapper . ' .pug pug-lint -r inline',
\ 'callback': 'ale#handlers#HandleUnixFormatAsError',
\ 'command': 'pug-lint -r inline %t',
\ 'callback': 'ale#handlers#unix#HandleAsError',
\})

View File

@@ -0,0 +1,27 @@
" 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',
\})

View File

@@ -0,0 +1,26 @@
" 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',
\})

View File

@@ -5,8 +5,6 @@ call ale#linter#Define('pyrex', {
\ 'name': 'cython',
\ 'output_stream': 'stderr',
\ 'executable': 'cython',
\ 'command': g:ale#util#stdin_wrapper
\ . ' .pyx cython --warning-extra -o '
\ . g:ale#util#nul_file,
\ 'callback': 'ale#handlers#HandleUnixFormatAsError',
\ 'command': 'cython --warning-extra -o ' . g:ale#util#nul_file . ' %t',
\ 'callback': 'ale#handlers#unix#HandleAsError',
\})

View File

@@ -1,55 +1,105 @@
" Author: w0rp <devw0rp@gmail.com>
" Description: flake8 for python files
if exists('g:loaded_ale_linters_python_flake8')
finish
endif
let g:ale_python_flake8_executable =
\ get(g:, 'ale_python_flake8_executable', 'flake8')
let g:loaded_ale_linters_python_flake8 = 1
" Support an old setting as a fallback.
let s:default_options = get(g:, 'ale_python_flake8_args', '')
let g:ale_python_flake8_options =
\ get(g:, 'ale_python_flake8_options', s:default_options)
let g:ale_python_flake8_use_global = get(g:, 'ale_python_flake8_use_global', 0)
function! ale_linters#python#flake8#Handle(buffer, lines)
" Matches patterns line the following:
"
" stdin:6:6: E111 indentation is not a multiple of four
let l:pattern = '^stdin:\(\d\+\):\(\d\+\): \([^ ]\+\) \(.\+\)$'
let l:output = []
" A map from Python executable paths to semver strings parsed for those
" executables, so we don't have to look up the version number constantly.
let s:version_cache = {}
for l:line in a:lines
let l:match = matchlist(l:line, l:pattern)
function! s:UsingModule(buffer) abort
return ale#Var(a:buffer, 'python_flake8_options') =~# ' *-m flake8'
endfunction
if len(l:match) == 0
continue
function! ale_linters#python#flake8#GetExecutable(buffer) abort
if !s:UsingModule(a:buffer) && !ale#Var(a:buffer, 'python_flake8_use_global')
let l:virtualenv = ale#python#FindVirtualenv(a:buffer)
if !empty(l:virtualenv)
let l:ve_flake8 = l:virtualenv . '/bin/flake8'
if executable(l:ve_flake8)
return l:ve_flake8
endif
endif
endif
let l:line = l:match[1] + 0
let l:column = l:match[2] + 0
let l:code = l:match[3]
let l:text = l:code . ': ' . l:match[4]
let l:type = l:code[0] ==# 'E' ? 'E' : 'W'
return ale#Var(a:buffer, 'python_flake8_executable')
endfunction
if (l:code ==# 'W291' || l:code ==# 'W293') && !g:ale_warn_about_trailing_whitespace
" Skip warnings for trailing whitespace if the option is off.
continue
endif
function! ale_linters#python#flake8#ClearVersionCache() abort
let s:version_cache = {}
endfunction
" vcol is Needed to indicate that the column is a character.
call add(l:output, {
\ 'bufnr': a:buffer,
\ 'lnum': l:line,
\ 'vcol': 0,
\ 'col': l:column,
\ 'text': l:text,
\ 'type': l:type,
\ 'nr': -1,
\})
endfor
function! ale_linters#python#flake8#VersionCheck(buffer) abort
let l:executable = ale_linters#python#flake8#GetExecutable(a:buffer)
return l:output
" If we have previously stored the version number in a cache, then
" don't look it up again.
if has_key(s:version_cache, l:executable)
" Returning an empty string skips this command.
return ''
endif
let l:executable = shellescape(ale_linters#python#flake8#GetExecutable(a:buffer))
let l:module_string = s:UsingModule(a:buffer) ? ' -m flake8' : ''
return l:executable . l:module_string . ' --version'
endfunction
" Get the flake8 version from the output, or the cache.
function! s:GetVersion(buffer, version_output) abort
let l:executable = ale_linters#python#flake8#GetExecutable(a:buffer)
let l:version = []
" Get the version from the cache.
if has_key(s:version_cache, l:executable)
return s:version_cache[l:executable]
endif
if !empty(a:version_output)
" Parse the version string, and store it in the cache.
let l:version = ale#semver#Parse(a:version_output[0])
let s:version_cache[l:executable] = l:version
endif
return l:version
endfunction
" flake8 versions 3 and up support the --stdin-display-name argument.
function! s:SupportsDisplayName(version) abort
return !empty(a:version) && ale#semver#GreaterOrEqual(a:version, [3, 0, 0])
endfunction
function! ale_linters#python#flake8#GetCommand(buffer, version_output) abort
let l:version = s:GetVersion(a:buffer, a:version_output)
" Only include the --stdin-display-name argument if we can parse the
" flake8 version, and it is recent enough to support it.
let l:display_name_args = s:SupportsDisplayName(l:version)
\ ? ' --stdin-display-name %s'
\ : ''
let l:options = ale#Var(a:buffer, 'python_flake8_options')
return shellescape(ale_linters#python#flake8#GetExecutable(a:buffer))
\ . (!empty(l:options) ? ' ' . l:options : '')
\ . l:display_name_args . ' -'
endfunction
call ale#linter#Define('python', {
\ 'name': 'flake8',
\ 'executable': 'flake8',
\ 'command': 'flake8 -',
\ 'callback': 'ale_linters#python#flake8#Handle',
\ 'executable_callback': 'ale_linters#python#flake8#GetExecutable',
\ 'command_chain': [
\ {'callback': 'ale_linters#python#flake8#VersionCheck'},
\ {'callback': 'ale_linters#python#flake8#GetCommand'},
\ ],
\ 'callback': 'ale#handlers#python#HandlePEP8Format',
\})

View File

@@ -0,0 +1,73 @@
" Author: Keith Smiley <k@keith.so>, w0rp <devw0rp@gmail.com>
" Description: mypy support for optional python typechecking
let g:ale_python_mypy_executable =
\ get(g:, 'ale_python_mypy_executable', 'mypy')
let g:ale_python_mypy_options = get(g:, 'ale_python_mypy_options', '')
let g:ale_python_mypy_use_global = get(g:, 'ale_python_mypy_use_global', 0)
function! ale_linters#python#mypy#GetExecutable(buffer) abort
if !ale#Var(a:buffer, 'python_mypy_use_global')
let l:virtualenv = ale#python#FindVirtualenv(a:buffer)
if !empty(l:virtualenv)
let l:ve_mypy = l:virtualenv . '/bin/mypy'
if executable(l:ve_mypy)
return l:ve_mypy
endif
endif
endif
return ale#Var(a:buffer, 'python_mypy_executable')
endfunction
function! ale_linters#python#mypy#GetCommand(buffer) abort
let l:project_root = ale#python#FindProjectRoot(a:buffer)
let l:cd_command = !empty(l:project_root)
\ ? ale#path#CdString(l:project_root)
\ : ''
let l:executable = ale_linters#python#mypy#GetExecutable(a:buffer)
return l:cd_command
\ . shellescape(l:executable)
\ . ' --show-column-numbers '
\ . ale#Var(a:buffer, 'python_mypy_options')
\ . ' %s'
endfunction
function! ale_linters#python#mypy#Handle(buffer, lines) abort
" Look for lines like the following:
"
" file.py:4: error: No library stub file for module 'django.db'
"
" Lines like these should be ignored below:
"
" file.py:4: note: (Stub files are from https://github.com/python/typeshed)
let l:pattern = '\v^([a-zA-Z]?:?[^:]+):(\d+):?(\d+)?: (error|warning): (.+)$'
let l:output = []
let l:buffer_filename = expand('#' . a:buffer . ':p')
for l:match in ale#util#GetMatches(a:lines, l:pattern)
if l:buffer_filename[-len(l:match[1]):] !=# l:match[1]
continue
endif
call add(l:output, {
\ 'lnum': l:match[2] + 0,
\ 'col': l:match[3] + 0,
\ 'type': l:match[4] =~# 'error' ? 'E' : 'W',
\ 'text': l:match[5],
\})
endfor
return l:output
endfunction
call ale#linter#Define('python', {
\ 'name': 'mypy',
\ 'executable_callback': 'ale_linters#python#mypy#GetExecutable',
\ 'command_callback': 'ale_linters#python#mypy#GetCommand',
\ 'callback': 'ale_linters#python#mypy#Handle',
\ 'lint_file': 1,
\})

View File

@@ -0,0 +1,74 @@
" Author: keith <k@keith.so>
" Description: pylint for python files
let g:ale_python_pylint_executable =
\ get(g:, 'ale_python_pylint_executable', 'pylint')
let g:ale_python_pylint_options =
\ get(g:, 'ale_python_pylint_options', '')
let g:ale_python_pylint_use_global = get(g:, 'ale_python_pylint_use_global', 0)
function! ale_linters#python#pylint#GetExecutable(buffer) abort
if !ale#Var(a:buffer, 'python_pylint_use_global')
let l:virtualenv = ale#python#FindVirtualenv(a:buffer)
if !empty(l:virtualenv)
let l:ve_pylint = l:virtualenv . '/bin/pylint'
if executable(l:ve_pylint)
return l:ve_pylint
endif
endif
endif
return ale#Var(a:buffer, 'python_pylint_executable')
endfunction
function! ale_linters#python#pylint#GetCommand(buffer) abort
return shellescape(ale_linters#python#pylint#GetExecutable(a:buffer))
\ . ' ' . ale#Var(a:buffer, 'python_pylint_options')
\ . ' --output-format text --msg-template="{path}:{line}:{column}: {msg_id} ({symbol}) {msg}" --reports n'
\ . ' %s'
endfunction
function! ale_linters#python#pylint#Handle(buffer, lines) abort
" Matches patterns like the following:
"
" test.py:4:4: W0101 (unreachable) Unreachable code
let l:pattern = '\v^[^:]+:(\d+):(\d+): ([[:alnum:]]+) \((.*)\) (.*)$'
let l:output = []
for l:match in ale#util#GetMatches(a:lines, l:pattern)
"let l:failed = append(0, l:match)
let l:code = l:match[3]
if (l:code ==# 'C0303')
\ && !ale#Var(a:buffer, 'warn_about_trailing_whitespace')
" Skip warnings for trailing whitespace if the option is off.
continue
endif
if l:code ==# 'I0011'
" Skip 'Locally disabling' message
continue
endif
call add(l:output, {
\ 'lnum': l:match[1] + 0,
\ 'col': l:match[2] + 1,
\ 'text': l:code . ': ' . l:match[5],
\ 'type': l:code[:0] ==# 'E' ? 'E' : 'W',
\})
endfor
return l:output
endfunction
call ale#linter#Define('python', {
\ 'name': 'pylint',
\ 'executable_callback': 'ale_linters#python#pylint#GetExecutable',
\ 'command_callback': 'ale_linters#python#pylint#GetCommand',
\ 'callback': 'ale_linters#python#pylint#Handle',
\ 'lint_file': 1,
\})

View File

@@ -0,0 +1,17 @@
" Author: Andrey Popp -- @andreypopp
" Description: Report errors in ReasonML code with Merlin
if !exists('g:merlin')
finish
endif
function! ale_linters#reason#merlin#Handle(buffer, lines) abort
return merlin#ErrorLocList()
endfunction
call ale#linter#Define('reason', {
\ 'name': 'merlin',
\ 'executable': 'ocamlmerlin',
\ 'command': 'true',
\ 'callback': 'ale_linters#reason#merlin#Handle',
\})

View File

@@ -0,0 +1,9 @@
" Author: Daniel M. Capella https://github.com/polyzen
" Description: proselint for reStructuredText files
call ale#linter#Define('rst', {
\ 'name': 'proselint',
\ 'executable': 'proselint',
\ 'command': 'proselint %t',
\ 'callback': 'ale#handlers#unix#HandleAsWarning',
\})

View File

@@ -0,0 +1,72 @@
" Author: Eddie Lebow https://github.com/elebow
" Description: Brakeman, a static analyzer for Rails security
let g:ale_ruby_brakeman_options =
\ get(g:, 'ale_ruby_brakeman_options', '')
function! ale_linters#ruby#brakeman#Handle(buffer, lines) abort
let l:result = json_decode(join(a:lines, ''))
let l:output = []
for l:warning in l:result.warnings
" Brakeman always outputs paths relative to the Rails app root
let l:rails_root = s:FindRailsRoot(a:buffer)
let l:warning_file = l:rails_root . '/' . l:warning.file
if !ale#path#IsBufferPath(a:buffer, l:warning_file)
continue
endif
let l:text = l:warning.warning_type . ' ' . l:warning.message . ' (' . l:warning.confidence . ')'
let l:line = l:warning.line != v:null ? l:warning.line : 1
call add(l:output, {
\ 'lnum': l:line,
\ 'type': 'W',
\ 'text': l:text,
\})
endfor
return l:output
endfunction
function! ale_linters#ruby#brakeman#GetCommand(buffer) abort
let l:rails_root = s:FindRailsRoot(a:buffer)
if l:rails_root ==? ''
return ''
endif
return 'brakeman -f json -q '
\ . ale#Var(a:buffer, 'ruby_brakeman_options')
\ . ' -p ' . l:rails_root
endfunction
function! s:FindRailsRoot(buffer) abort
" Find the nearest dir contining "app", "db", and "config", and assume it is
" the root of a Rails app.
for l:name in ['app', 'config', 'db']
let l:dir = fnamemodify(
\ ale#path#FindNearestDirectory(a:buffer, l:name),
\ ':h:h'
\)
if l:dir !=# '.'
\&& isdirectory(l:dir . '/app')
\&& isdirectory(l:dir . '/config')
\&& isdirectory(l:dir . '/db')
return l:dir
endif
endfor
return ''
endfunction
call ale#linter#Define('ruby', {
\ 'name': 'brakeman',
\ 'executable': 'brakeman',
\ 'command_callback': 'ale_linters#ruby#brakeman#GetCommand',
\ 'callback': 'ale_linters#ruby#brakeman#Handle',
\ 'lint_file': 1,
\})

53
ale_linters/ruby/reek.vim Normal file
View File

@@ -0,0 +1,53 @@
" Author: Eddie Lebow https://github.com/elebow
" Description: Reek, a code smell detector for Ruby files
let g:ale_ruby_reek_show_context =
\ get(g:, 'ale_ruby_reek_show_context', 0)
let g:ale_ruby_reek_show_wiki_link =
\ get(g:, 'ale_ruby_reek_show_wiki_link', 0)
function! ale_linters#ruby#reek#Handle(buffer, lines) abort
if len(a:lines) == 0
return []
endif
let l:errors = json_decode(a:lines[0])
let l:output = []
for l:error in l:errors
for l:location in l:error.lines
call add(l:output, {
\ 'lnum': l:location,
\ 'type': 'W',
\ 'text': s:BuildText(a:buffer, l:error),
\})
endfor
endfor
return l:output
endfunction
function! s:BuildText(buffer, error) abort
let l:text = a:error.smell_type . ':'
if ale#Var(a:buffer, 'ruby_reek_show_context')
let l:text .= ' ' . a:error.context
endif
let l:text .= ' ' . a:error.message
if ale#Var(a:buffer, 'ruby_reek_show_wiki_link')
let l:text .= ' [' . a:error.wiki_link . ']'
endif
return l:text
endfunction
call ale#linter#Define('ruby', {
\ 'name': 'reek',
\ 'executable': 'reek',
\ 'command': 'reek -f json --no-progress --no-color',
\ 'callback': 'ale_linters#ruby#reek#Handle',
\})

View File

@@ -1,49 +1,44 @@
" Author: ynonp - https://github.com/ynonp
" Description: rubocop for Ruby files
if exists('g:loaded_ale_linters_ruby_rubocop')
finish
endif
let g:loaded_ale_linters_ruby_rubocop = 1
function! ale_linters#ruby#rubocop#Handle(buffer, lines)
function! ale_linters#ruby#rubocop#Handle(buffer, lines) abort
" Matches patterns line the following:
"
" <path>/_:47:14: 83:29: C: Prefer single-quoted strings when you don't
" <path>:83:29: C: Prefer single-quoted strings when you don't
" need string interpolation or special symbols.
let l:pattern = '\v_:(\d+):(\d+): (.): (.+)'
let l:pattern = '\v:(\d+):(\d+): (.): (.+)'
let l:output = []
for l:line in a:lines
let l:match = matchlist(l:line, l:pattern)
if len(l:match) == 0
continue
endif
for l:match in ale#util#GetMatches(a:lines, l:pattern)
let l:text = l:match[4]
let l:type = l:match[3]
" vcol is Needed to indicate that the column is a character.
call add(l:output, {
\ 'bufnr': a:buffer,
\ 'lnum': l:match[1] + 0,
\ 'vcol': 0,
\ 'col': l:match[2] + 0,
\ 'text': l:text,
\ 'type': l:type ==# 'C' ? 'E' : 'W',
\ 'nr': -1,
\ 'type': index(['F', 'E'], l:type) != -1 ? 'E' : 'W',
\})
endfor
return l:output
endfunction
function! ale_linters#ruby#rubocop#GetCommand(buffer) abort
return 'rubocop --format emacs --force-exclusion '
\ . ale#Var(a:buffer, 'ruby_rubocop_options')
\ . ' --stdin ' . bufname(a:buffer)
endfunction
" Set this option to change Rubocop options.
if !exists('g:ale_ruby_rubocop_options')
" let g:ale_ruby_rubocop_options = '--lint'
let g:ale_ruby_rubocop_options = ''
endif
call ale#linter#Define('ruby', {
\ 'name': 'rubocop',
\ 'executable': 'rubocop',
\ 'command': 'rubocop --format emacs --stdin _',
\ 'command_callback': 'ale_linters#ruby#rubocop#GetCommand',
\ 'callback': 'ale_linters#ruby#rubocop#Handle',
\})

10
ale_linters/ruby/ruby.vim Normal file
View File

@@ -0,0 +1,10 @@
" Author: Brandon Roehl - https://github.com/BrandonRoehl
" Description: Ruby MRI for Ruby files
call ale#linter#Define('ruby', {
\ 'name': 'ruby',
\ 'executable': 'ruby',
\ 'output_stream': 'stderr',
\ 'command': 'ruby -w -c -T1 %t',
\ 'callback': 'ale#handlers#ruby#HandleSyntaxErrors',
\})

View File

@@ -0,0 +1,31 @@
" Author: Daniel Schemala <istjanichtzufassen@gmail.com>
" Description: rustc invoked by cargo for rust files
let g:ale_rust_cargo_use_check = get(g:, 'ale_rust_cargo_use_check', 0)
function! ale_linters#rust#cargo#GetCargoExecutable(bufnr) abort
if ale#path#FindNearestFile(a:bufnr, 'Cargo.toml') !=# ''
return 'cargo'
else
" if there is no Cargo.toml file, we don't use cargo even if it exists,
" so we return '', because executable('') apparently always fails
return ''
endif
endfunction
function! ale_linters#rust#cargo#GetCommand(buffer) abort
let l:command = ale#Var(a:buffer, 'rust_cargo_use_check')
\ ? 'check'
\ : 'build'
return 'cargo ' . l:command . ' --frozen --message-format=json -q'
endfunction
call ale#linter#Define('rust', {
\ 'name': 'cargo',
\ 'executable_callback': 'ale_linters#rust#cargo#GetCargoExecutable',
\ 'command_callback': 'ale_linters#rust#cargo#GetCommand',
\ 'callback': 'ale#handlers#rust#HandleRustErrors',
\ 'output_stream': 'stdout',
\ 'lint_file': 1,
\})

View File

@@ -0,0 +1,27 @@
" Author: Daniel Schemala <istjanichtzufassen@gmail.com>
" Description: rustc for rust files
function! ale_linters#rust#rustc#RustcCommand(buffer_number) abort
" Try to guess the library search path. If the project is managed by cargo,
" it's usually <project root>/target/debug/deps/ or
" <project root>/target/release/deps/
let l:cargo_file = ale#path#FindNearestFile(a:buffer_number, 'Cargo.toml')
if l:cargo_file !=# ''
let l:project_root = fnamemodify(l:cargo_file, ':h')
let l:dependencies = '-L ' . l:project_root . '/target/debug/deps -L ' .
\ l:project_root . '/target/release/deps'
else
let l:dependencies = ''
endif
return 'rustc --error-format=json -Z no-trans ' . l:dependencies . ' -'
endfunction
call ale#linter#Define('rust', {
\ 'name': 'rustc',
\ 'executable': 'rustc',
\ 'command_callback': 'ale_linters#rust#rustc#RustcCommand',
\ 'callback': 'ale#handlers#rust#HandleRustErrors',
\ 'output_stream': 'stderr',
\})

View File

@@ -1,14 +1,8 @@
" Author: KabbAmine - https://github.com/KabbAmine
if exists('g:loaded_ale_linters_sass_sasslint')
finish
endif
let g:loaded_ale_linters_sass_sasslint = 1
call ale#linter#Define('sass', {
\ 'name': 'sasslint',
\ 'executable': 'sass-lint',
\ 'command': g:ale#util#stdin_wrapper . ' .sass sass-lint -v -q -f compact',
\ 'callback': 'ale#handlers#HandleCSSLintFormat',
\ 'command': 'sass-lint -v -q -f compact %t',
\ 'callback': 'ale#handlers#css#HandleCSSLintFormat',
\})

View File

@@ -0,0 +1,31 @@
" Author: diartyz <diartyz@gmail.com>
let g:ale_sass_stylelint_executable =
\ get(g:, 'ale_sass_stylelint_executable', 'stylelint')
let g:ale_sass_stylelint_use_global =
\ get(g:, 'ale_sass_stylelint_use_global', 0)
function! ale_linters#sass#stylelint#GetExecutable(buffer) abort
if ale#Var(a:buffer, 'sass_stylelint_use_global')
return ale#Var(a:buffer, 'sass_stylelint_executable')
endif
return ale#path#ResolveLocalPath(
\ a:buffer,
\ 'node_modules/.bin/stylelint',
\ ale#Var(a:buffer, 'sass_stylelint_executable')
\)
endfunction
function! ale_linters#sass#stylelint#GetCommand(buffer) abort
return ale_linters#sass#stylelint#GetExecutable(a:buffer)
\ . ' --stdin-filename %s'
endfunction
call ale#linter#Define('sass', {
\ 'name': 'stylelint',
\ 'executable_callback': 'ale_linters#sass#stylelint#GetExecutable',
\ 'command_callback': 'ale_linters#sass#stylelint#GetCommand',
\ 'callback': 'ale#handlers#css#HandleStyleLintFormat',
\})

View File

@@ -1,14 +1,7 @@
" vim: set et:
" Author: Zoltan Kalmar - https://github.com/kalmiz
" Description: Basic scala support using scalac
if exists('g:loaded_ale_linters_scala_scalac')
finish
endif
let g:loaded_ale_linters_scala_scalac = 1
function! ale_linters#scala#scalac#Handle(buffer, lines)
function! ale_linters#scala#scalac#Handle(buffer, lines) abort
" Matches patterns line the following:
"
" /var/folders/5q/20rgxx3x1s34g3m14n5bq0x80000gn/T/vv6pSsy/0:26: error: expected class or object definition
@@ -27,22 +20,16 @@ function! ale_linters#scala#scalac#Handle(buffer, lines)
let l:text = l:match[3]
let l:type = l:match[2] ==# 'error' ? 'E' : 'W'
let l:col = 0
if l:ln + 1 < len(a:lines)
let l:col = stridx(a:lines[l:ln + 1], '^')
if l:col == -1
let l:col = 0
endif
endif
" vcol is Needed to indicate that the column is a character.
call add(l:output, {
\ 'bufnr': a:buffer,
\ 'lnum': l:match[1] + 0,
\ 'vcol': 0,
\ 'col': l:col + 1,
\ 'text': l:text,
\ 'type': l:type,
\ 'nr': -1,
\})
endfor
@@ -53,6 +40,6 @@ call ale#linter#Define('scala', {
\ 'name': 'scalac',
\ 'executable': 'scalac',
\ 'output_stream': 'stderr',
\ 'command': g:ale#util#stdin_wrapper . ' .scala scalac -Ystop-after:parser',
\ 'command': 'scalac -Ystop-after:parser %t',
\ 'callback': 'ale_linters#scala#scalac#Handle',
\})

View File

@@ -1,14 +1,8 @@
" Author: KabbAmine - https://github.com/KabbAmine
if exists('g:loaded_ale_linters_scss_sasslint')
finish
endif
let g:loaded_ale_linters_scss_sasslint = 1
call ale#linter#Define('scss', {
\ 'name': 'sasslint',
\ 'executable': 'sass-lint',
\ 'command': g:ale#util#stdin_wrapper . ' .scss sass-lint -v -q -f compact',
\ 'callback': 'ale#handlers#HandleCSSLintFormat',
\ 'command': 'sass-lint -v -q -f compact %t',
\ 'callback': 'ale#handlers#css#HandleCSSLintFormat',
\})

View File

@@ -1,40 +1,25 @@
" Author: w0rp <devw0rp@gmail.com>
" Description: This file add scsslint support for SCSS support
if exists('g:loaded_ale_linters_scss_scsslint')
finish
endif
let g:loaded_ale_linters_scss_scsslint = 1
function! ale_linters#scss#scsslint#Handle(buffer, lines)
function! ale_linters#scss#scsslint#Handle(buffer, lines) abort
" Matches patterns like the following:
"
" test.scss:2:1 [W] Indentation: Line should be indented 2 spaces, but was indented 4 spaces
let l:pattern = '^.*:\(\d\+\):\(\d*\) \[\([^\]]\+\)\] \(.\+\)$'
let l:output = []
for l:line in a:lines
let l:match = matchlist(l:line, l:pattern)
if len(l:match) == 0
for l:match in ale#util#GetMatches(a:lines, l:pattern)
if !ale#Var(a:buffer, 'warn_about_trailing_whitespace')
\&& l:match[4] =~# '^TrailingWhitespace'
" Skip trailing whitespace warnings if that option is off.
continue
endif
if !g:ale_warn_about_trailing_whitespace && l:match[4] =~# '^TrailingWhitespace'
" Skip trailing whitespace warnings if that option is on.
continue
endif
" vcol is needed to indicate that the column is a character
call add(l:output, {
\ 'bufnr': a:buffer,
\ 'lnum': l:match[1] + 0,
\ 'vcol': 0,
\ 'col': l:match[2] + 0,
\ 'text': l:match[4],
\ 'type': l:match[3] ==# 'E' ? 'E' : 'W',
\ 'nr': -1,
\})
endfor

View File

@@ -0,0 +1,31 @@
" Author: diartyz <diartyz@gmail.com>
let g:ale_scss_stylelint_executable =
\ get(g:, 'ale_scss_stylelint_executable', 'stylelint')
let g:ale_scss_stylelint_use_global =
\ get(g:, 'ale_scss_stylelint_use_global', 0)
function! ale_linters#scss#stylelint#GetExecutable(buffer) abort
if ale#Var(a:buffer, 'scss_stylelint_use_global')
return ale#Var(a:buffer, 'scss_stylelint_executable')
endif
return ale#path#ResolveLocalPath(
\ a:buffer,
\ 'node_modules/.bin/stylelint',
\ ale#Var(a:buffer, 'scss_stylelint_executable')
\)
endfunction
function! ale_linters#scss#stylelint#GetCommand(buffer) abort
return ale_linters#scss#stylelint#GetExecutable(a:buffer)
\ . ' --stdin-filename %s'
endfunction
call ale#linter#Define('scss', {
\ 'name': 'stylelint',
\ 'executable_callback': 'ale_linters#scss#stylelint#GetExecutable',
\ 'command_callback': 'ale_linters#scss#stylelint#GetCommand',
\ 'callback': 'ale#handlers#css#HandleStyleLintFormat',
\})

View File

@@ -1,23 +1,22 @@
" Author: w0rp <devw0rp@gmail.com>
" Description: Lints sh files using bash -n
if exists('g:loaded_ale_linters_sh_shell')
finish
" Backwards compatibility
if exists('g:ale_linters_sh_shell_default_shell')
let g:ale_sh_shell_default_shell = g:ale_linters_sh_shell_default_shell
endif
let g:loaded_ale_linters_sh_shell = 1
" This option can be changed to change the default shell when the shell
" cannot be taken from the hashbang line.
if !exists('g:ale_linters_sh_shell_default_shell')
let g:ale_linters_sh_shell_default_shell = fnamemodify($SHELL, ':t')
if !exists('g:ale_sh_shell_default_shell')
let g:ale_sh_shell_default_shell = fnamemodify($SHELL, ':t')
if g:ale_linters_sh_shell_default_shell ==# ''
let g:ale_linters_sh_shell_default_shell = 'bash'
if g:ale_sh_shell_default_shell ==# '' || g:ale_sh_shell_default_shell ==# 'fish'
let g:ale_sh_shell_default_shell = 'bash'
endif
endif
function! ale_linters#sh#shell#GetExecutable(buffer)
function! ale_linters#sh#shell#GetExecutable(buffer) abort
let l:banglines = getbufline(a:buffer, 1)
" Take the shell executable from the hashbang, if we can.
@@ -32,42 +31,25 @@ function! ale_linters#sh#shell#GetExecutable(buffer)
endfor
endif
return g:ale_linters_sh_shell_default_shell
return ale#Var(a:buffer, 'sh_shell_default_shell')
endfunction
function! ale_linters#sh#shell#GetCommand(buffer)
return ale_linters#sh#shell#GetExecutable(a:buffer) . ' -n'
function! ale_linters#sh#shell#GetCommand(buffer) abort
return ale_linters#sh#shell#GetExecutable(a:buffer) . ' -n %t'
endfunction
function! ale_linters#sh#shell#Handle(buffer, lines)
function! ale_linters#sh#shell#Handle(buffer, lines) abort
" Matches patterns line the following:
"
" bash: line 13: syntax error near unexpected token `d'
" sh: 11: Syntax error: "(" unexpected
let l:pattern = '^[^:]\+: \%(\w\+ \|\)\(\d\+\): \(.\+\)'
let l:pattern = '\v(line |: ?)(\d+): (.+)$'
let l:output = []
for l:line in a:lines
let l:match = matchlist(l:line, l:pattern)
if len(l:match) == 0
continue
endif
let l:line = l:match[1] + 0
let l:column = 1
let l:text = l:match[2]
let l:type = 'E'
" vcol is Needed to indicate that the column is a character.
for l:match in ale#util#GetMatches(a:lines, l:pattern)
call add(l:output, {
\ 'bufnr': a:buffer,
\ 'lnum': l:line,
\ 'vcol': 0,
\ 'col': l:column,
\ 'text': l:text,
\ 'type': l:type,
\ 'nr': -1,
\ 'lnum': str2nr(l:match[2]),
\ 'text': l:match[3],
\})
endfor

View File

@@ -2,29 +2,47 @@
" Description: This file adds support for using the shellcheck linter with
" shell scripts.
if exists('g:loaded_ale_linters_sh_shellcheck')
finish
endif
let g:loaded_ale_linters_sh_shellcheck = 1
" This global variable can be set with a string of comma-seperated error
" codes to exclude from shellcheck. For example:
"
" let g:ale_linters_sh_shellcheck_exclusions = 'SC2002,SC2004'
if !exists('g:ale_linters_sh_shellcheck_exclusions')
let g:ale_linters_sh_shellcheck_exclusions = ''
endif
" let g:ale_sh_shellcheck_exclusions = 'SC2002,SC2004'
let g:ale_sh_shellcheck_exclusions =
\ get(g:, 'ale_sh_shellcheck_exclusions', get(g:, 'ale_linters_sh_shellcheck_exclusions', ''))
if g:ale_linters_sh_shellcheck_exclusions !=# ''
let s:exclude_option = '-e ' . g:ale_linters_sh_shellcheck_exclusions
else
let s:exclude_option = ''
endif
let g:ale_sh_shellcheck_executable =
\ get(g:, 'ale_sh_shellcheck_executable', 'shellcheck')
let g:ale_sh_shellcheck_options =
\ get(g:, 'ale_sh_shellcheck_options', '')
function! ale_linters#sh#shellcheck#GetExecutable(buffer) abort
return ale#Var(a:buffer, 'sh_shellcheck_executable')
endfunction
function! s:GetDialectArgument() abort
if exists('b:is_bash') && b:is_bash
return '-s bash'
elseif exists('b:is_sh') && b:is_sh
return '-s sh'
elseif exists('b:is_kornshell') && b:is_kornshell
return '-s ksh'
endif
return ''
endfunction
function! ale_linters#sh#shellcheck#GetCommand(buffer) abort
let l:exclude_option = ale#Var(a:buffer, 'sh_shellcheck_exclusions')
return ale_linters#sh#shellcheck#GetExecutable(a:buffer)
\ . ' ' . ale#Var(a:buffer, 'sh_shellcheck_options')
\ . ' ' . (!empty(l:exclude_option) ? '-e ' . l:exclude_option : '')
\ . ' ' . s:GetDialectArgument() . ' -f gcc -'
endfunction
call ale#linter#Define('sh', {
\ 'name': 'shellcheck',
\ 'executable': 'shellcheck',
\ 'command': 'shellcheck ' . s:exclude_option . ' -f gcc -',
\ 'callback': 'ale#handlers#HandleGCCFormat',
\ 'executable_callback': 'ale_linters#sh#shellcheck#GetExecutable',
\ 'command_callback': 'ale_linters#sh#shellcheck#GetCommand',
\ 'callback': 'ale#handlers#gcc#HandleGCCFormat',
\})

Some files were not shown because too many files have changed in this diff Show More