Compare commits

..

365 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
Ahmed El Gabri
119695bd08 Add standard linter 2017-02-05 21:19:34 +01: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
medains
ff096124c6 Linter addition of PHP Mess Detector 2017-02-01 16:28:51 +00:00
307 changed files with 11478 additions and 2909 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

@@ -3,15 +3,26 @@
1. [Guidelines](#guidelines)
2. [Creating Issues](#issues)
3. [Creating Pull Requests](#pull-requests)
1. [Adding a New Linter](#adding-a-new-linter)
2. [Adding New Options](#adding-new-options)
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
@@ -20,7 +31,7 @@ will check your code while you type.
<a name="issues"></a>
# 2. Creating Issues
## 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
@@ -41,7 +52,7 @@ can understand you.
<a name="pull-requests"></a>
# 3. 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
@@ -60,7 +71,7 @@ If you want to credit multiple authors, you can comma separate them.
<a name="adding-a-new-linter"></a>
# 3.i. Adding a New Linter
### 3.i. Adding a New Linter
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
@@ -76,7 +87,7 @@ alphabetically in the table and list.
<a name="adding-new-options"></a>
# 3.ii. Adding New Options
### 3.ii. Adding New Options
If you add new options to the plugin, make sure to document those new options
in the [README.md](README.md) file, and also in the [help file](doc/ale.txt).
@@ -90,3 +101,73 @@ global variable names.
Any options for linters should be set to some default value so it is always
easy to see what the default is with `:echo g:ale...`.
<a name="writing-documentation"></a>
## 4. Writing Documentation
If you are adding new linters, changing the API, adding new options, etc., you
_must_ write some documentation describing it in the `doc/ale.txt` file. New
linters _must_ be added to the `README.md` file too, so other users can get a
quick overview of the supported tools.
<a name="documenting-new-linters"></a>
### 4.i Documenting New Linters
If you add a new linter to the project, edit the table in the `README.md` file,
and edit the list of linters at the top of the `doc/ale.txt` file. The linters
should be sorted vertically in lexicographic (alphabetical) order by the
programming language name or filetype, and the tools for each language should
be sorted in lexicographic order horizontally. Sorting in this manner is a fair
manner of presenting all of the information in an easy to scan way, without
giving some unfair preference to any particular tool or language.
<a name="editing-online-documentation"></a>
### 4.ii Editing the Online Documentation
The "online documentation" file used for this project lives in `doc/ale.txt`.
This is the file used for generating `:help` text inside Vim itself. There are
some guidlines to follow for this file.
1. Keep all text within a column size of 79 characters, inclusive.
2. Open a section with 79 `=` or `-` characters, for headings and subheadings.
3. Sections should have a _single_ blank line before or after.
4. Between descriptions of variables/functions/commands, use _two_ blank lines.
5. Up-indent the description of a variable/function/command by two spaces.
6. Place tags at the ends of lines, with the final characters on column 79.
All of the tags should line up perfectly on the same column as you scan
down through the document.
7. Keep the table of contents balanced so the longest tag link ends on column
79, and so all links line up perfectly on their first character, on the
left.
<a name="documenting-linter-options"></a>
### 4.iii Documenting Linter Options
For documenting new linter options, please add a new sub-section under the
"Linter Specific Options" section describing all of the global options added
for each linter, and what the default values of the options are. All global
options for linters should be set to some default value. This will allow users
to look up the default value easily by typing `:echo g:ale_...`.
<a name="in-case-of-busses"></a>
## 5. In Case of Busses
Should the principal author of the ALE project and all collaborators with the
required access needed to properly administrate the project on GitHub or any
other website either perish or disappear, whether by tragic traffic accident
or government adduction, etc., action should be taken to ensure that the
project continues. If no one is left to administer the project where it is
hosted, please fork the project and nominate someone capable to administer it.
Preferably, in such an event, a single fork of the project will replace the
original, and life will go on, except the life of whoever vanished, because
then they will probably be dead.
Should w0rp suddenly disappear, then he was probably killed in a traffic
accident, or the government finally decided to kill him and make it look like
suicide. In the latter event, please subvert said government and restore
order to the universe, and ensure peace for mankind.

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,11 +1,20 @@
SHELL := /usr/bin/env bash
IMAGE ?= w0rp/ale
CURRENT_IMAGE_ID = 107e4efc4267
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
@:; \
@@ -18,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 '========================================'; \
@@ -36,7 +45,7 @@ test: test-setup
echo 'Custom warnings/errors follow:'; \
echo; \
set -o pipefail; \
docker run -a stdout $(DOCKER_FLAGS) /testplugin/custom-checks /testplugin | sed s:^/testplugin/:: || EXIT=$$?; \
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!
-->

195
README.md
View File

@@ -20,19 +20,22 @@ In other words, this plugin allows you to lint while you type.
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. [FAQ](#faq)
1. [How do I disable particular linters?](#faq-disable-linters)
2. [How can I keep the sign gutter open?](#faq-disable-linters)
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)
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>
@@ -49,57 +52,72 @@ 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 | [cppcheck](http://cppcheck.sourceforge.net), [gcc](https://gcc.gnu.org/), [clang](http://clang.llvm.org/)|
| C++ (filetype cpp) | [cppcheck] (http://cppcheck.sourceforge.net), [gcc](https://gcc.gnu.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) |
| 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) |
| Dockerfile | [hadolint](https://github.com/lukasmartinelli/hadolint) |
| Elixir | [credo](https://github.com/rrrene/credo) |
| 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), [go build](https://golang.org/cmd/go/) |
| 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/), [flow](https://flowtype.org/) |
| 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/) |
| LaTeX | [chktex](http://www.nongnu.org/chktex/), [lacheck](https://www.ctan.org/pkg/lacheck) |
| 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/)|
| 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 | [hack](http://hacklang.org/), [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) |
| 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/) |
| Ruby | [rubocop](https://github.com/bbatsov/rubocop) |
| 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) |
| 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/) |
| Tex | [proselint](http://proselint.com/) |
| Text^^ | [proselint](http://proselint.com/) |
| 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/) |
* *^^ No text linters 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 it.
* *^ No linters for text or Vim help filetypes are enabled by default.*
<a name="usage"></a>
@@ -189,13 +207,30 @@ 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>
## 4. FAQ
## 5. FAQ
<a name="faq-disable-linters"></a>
### 4.i. How do I disable particular linters?
### 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
@@ -219,7 +254,7 @@ in each directory corresponds to the name of a particular linter.
<a name="faq-keep-signs"></a>
### 4.ii. How can I keep the sign gutter open?
### 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
@@ -230,7 +265,7 @@ let g:ale_sign_column_always = 1
<a name="faq-change-signs"></a>
### 4.iii. How can I change the signs ALE uses?
### 5.iii. How can I change the signs ALE uses?
Use these options to specify what text should be used for signs:
@@ -250,7 +285,7 @@ highlight clear ALEWarningSign
<a name="faq-statusline"></a>
### 4.iv. How can I show errors or warnings in my statusline?
### 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
@@ -277,14 +312,14 @@ let g:ale_statusline_format = ['⨉ %d', '⚠ %d', '⬥ ok']
<a name="faq-echo-format"></a>
### 4.v. How can I change the format for echo messages?
### 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.
@@ -302,7 +337,7 @@ Will give you:
<a name="faq-autocmd"></a>
### 4.vi. How can I execute some code when ALE stops linting?
### 5.vi. How can I execute some code when ALE stops linting?
ALE runs its own [autocmd](http://vimdoc.sourceforge.net/htmldoc/autocmd.html)
event whenever has a linter has been successfully executed and processed. This
@@ -317,7 +352,7 @@ augroup END
<a name="faq-navigation"></a>
### 4.vii. How can I navigate between errors quickly?
### 5.vii. How can I navigate between errors quickly?
ALE offers some commands with `<Plug>` keybinds for moving between warnings and
errors quickly. You can map the keys Ctrl+j and Ctrl+k to moving between errors
@@ -333,25 +368,27 @@ For more information, consult the online documentation with
<a name="faq-lint-on-save"></a>
### 4.viii. How can I run linters only when I save files?
### 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. If you wish to run linters when files are saved, not
as you are editing files, then you can turn the option for linting
when text is changed off too.
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_save = 1
let g:ale_lint_on_text_changed = 0
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>
### 4.ix. How can I use the quickfix list instead of the loclist?
### 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
@@ -375,3 +412,61 @@ let g:ale_open_list = 1
" 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

@@ -4,6 +4,6 @@
call ale#linter#Define('ansible', {
\ 'name': 'ansible',
\ 'executable': 'ansible',
\ 'command': g:ale#util#stdin_wrapper . ' .yml ansible-lint -p',
\ 'callback': 'ale#handlers#HandlePEP8Format',
\ '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',
\})

View File

@@ -9,12 +9,18 @@ if !exists('g:ale_c_clang_options')
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': 'clang -S -x c -fsyntax-only '
\ . g:ale_c_clang_options
\ . ' -',
\ 'callback': 'ale#handlers#HandleGCCFormat',
\ 'command_callback': 'ale_linters#c#clang#GetCommand',
\ 'callback': 'ale#handlers#gcc#HandleGCCFormat',
\})

View File

@@ -2,15 +2,33 @@
" Description: cppcheck linter for c files
" Set this option to change the cppcheck options
if !exists('g:ale_c_cppcheck_options')
let g:ale_c_cppcheck_options = '--enable=style'
endif
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': g:ale#util#stdin_wrapper . ' .c cppcheck -q --language=c '
\ . g:ale_c_cppcheck_options,
\ 'callback': 'ale#handlers#HandleCppCheckFormat',
\ 'command_callback': 'ale_linters#c#cppcheck#GetCommand',
\ 'callback': 'ale#handlers#cppcheck#HandleCppCheckFormat',
\})

View File

@@ -10,9 +10,11 @@ if !exists('g:ale_c_gcc_options')
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 '
\ . g:ale_c_gcc_options . ' -'
\ . '-iquote ' . shellescape(fnamemodify(bufname(a:buffer), ':p:h'))
\ . ' ' . ale#Var(a:buffer, 'c_gcc_options') . ' -'
endfunction
call ale#linter#Define('c', {
@@ -20,5 +22,5 @@ call ale#linter#Define('c', {
\ 'output_stream': 'stderr',
\ 'executable': 'gcc',
\ 'command_callback': 'ale_linters#c#gcc#GetCommand',
\ 'callback': 'ale#handlers#HandleGCCFormat',
\ 'callback': 'ale#handlers#gcc#HandleGCCFormat',
\})

View File

@@ -1,6 +1,11 @@
" 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:
"
@@ -8,34 +13,30 @@ function! ale_linters#chef#foodcritic#Handle(buffer, lines) abort
let l:pattern = '^\(.\+:\s.\+\):\s\(.\+\):\(\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[1]
" vcol is Needed to indicate that the column is a character.
call add(l:output, {
\ 'bufnr': a:buffer,
\ 'lnum': l:match[3] + 0,
\ 'vcol': 0,
\ 'col': 0,
\ 'text': l:text,
\ 'type': 'W',
\ 'nr': -1,
\})
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': g:ale#util#stdin_wrapper . ' .rb 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,10 +1,23 @@
" Author: KabbAmine - https://github.com/KabbAmine
" Description: Coffee for checking coffee files
function! ale_linters#coffee#coffee#GetExecutable(buffer) abort
return ale#path#ResolveLocalPath(
\ a:buffer,
\ 'node_modules/.bin/coffee',
\ 'coffee'
\)
endfunction
function! ale_linters#coffee#coffee#GetCommand(buffer) abort
return ale_linters#coffee#coffee#GetExecutable(a:buffer)
\ . ' -cp -s'
endfunction
call ale#linter#Define('coffee', {
\ 'name': 'coffee',
\ 'executable': '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,6 +1,19 @@
" Author: Prashanth Chandra https://github.com/prashcr
" Description: coffeelint linter for coffeescript files
function! ale_linters#coffee#coffeelint#GetExecutable(buffer) abort
return ale#path#ResolveLocalPath(
\ a:buffer,
\ 'node_modules/.bin/coffeelint',
\ 'coffeelint'
\)
endfunction
function! ale_linters#coffee#coffeelint#GetCommand(buffer) abort
return ale_linters#coffee#coffeelint#GetExecutable(a:buffer)
\ . ' --stdin --reporter csv'
endfunction
function! ale_linters#coffee#coffeelint#Handle(buffer, lines) abort
" Matches patterns like the following:
"
@@ -8,30 +21,14 @@ function! ale_linters#coffee#coffeelint#Handle(buffer, lines) abort
" 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
@@ -40,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

@@ -2,15 +2,33 @@
" Description: cppcheck linter for cpp files
" Set this option to change the cppcheck options
if !exists('g:ale_cpp_cppcheck_options')
let g:ale_cpp_cppcheck_options = '--enable=style'
endif
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': g:ale#util#stdin_wrapper . ' .cpp cppcheck -q --language=c++ '
\ . g:ale_cpp_cppcheck_options,
\ 'callback': 'ale#handlers#HandleCppCheckFormat',
\ 'command_callback': 'ale_linters#cpp#cppcheck#GetCommand',
\ 'callback': 'ale#handlers#cppcheck#HandleCppCheckFormat',
\})

View File

@@ -3,22 +3,25 @@
" Set this option to change the GCC options for warnings for C.
if !exists('g:ale_cpp_gcc_options')
" added c++14 standard support
" POSIX thread and standard c++ thread and atomic library Linker
" let g:ale_cpp_gcc_options = '-std=c++1z' for c++17
" for previous version and default, you can just use
" let g:ale_cpp_gcc_options = '-Wall'
" for more see man pages of gcc
" $ man g++
" make sure g++ in your $PATH
" Add flags according to your requirements
let g:ale_cpp_gcc_options = '-std=c++14 -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 '
\ . g:ale_cpp_gcc_options . ' -'
\ . '-iquote ' . shellescape(fnamemodify(bufname(a:buffer), ':p:h'))
\ . ' ' . ale#Var(a:buffer, 'cpp_gcc_options') . ' -'
endfunction
call ale#linter#Define('cpp', {
@@ -26,5 +29,5 @@ call ale#linter#Define('cpp', {
\ 'output_stream': 'stderr',
\ 'executable': 'g++',
\ 'command_callback': 'ale_linters#cpp#gcc#GetCommand',
\ 'callback': 'ale#handlers#HandleGCCFormat',
\ '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',
\})

View File

@@ -1,6 +1,8 @@
if !exists('g:ale_cs_mcs_options')
let g:ale_cs_mcs_options = ''
endif
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.
@@ -9,21 +11,12 @@ function! ale_linters#cs#mcs#Handle(buffer, lines) abort
let l:pattern = '^.\+.cs(\(\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)
call add(l:output, {
\ 'bufnr': a:buffer,
\ 'lnum': l:match[1] + 0,
\ 'vcol': 0,
\ 'col': l:match[2] + 0,
\ 'text': l:match[3] . ': ' . l:match[4],
\ 'type': l:match[3] =~# '^error' ? 'E' : 'W',
\ 'nr': -1,
\})
endfor
@@ -31,10 +24,9 @@ function! ale_linters#cs#mcs#Handle(buffer, lines) abort
endfunction
call ale#linter#Define('cs',{
\ 'name': 'mcs',
\ 'output_stream': 'stderr',
\ 'executable': 'mcs',
\ 'command': g:ale#util#stdin_wrapper . ' .cs mcs -unsafe --parse' . g:ale_cs_mcs_options,
\ 'callback': 'ale_linters#cs#mcs#Handle',
\ })
\ 'name': 'mcs',
\ 'output_stream': 'stderr',
\ 'executable': 'mcs',
\ 'command_callback': 'ale_linters#cs#mcs#GetCommand',
\ 'callback': 'ale_linters#cs#mcs#Handle',
\})

View File

@@ -1,9 +1,18 @@
" Author: w0rp <devw0rp@gmail.com>
" Description: This file adds support for checking CSS code with csslint.
function! ale_linters#css#csslint#GetCommand(buffer) abort
let l:csslintrc = ale#path#FindNearestFile(a:buffer, '.csslintrc')
let l:config_option = !empty(l:csslintrc)
\ ? '--config=' . shellescape(l:csslintrc)
\ : ''
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

@@ -3,23 +3,27 @@
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 g:ale_css_stylelint_use_global
return g:ale_css_stylelint_executable
if ale#Var(a:buffer, 'css_stylelint_use_global')
return ale#Var(a:buffer, 'css_stylelint_executable')
endif
return ale#util#ResolveLocalPath(
return ale#path#ResolveLocalPath(
\ a:buffer,
\ 'node_modules/.bin/stylelint',
\ g:ale_css_stylelint_executable
\ 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
@@ -27,5 +31,5 @@ call ale#linter#Define('css', {
\ 'name': 'stylelint',
\ 'executable_callback': 'ale_linters#css#stylelint#GetExecutable',
\ 'command_callback': 'ale_linters#css#stylelint#GetCommand',
\ 'callback': 'ale#handlers#HandleStyleLintFormat',
\ 'callback': 'ale#handlers#css#HandleStyleLintFormat',
\})

View File

@@ -5,7 +5,7 @@ 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#util#FindNearestFile(a:buffer, l:possible_filename)
let l:dub_file = ale#path#FindNearestFile(a:buffer, l:possible_filename)
if !empty(l:dub_file)
return l:dub_file
@@ -31,7 +31,7 @@ function! ale_linters#d#dmd#DUBCommand(buffer) abort
" 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 ' . fnameescape(fnamemodify(l:dub_file, ':h'))
return 'cd ' . shellescape(fnamemodify(l:dub_file, ':h'))
\ . ' && dub describe --import-paths'
endfunction
@@ -42,13 +42,11 @@ function! ale_linters#d#dmd#DMDCommand(buffer, dub_output) abort
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' . fnameescape(l:line))
call add(l:import_list, '-I' . shellescape(l:line))
endif
endfor
return g:ale#util#stdin_wrapper . ' .d dmd '
\ . join(l:import_list)
\ . ' -o- -vcolumns -c'
return 'dmd '. join(l:import_list) . ' -o- -vcolumns -c %t'
endfunction
function! ale_linters#d#dmd#Handle(buffer, lines) abort
@@ -58,27 +56,12 @@ function! ale_linters#d#dmd#Handle(buffer, lines) abort
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

View File

@@ -1,45 +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 = []
" 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:line in a:lines
let l:match = matchlist(l:line, l:pattern)
for l:match in ale#util#GetMatches(a:lines, l:pattern)
let l:lnum = 0
if len(l:match) == 0
continue
endif
if l:match[1] !=# ''
let l:lnum = l:match[1] + 0
endif
let l:lnum = 0
let l:type = 'W'
let l:text = l:match[3]
if l:match[1] !=# ''
let l:lnum = l:match[1] + 0
endif
call add(l:output, {
\ 'lnum': l:lnum,
\ 'col': 0,
\ 'type': l:type,
\ 'text': l:text,
\ 'nr': l:match[2],
\})
endfor
let l:type = 'W'
let l:text = l:match[3]
" vcol is Needed to indicate that the column is a character.
call add(l:output, {
\ 'bufnr': a:buffer,
\ 'lnum': l:lnum,
\ 'vcol': 0,
\ 'col': 0,
\ 'type': l:type,
\ 'text': l:text,
\ 'nr': l:match[2],
\})
endfor
return l:output
return l:output
endfunction
call ale#linter#Define('dockerfile', {
\ 'name': 'hadolint',
\ 'executable': 'hadolint',
\ 'command': 'hadolint -',
\ 'callback': 'ale_linters#dockerfile#hadolint#Handle' })
\ 'name': 'hadolint',
\ 'executable': 'hadolint',
\ 'command': 'hadolint -',
\ 'callback': 'ale_linters#dockerfile#hadolint#Handle',
\})

View File

@@ -1,45 +1,37 @@
" Author: hauleth - https://github.com/hauleth
function! ale_linters#elixir#credo#Handle(buffer, lines) abort
" 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 = []
" 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:line in a:lines
let l:match = matchlist(l:line, l:pattern)
for l:match in ale#util#GetMatches(a:lines, l:pattern)
let l:type = l:match[3]
let l:text = l:match[4]
if len(l:match) == 0
continue
endif
if l:type ==# 'C'
let l:type = 'E'
elseif l:type ==# 'R'
let l:type = 'W'
endif
let l:type = l:match[3]
let l:text = l:match[4]
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 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',
\})

View File

@@ -22,11 +22,10 @@ function! ale_linters#elm#make#Handle(buffer, lines) abort
call add(l:output, {
\ 'bufnr': a:buffer,
\ 'lnum': l:error.region.start.line,
\ 'vcol': 0,
\ 'col': l:error.region.start.column,
\ 'type': (l:error.type ==? 'error') ? 'E' : 'W',
\ 'text': l:error.overview,
\ 'nr': -1,
\ 'detail': l:error.overview . "\n\n" . l:error.details
\})
endif
endfor
@@ -39,12 +38,12 @@ 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#util#FindNearestFile(a:buffer, 'elm-package.json')
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 ' . fnameescape(l:root_dir) . ' && '
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
@@ -52,9 +51,8 @@ function! ale_linters#elm#make#GetCommand(buffer) abort
" 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')
let l:stdin_wrapper = g:ale#util#stdin_wrapper . ' .elm'
return l:dir_set_cmd . ' ' . l:stdin_wrapper . ' ' . l:elm_cmd
return l:dir_set_cmd . ' ' . l:elm_cmd . ' %t'
endfunction
call ale#linter#Define('elm', {
@@ -64,4 +62,3 @@ call ale#linter#Define('elm', {
\ 'command_callback': 'ale_linters#elm#make#GetCommand',
\ 'callback': 'ale_linters#elm#make#Handle'
\})

View File

@@ -3,7 +3,12 @@
let g:ale_erlang_erlc_options = get(g:, 'ale_erlang_erlc_options', '')
function! ale_linters#erlang#erlc#GetCommand(buffer) abort
return g:ale#util#stdin_wrapper . ' .erl erlc ' . g:ale_erlang_erlc_options
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
@@ -43,11 +48,9 @@ function! ale_linters#erlang#erlc#Handle(buffer, lines) abort
call add(l:output, {
\ 'bufnr': a:buffer,
\ 'lnum': 0,
\ 'vcol': 0,
\ 'col': 0,
\ 'type': 'E',
\ 'text': l:match_parse_transform[0],
\ 'nr': -1,
\})
continue
@@ -73,15 +76,12 @@ function! ale_linters#erlang#erlc#Handle(buffer, lines) abort
let l:type = 'E'
endif
" vcol is Needed to indicate that the column is a character.
call add(l:output, {
\ 'bufnr': a:buffer,
\ 'lnum': l:line,
\ 'vcol': 0,
\ 'col': 0,
\ 'type': l:type,
\ 'text': l:text,
\ 'nr': -1,
\})
endfor

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,6 +1,15 @@
" Author: w0rp <devw0rp@gmail.com>
" Description: gcc for Fortran files
" This option can be set to 0 to use -ffixed-form
if !exists('g:ale_fortran_gcc_use_free_form')
let g:ale_fortran_gcc_use_free_form = 1
endif
if !exists('g:ale_fortran_gcc_executable')
let g:ale_fortran_gcc_executable = 'gcc'
endif
" Set this option to change the GCC options for warnings for Fortran.
if !exists('g:ale_fortran_gcc_options')
let g:ale_fortran_gcc_options = '-Wall'
@@ -12,7 +21,7 @@ function! ale_linters#fortran#gcc#Handle(buffer, lines) abort
"
" :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 = {}
@@ -41,9 +50,7 @@ function! ale_linters#fortran#gcc#Handle(buffer, lines) abort
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.
@@ -54,12 +61,26 @@ function! ale_linters#fortran#gcc#Handle(buffer, lines) abort
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

@@ -1,204 +1,61 @@
" Author: Joshua Rubin <joshua@rubixconsulting.com>
" 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
let s:SplitChar = has('unix') ? ':' : ':'
" get a list of all source directories from $GOPATH and $GOROOT
function! s:SrcDirs() abort
let l:paths = split(s:go_env.GOPATH, s:SplitChar)
call add(l:paths, s:go_env.GOROOT)
return l:paths
endfunction
" figure out from a directory like `/home/user/go/src/some/package` that the
" import for that path is simply `some/package`
function! s:PackageImportPath(buffer) abort
let l:bufname = resolve(bufname(a:buffer))
let l:pkgdir = fnamemodify(l:bufname, ':p:h')
for l:path in s:SrcDirs()
let l:path = l:path . '/src/'
if stridx(l:pkgdir, l:path) == 0
return l:pkgdir[strlen(l:path):]
endif
endfor
return ''
endfunction
" get the package info data structure using `go list`
function! ale_linters#go#gobuild#GoList(buffer, goenv_output) abort
if !empty(a:goenv_output)
let s:go_env = {
\ 'GOPATH': a:goenv_output[0],
\ 'GOROOT': a:goenv_output[1],
\}
endif
return 'go list -json ' . shellescape(s:PackageImportPath(a:buffer))
endfunction
let s:filekeys = [
\ 'GoFiles',
\ 'CgoFiles',
\ 'CFiles',
\ 'CXXFiles',
\ 'MFiles',
\ 'HFiles',
\ 'FFiles',
\ 'SFiles',
\ 'SwigFiles',
\ 'SwigCXXFiles',
\ 'SysoFiles',
\ 'TestGoFiles',
\ 'XTestGoFiles',
\]
" get the go and test go files from the package
" will return empty list if the package has any cgo or other invalid files
function! s:PkgFiles(pkginfo) abort
let l:files = []
for l:key in s:filekeys
if has_key(a:pkginfo, l:key)
call extend(l:files, a:pkginfo[l:key])
endif
endfor
" resolve the path of the file relative to the window directory
return map(l:files, 'shellescape(fnamemodify(resolve(a:pkginfo.Dir . ''/'' . v:val), '':p''))')
endfunction
function! ale_linters#go#gobuild#CopyFiles(buffer, golist_output) abort
let l:tempdir = tempname()
let l:temppkgdir = l:tempdir . '/src/' . s:PackageImportPath(a:buffer)
call mkdir(l:temppkgdir, 'p', 0700)
if empty(a:golist_output)
return 'echo ' . shellescape(l:tempdir)
endif
" parse the output
let l:pkginfo = json_decode(join(a:golist_output, "\n"))
" get all files for the package
let l:files = s:PkgFiles(l:pkginfo)
" copy the files to a temp directory with $GOPATH structure
return 'cp ' . join(l:files, ' ') . ' ' . shellescape(l:temppkgdir) . ' && echo ' . shellescape(l:tempdir)
endfunction
function! ale_linters#go#gobuild#GetCommand(buffer, copy_output) abort
let l:tempdir = a:copy_output[0]
let l:importpath = s:PackageImportPath(a:buffer)
" write the a:buffer and any modified buffers from the package to the tempdir
for l:bufnum in range(1, bufnr('$'))
" ignore unloaded buffers (can't be a:buffer or a modified buffer)
if !bufloaded(l:bufnum)
continue
if exists('s:go_env')
return ''
endif
" ignore non-Go buffers
if getbufvar(l:bufnum, '&ft') !=# 'go'
continue
endif
" only consider buffers other than a:buffer if they have the same import
" path as a:buffer and are modified
if l:bufnum != a:buffer
if s:PackageImportPath(l:bufnum) !=# l:importpath
continue
endif
if !getbufvar(l:bufnum, '&mod')
continue
endif
endif
call writefile(getbufline(l:bufnum, 1, '$'), l:tempdir . '/src/' . s:PkgFile(l:bufnum))
endfor
let l:gopaths = [ l:tempdir ]
call extend(l:gopaths, split(s:go_env.GOPATH, s:SplitChar))
return 'GOPATH=' . shellescape(join(l:gopaths, s:SplitChar)) . ' go test -c -o /dev/null ' . shellescape(l:importpath)
return 'go env GOPATH GOROOT'
endfunction
function! s:PkgFile(buffer) abort
let l:bufname = resolve(bufname(a:buffer))
let l:importpath = s:PackageImportPath(a:buffer)
let l:fname = fnamemodify(l:bufname, ':t')
return l:importpath . '/' . l:fname
endfunction
function! s:FindBuffer(file) abort
for l:buffer in range(1, bufnr('$'))
if !buflisted(l:buffer)
continue
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
let l:pkgfile = s:PkgFile(l:buffer)
if a:file =~ '/' . l:pkgfile . '$'
return l:buffer
endif
endfor
return -1
" 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
let s:path_pattern = '[a-zA-Z]\?\\\?:\?[[:alnum:]/\.\-_]\+'
let s:handler_pattern = '^\(' . s:path_pattern . '\):\(\d\+\):\?\(\d\+\)\?: \(.\+\)$'
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"
let s:multibuffer = 0
" 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 = []
let l:output = []
for l:line in a:lines
let l:match = matchlist(l:line, s:handler_pattern)
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
if len(l:match) == 0
continue
endif
call add(l:output, {
\ 'lnum': l:match[2] + 0,
\ 'col': l:match[3] + 0,
\ 'text': l:match[4],
\ 'type': 'E',
\})
endfor
let l:buffer = s:FindBuffer(l:match[1])
if l:buffer == -1
continue
endif
if !s:multibuffer && l:buffer != a:buffer
" strip lines from other buffers
continue
endif
call add(l:output, {
\ 'bufnr': l:buffer,
\ 'lnum': l:match[2] + 0,
\ 'vcol': 0,
\ 'col': l:match[3] + 0,
\ 'text': l:match[4],
\ 'type': 'E',
\ 'nr': -1,
\})
endfor
return l:output
return l:output
endfunction
call ale#linter#Define('go', {
@@ -206,9 +63,8 @@ call ale#linter#Define('go', {
\ 'executable': 'go',
\ 'command_chain': [
\ {'callback': 'ale_linters#go#gobuild#GoEnv', 'output_stream': 'stdout'},
\ {'callback': 'ale_linters#go#gobuild#GoList', 'output_stream': 'stdout'},
\ {'callback': 'ale_linters#go#gobuild#CopyFiles', 'output_stream': 'stdout'},
\ {'callback': 'ale_linters#go#gobuild#GetCommand', 'output_stream': 'stderr'},
\ ],
\ 'callback': 'ale_linters#go#gobuild#Handler',
\ 'lint_file': 1,
\})

View File

@@ -5,6 +5,6 @@ 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

@@ -4,6 +4,6 @@
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

@@ -5,6 +5,6 @@ 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,73 +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
function! ale_linters#haskell#ghc#Handle(buffer, lines) abort
" Look for lines like the following.
"
" /dev/stdin:28:26: Not in scope: `>>>>>'
let l:pattern = '^[^:]\+:\(\d\+\):\(\d\+\): \(.\+\)$'
let l:output = []
" For some reason the output coming out of the GHC through the wrapper
" script breaks the lines up in strange ways. So we have to join some
" lines back together again.
let l:corrected_lines = []
for l:line in a:lines
if len(matchlist(l:line, l:pattern)) > 0
call add(l:corrected_lines, l:line)
if l:line !~# ': error:$'
call add(l:corrected_lines, '')
endif
elseif l:line ==# ''
call add(l:corrected_lines, l:line)
else
if len(l:corrected_lines) > 0
let l:line = substitute(l:line, '\v\s+', ' ', '')
let l:corrected_lines[-1] .= l:line
endif
endif
endfor
for l:line in l:corrected_lines
let l:match = matchlist(l:line, l:pattern)
if len(l:match) == 0
continue
endif
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
return l:output
endfunction
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_linters#haskell#ghc#Handle',
\ '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_linters#haskell#ghc#Handle',
\ '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

@@ -7,11 +7,9 @@ function! ale_linters#haskell#hlint#Handle(buffer, lines) abort
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 . '. Found: ' . l:error.from . ' Why not: ' . l:error.to,
\ 'type': l:error.severity ==# 'Error' ? 'E' : 'W',

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

@@ -3,34 +3,30 @@
" 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: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)
function! ale_linters#html#htmlhint#GetExecutable(buffer) abort
if g:ale_html_htmlhint_use_global
return g:ale_html_htmlhint_executable
if ale#Var(a:buffer, 'html_htmlhint_use_global')
return ale#Var(a:buffer, 'html_htmlhint_executable')
endif
return ale#util#ResolveLocalPath(
return ale#path#ResolveLocalPath(
\ a:buffer,
\ 'node_modules/.bin/htmlhint',
\ g:ale_html_htmlhint_executable
\ ale#Var(a:buffer, 'html_htmlhint_executable')
\)
endfunction
function! ale_linters#html#htmlhint#GetCommand(buffer) abort
return g:ale#util#stdin_wrapper . ' .html '
\ . ale_linters#html#htmlhint#GetExecutable(a:buffer)
\ . ' ' . g:ale_html_htmlhint_options
return ale_linters#html#htmlhint#GetExecutable(a:buffer)
\ . ' ' . ale#Var(a:buffer, 'html_htmlhint_options')
\ . ' %t'
endfunction
call ale#linter#Define('html', {
\ 'name': 'htmlhint',
\ 'executable_callback': 'ale_linters#html#htmlhint#GetExecutable',
\ 'command_callback': 'ale_linters#html#htmlhint#GetCommand',
\ 'callback': 'ale#handlers#HandleUnixFormatAsError',
\ '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

@@ -3,7 +3,9 @@
" 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
@@ -24,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
@@ -37,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
@@ -66,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

@@ -11,24 +11,51 @@ let g:ale_javascript_eslint_use_global =
\ get(g:, 'ale_javascript_eslint_use_global', 0)
function! ale_linters#javascript#eslint#GetExecutable(buffer) abort
if g:ale_javascript_eslint_use_global
return g:ale_javascript_eslint_executable
if ale#Var(a:buffer, 'javascript_eslint_use_global')
return ale#Var(a:buffer, 'javascript_eslint_executable')
endif
return ale#util#ResolveLocalPath(
" 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',
\ g:ale_javascript_eslint_executable
\ ale#Var(a:buffer, 'javascript_eslint_executable')
\)
endfunction
function! ale_linters#javascript#eslint#GetCommand(buffer) abort
return ale_linters#javascript#eslint#GetExecutable(a:buffer)
\ . ' ' . g:ale_javascript_eslint_options
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]
@@ -40,18 +67,7 @@ function! ale_linters#javascript#eslint#Handle(buffer, lines) abort
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
" Try the parsing pattern for parsing errors.
let l:match = matchlist(l:line, l:parsing_pattern)
endif
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]
@@ -61,15 +77,12 @@ function! ale_linters#javascript#eslint#Handle(buffer, lines) abort
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

View File

@@ -8,68 +8,74 @@ let g:ale_javascript_flow_use_global =
\ get(g:, 'ale_javascript_flow_use_global', 0)
function! ale_linters#javascript#flow#GetExecutable(buffer) abort
if g:ale_javascript_flow_use_global
return g:ale_javascript_flow_executable
endif
if ale#Var(a:buffer, 'javascript_flow_use_global')
return ale#Var(a:buffer, 'javascript_flow_executable')
endif
return ale#util#ResolveLocalPath(
\ a:buffer,
\ 'node_modules/.bin/flow',
\ g:ale_javascript_flow_executable
\)
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
return ale_linters#javascript#flow#GetExecutable(a:buffer)
\ . ' check-contents --respect-pragma --json --from ale %s'
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:str = join(a:lines, '')
if has_key(l:flow_output, 'errors')
if l:str ==# ''
return []
endif
let l:flow_output = json_decode(l:str)
let l:output = []
for l:error in 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
if has_key(l:message, 'loc') && l:line ==# 0
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
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
if has_key(l:error, 'operation')
let l:text = l:text . ' See also: ' . l:error.operation.descr
endif
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
call add(l:output, {
\ 'bufnr': a:buffer,
\ 'lnum': l:line,
\ 'vcol': 0,
\ 'col': l:col,
\ 'text': l:text,
\ 'type': l:error.level ==# 'error' ? 'E' : 'W',
\})
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
else
return []
endif
endfunction
call ale#linter#Define('javascript', {

View File

@@ -5,5 +5,5 @@ 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

@@ -8,30 +8,30 @@ let g:ale_javascript_jshint_use_global =
\ get(g:, 'ale_javascript_jshint_use_global', 0)
function! ale_linters#javascript#jshint#GetExecutable(buffer) abort
if g:ale_javascript_jshint_use_global
return g:ale_javascript_jshint_executable
if ale#Var(a:buffer, 'javascript_jshint_use_global')
return ale#Var(a:buffer, 'javascript_jshint_executable')
endif
return ale#util#ResolveLocalPath(
return ale#path#ResolveLocalPath(
\ a:buffer,
\ 'node_modules/.bin/jshint',
\ g:ale_javascript_jshint_executable
\ 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#util#ResolveLocalPath(
let l:jshint_config = ale#path#ResolveLocalPath(
\ a:buffer,
\ '.jshintrc',
\ get(g:, 'ale_jshint_config_loc', '')
\)
let l:command = ale_linters#javascript#jshint#GetExecutable(a:buffer)
let l:command .= ' --reporter unix'
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 .= ' -'
@@ -43,5 +43,5 @@ call ale#linter#Define('javascript', {
\ 'name': 'jshint',
\ '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

@@ -7,22 +7,11 @@ function! ale_linters#json#jsonlint#Handle(buffer, lines) abort
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

@@ -4,6 +4,19 @@
let g:ale_lua_luacheck_executable =
\ get(g:, 'ale_lua_luacheck_executable', 'luacheck')
let g:ale_lua_luacheck_options =
\ get(g:, 'ale_lua_luacheck_options', '')
function! ale_linters#lua#luacheck#GetExecutable(buffer) abort
return ale#Var(a:buffer, 'lua_luacheck_executable')
endfunction
function! ale_linters#lua#luacheck#GetCommand(buffer) abort
return 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:
"
@@ -12,22 +25,12 @@ function! ale_linters#lua#luacheck#Handle(buffer, lines) abort
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
@@ -36,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

@@ -6,21 +6,11 @@ function! ale_linters#markdown#mdl#Handle(buffer, lines) abort
let l:pattern = ':\(\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)
call add(l:output, {
\ 'bufnr': a:buffer,
\ 'lnum': l:match[1] + 0,
\ 'vcol': 0,
\ 'col': 0,
\ 'text': l:match[2],
\ 'type': 'W',
\ 'nr': -1,
\})
endfor

View File

@@ -1,9 +1,9 @@
" Author: poohzrn https://github.com/poohzrn
" Description: proselint for markdown files
" Description: proselint for Markdown files
call ale#linter#Define('markdown', {
\ 'name': 'proselint',
\ 'executable': 'proselint',
\ 'command': g:ale#util#stdin_wrapper . ' .md proselint',
\ 'callback': 'ale#handlers#HandleUnixFormatAsWarning',
\ '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

@@ -4,6 +4,16 @@
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:
"
@@ -12,13 +22,7 @@ function! ale_linters#matlab#mlint#Handle(buffer, lines) abort
let l:pattern = '^L \(\d\+\) (C \([0-9-]\+\)): \([A-Z]\+\): \(.\+\)$'
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:lnum = l:match[1] + 0
let l:col = l:match[2] + 0
let l:code = l:match[3]
@@ -30,15 +34,12 @@ function! ale_linters#matlab#mlint#Handle(buffer, lines) abort
continue
endif
" vcol is needed to indicate that the column is a character.
call add(l:output, {
\ 'bufnr': a:buffer,
\ 'lnum': l:lnum,
\ 'vcol': 0,
\ 'col': l:col,
\ 'text': l:text,
\ 'type': 'W',
\ 'nr': -1,
\})
endfor
@@ -47,9 +48,8 @@ endfunction
call ale#linter#Define('matlab', {
\ 'name': 'mlint',
\ 'executable': 'mlint',
\ 'command': g:ale#util#stdin_wrapper .
\ ' .m ' . g:ale_matlab_mlint_executable . ' -id',
\ '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

@@ -2,12 +2,11 @@
" Description: Report errors in OCaml code with Merlin
if !exists('g:merlin')
finish
finish
endif
function! ale_linters#ocaml#merlin#Handle(buffer, lines) abort
let l:errors = merlin#ErrorLocList()
return l:errors
return merlin#ErrorLocList()
endfunction
call ale#linter#Define('ocaml', {
@@ -16,4 +15,3 @@ call ale#linter#Define('ocaml', {
\ 'command': 'true',
\ 'callback': 'ale_linters#ocaml#merlin#Handle',
\})

View File

@@ -1,31 +1,35 @@
" Author: Vincent Lequertier <https://github.com/SkySymbol>
" Description: This file adds support for checking perl syntax
let g:ale_perl_perl_executable =
\ get(g:, 'ale_perl_perl_executable', 'perl')
let g:ale_perl_perl_options =
\ get(g:, 'ale_perl_perl_options', '-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
@@ -34,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

@@ -5,27 +5,10 @@ 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

View File

@@ -5,24 +5,15 @@ function! ale_linters#php#hack#Handle(buffer, lines) abort
let l:pattern = '^\(.*\):\(\d\+\):\(\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 a:buffer != bufnr(l:match[1])
continue
endif
if a:buffer != bufnr(l:match[1])
continue
endif
call add(l:output, {
\ 'bufnr': a:buffer,
\ 'lnum': l:match[2] + 0,
\ 'vcol': 0,
\ 'col': l:match[3] + 0,
\ 'text': l:match[5],
\ 'type': 'E',
\})
endfor

View File

@@ -1,29 +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
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
@@ -33,7 +23,7 @@ endfunction
call ale#linter#Define('php', {
\ 'name': 'php',
\ 'executable': 'php',
\ 'output_stream': 'both',
\ 'command': 'php -l -d display_errors=1 --',
\ 'output_stream': 'stdout',
\ 'command': 'php -l -d error_reporting=E_ALL -d display_errors=1 --',
\ 'callback': 'ale_linters#php#php#Handle',
\})

View File

@@ -1,15 +1,15 @@
" Author: jwilliams108 <https://github.com/jwilliams108>
" Description: phpcs for PHP files
let g:ale_php_phpcs_standard = get(g:, 'ale_php_phpcs_standard', '')
function! ale_linters#php#phpcs#GetCommand(buffer) abort
let l:command = 'phpcs -s --report=emacs --stdin-path=%s'
let l:standard = ale#Var(a:buffer, 'php_phpcs_standard')
let l:standard_option = !empty(l:standard)
\ ? '--standard=' . l:standard
\ : ''
" 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) abort
@@ -19,25 +19,15 @@ function! ale_linters#php#phpcs#Handle(buffer, lines) abort
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

@@ -5,6 +5,6 @@ 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

@@ -7,22 +7,11 @@ function! ale_linters#puppet#puppet#Handle(buffer, lines) abort
let l:pattern = '^Error: .*: \(.\+\) at .\+:\(\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
" 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': l:match[3] + 0,
\ 'text': l:match[1],
\ 'type': 'E',
\ 'nr': -1,
\})
endfor
@@ -33,6 +22,6 @@ call ale#linter#Define('puppet', {
\ 'name': 'puppet',
\ 'executable': 'puppet',
\ 'output_stream': 'stderr',
\ 'command': g:ale#util#stdin_wrapper . ' .pp puppet parser validate --color=false',
\ 'command': 'puppet parser validate --color=false %t',
\ 'callback': 'ale_linters#puppet#puppet#Handle',
\})

View File

@@ -1,8 +1,26 @@
" Author: Alexander Olofsson <alexander.olofsson@liu.se>
" 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': 'puppet-lint',
\ 'command': g:ale#util#stdin_wrapper . ' .pp puppet-lint --no-autoloader_layout-check --log-format "-:%{line}:%{column}: %{kind}: [%{check}] %{message}"',
\ 'callback': 'ale#handlers#HandleGCCFormat',
\ '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

@@ -4,15 +4,38 @@
let g:ale_python_flake8_executable =
\ get(g:, 'ale_python_flake8_executable', 'flake8')
let g:ale_python_flake8_args =
\ get(g:, 'ale_python_flake8_args', '')
" 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)
" 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 = {}
function! s:UsingModule(buffer) abort
return ale#Var(a:buffer, 'python_flake8_options') =~# ' *-m flake8'
endfunction
function! ale_linters#python#flake8#GetExecutable(buffer) abort
return g:ale_python_flake8_executable
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
return ale#Var(a:buffer, 'python_flake8_executable')
endfunction
function! ale_linters#python#flake8#ClearVersionCache() abort
let s:version_cache = {}
endfunction
function! ale_linters#python#flake8#VersionCheck(buffer) abort
@@ -25,7 +48,10 @@ function! ale_linters#python#flake8#VersionCheck(buffer) abort
return ''
endif
return ale_linters#python#flake8#GetExecutable(a:buffer) . ' --version'
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.
@@ -58,11 +84,14 @@ function! ale_linters#python#flake8#GetCommand(buffer, version_output) abort
" 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'
\ ? ' --stdin-display-name %s'
\ : ''
return ale_linters#python#flake8#GetExecutable(a:buffer)
\ . ' ' . g:ale_python_flake8_args . ' ' . l:display_name_args . ' -'
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', {
@@ -72,5 +101,5 @@ call ale#linter#Define('python', {
\ {'callback': 'ale_linters#python#flake8#VersionCheck'},
\ {'callback': 'ale_linters#python#flake8#GetCommand'},
\ ],
\ 'callback': 'ale#handlers#HandlePEP8Format',
\ 'callback': 'ale#handlers#python#HandlePEP8Format',
\})

View File

@@ -1,24 +1,42 @@
" 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! g:ale_linters#python#mypy#GetCommand(buffer) abort
let l:automatic_stubs_dir = ale#util#FindNearestDirectory(a:buffer, 'stubs')
" TODO: Add Windows support
let l:automatic_stubs_command = (has('unix') && !empty(l:automatic_stubs_dir))
\ ? 'MYPYPATH=' . l:automatic_stubs_dir . ' '
\ : ''
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)
return l:automatic_stubs_command
\ . g:ale#util#stdin_wrapper
\ . ' .py mypy --show-column-numbers '
\ . g:ale_python_mypy_options
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
let s:path_pattern = '[a-zA-Z]\?\\\?:\?[[:alnum:]/\.\-_]\+'
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)
function! g:ale_linters#python#mypy#Handle(buffer, lines) abort
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'
@@ -26,39 +44,30 @@ function! g:ale_linters#python#mypy#Handle(buffer, lines) abort
" Lines like these should be ignored below:
"
" file.py:4: note: (Stub files are from https://github.com/python/typeshed)
let l:pattern = '^' . s:path_pattern . ':\(\d\+\):\?\(\d\+\)\?: \([^:]\+\): \(.\+\)$'
let l:pattern = '\v^([a-zA-Z]?:?[^:]+):(\d+):?(\d+)?: (error|warning): (.+)$'
let l:output = []
let l:buffer_filename = expand('#' . a:buffer . ':p')
for l:line in a:lines
let l:match = matchlist(l:line, l:pattern)
if len(l:match) == 0
continue
endif
if l:match[4] =~# 'Stub files are from'
" The lines telling us where to get stub files from make it so
" we can't read the actual errors, so exclude them.
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, {
\ 'bufnr': a:buffer,
\ 'lnum': l:match[1] + 0,
\ 'vcol': 0,
\ 'col': l:match[2] + 0,
\ 'text': l:match[4],
\ 'type': l:match[3] =~# 'error' ? 'E' : 'W',
\ 'nr': -1,
\ '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 g:ale#linter#Define('python', {
call ale#linter#Define('python', {
\ 'name': 'mypy',
\ 'executable': '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

@@ -7,20 +7,68 @@ let g:ale_python_pylint_executable =
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
return g:ale_python_pylint_executable
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 g:ale#util#stdin_wrapper . ' .py '
\ . ale_linters#python#pylint#GetExecutable(a:buffer)
\ . ' ' . g:ale_python_pylint_options
\ . ' --output-format text --msg-template="{path}:{line}:{column}: {msg_id} {msg}" --reports n'
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#handlers#HandlePEP8Format',
\ '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

@@ -9,25 +9,15 @@ function! ale_linters#ruby#rubocop#Handle(buffer, lines) abort
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': index(['C', 'E'], l:type) != -1 ? 'E' : 'W',
\ 'nr': -1,
\ 'type': index(['F', 'E'], l:type) != -1 ? 'E' : 'W',
\})
endfor
@@ -35,9 +25,9 @@ function! ale_linters#ruby#rubocop#Handle(buffer, lines) abort
endfunction
function! ale_linters#ruby#rubocop#GetCommand(buffer) abort
return 'rubocop --format emacs --force-exclusion ' .
\ g:ale_ruby_rubocop_options .
\ ' --stdin ' . bufname(a:buffer)
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.

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

@@ -1,8 +1,10 @@
" 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#util#FindNearestFile(a:bufnr, 'Cargo.toml') !=# ''
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,
@@ -11,10 +13,19 @@ function! ale_linters#rust#cargo#GetCargoExecutable(bufnr) abort
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': 'cargo build --message-format=json -q',
\ 'command_callback': 'ale_linters#rust#cargo#GetCommand',
\ 'callback': 'ale#handlers#rust#HandleRustErrors',
\ 'output_stream': 'stdout',
\ 'lint_file': 1,
\})

View File

@@ -5,7 +5,7 @@ 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#util#FindNearestFile(a:buffer_number, 'Cargo.toml')
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')

View File

@@ -3,6 +3,6 @@
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

@@ -7,14 +7,14 @@ let g:ale_sass_stylelint_use_global =
\ get(g:, 'ale_sass_stylelint_use_global', 0)
function! ale_linters#sass#stylelint#GetExecutable(buffer) abort
if g:ale_sass_stylelint_use_global
return g:ale_sass_stylelint_executable
if ale#Var(a:buffer, 'sass_stylelint_use_global')
return ale#Var(a:buffer, 'sass_stylelint_executable')
endif
return ale#util#ResolveLocalPath(
return ale#path#ResolveLocalPath(
\ a:buffer,
\ 'node_modules/.bin/stylelint',
\ g:ale_sass_stylelint_executable
\ ale#Var(a:buffer, 'sass_stylelint_executable')
\)
endfunction
@@ -27,5 +27,5 @@ call ale#linter#Define('sass', {
\ 'name': 'stylelint',
\ 'executable_callback': 'ale_linters#sass#stylelint#GetExecutable',
\ 'command_callback': 'ale_linters#sass#stylelint#GetCommand',
\ 'callback': 'ale#handlers#HandleStyleLintFormat',
\ 'callback': 'ale#handlers#css#HandleStyleLintFormat',
\})

View File

@@ -1,4 +1,3 @@
" vim: set et:
" Author: Zoltan Kalmar - https://github.com/kalmiz
" Description: Basic scala support using scalac
@@ -21,22 +20,16 @@ function! ale_linters#scala#scalac#Handle(buffer, lines) abort
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
@@ -47,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

@@ -3,6 +3,6 @@
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

@@ -8,27 +8,18 @@ function! ale_linters#scss#scsslint#Handle(buffer, lines) abort
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

@@ -7,14 +7,14 @@ let g:ale_scss_stylelint_use_global =
\ get(g:, 'ale_scss_stylelint_use_global', 0)
function! ale_linters#scss#stylelint#GetExecutable(buffer) abort
if g:ale_scss_stylelint_use_global
return g:ale_scss_stylelint_executable
if ale#Var(a:buffer, 'scss_stylelint_use_global')
return ale#Var(a:buffer, 'scss_stylelint_executable')
endif
return ale#util#ResolveLocalPath(
return ale#path#ResolveLocalPath(
\ a:buffer,
\ 'node_modules/.bin/stylelint',
\ g:ale_scss_stylelint_executable
\ ale#Var(a:buffer, 'scss_stylelint_executable')
\)
endfunction
@@ -27,5 +27,5 @@ call ale#linter#Define('scss', {
\ 'name': 'stylelint',
\ 'executable_callback': 'ale_linters#scss#stylelint#GetExecutable',
\ 'command_callback': 'ale_linters#scss#stylelint#GetCommand',
\ 'callback': 'ale#handlers#HandleStyleLintFormat',
\ 'callback': 'ale#handlers#css#HandleStyleLintFormat',
\})

View File

@@ -1,13 +1,18 @@
" Author: w0rp <devw0rp@gmail.com>
" Description: Lints sh files using bash -n
" 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
" 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
@@ -26,11 +31,11 @@ function! ale_linters#sh#shell#GetExecutable(buffer) abort
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) abort
return ale_linters#sh#shell#GetExecutable(a:buffer) . ' -n'
return ale_linters#sh#shell#GetExecutable(a:buffer) . ' -n %t'
endfunction
function! ale_linters#sh#shell#Handle(buffer, lines) abort
@@ -38,30 +43,13 @@ function! ale_linters#sh#shell#Handle(buffer, lines) abort
"
" 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

@@ -5,16 +5,19 @@
" 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
@@ -29,12 +32,17 @@ function! s:GetDialectArgument() abort
endfunction
function! ale_linters#sh#shellcheck#GetCommand(buffer) abort
return 'shellcheck ' . s:exclude_option . ' ' . s:GetDialectArgument() . ' -f gcc -'
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',
\ 'executable_callback': 'ale_linters#sh#shellcheck#GetExecutable',
\ 'command_callback': 'ale_linters#sh#shellcheck#GetCommand',
\ 'callback': 'ale#handlers#HandleGCCFormat',
\ 'callback': 'ale#handlers#gcc#HandleGCCFormat',
\})

View File

@@ -0,0 +1,26 @@
" Author: Markus Doits - https://github.com/doits
" Description: slim-lint for Slim files, based on hamllint.vim
function! ale_linters#slim#slimlint#Handle(buffer, lines) abort
" Matches patterns like the following:
" <path>:5 [W] LineLength: Line is too long. [150/120]
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('slim', {
\ 'name': 'slimlint',
\ 'executable': 'slim-lint',
\ 'command': 'slim-lint %t',
\ 'callback': 'ale_linters#slim#slimlint#Handle'
\})

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