diff --git a/README.md b/README.md index ed39e25a..c534d51a 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ name. That seems to be the fairest way to arrange this table. | Elm | [elm-make](https://github.com/elm-lang/elm-make) | | 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/), [gosimple](https://github.com/dominikh/go-tools/tree/master/cmd/gosimple), [staticcheck](https://github.com/dominikh/go-tools/tree/master/cmd/staticcheck) | +| 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) | diff --git a/ale_linters/go/gometalinter.vim b/ale_linters/go/gometalinter.vim new file mode 100644 index 00000000..8dbd8b26 --- /dev/null +++ b/ale_linters/go/gometalinter.vim @@ -0,0 +1,56 @@ +" Author: Ben Reedy +" 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 ' + \ . g:ale_go_gometalinter_options + \ . ' ' . fnameescape(fnamemodify(bufname(a:buffer), ':p:h')) +endfunction + +function! ale_linters#go#gometalinter#Handler(buffer, lines) abort + " Matches patterns line 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" + + " gometalinter returns relative paths so use tail of filename as part of pattern matcher + let l:filename = fnamemodify(bufname(a:buffer), ':t') + let l:path_pattern = '[a-zA-Z]\?\\\?:\?[[:alnum:]/\.\-_]\+' + let l:pattern = '^' . l:path_pattern . ':\(\d\+\):\?\(\d\+\)\?:\?:\?\(warning\|error\):\?\s\*\?\(.\+\)$' + let l:output = [] + + for l:line in a:lines + let l:match = matchlist(l:line, l:pattern) + + " Omit errors from files other than the one currently open + if len(l:match) == 0 || l:line !~ l:filename + 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': tolower(l:match[3]) ==# 'warning' ? 'W' : 'E', + \ 'nr': -1, + \}) + 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, +\}) diff --git a/autoload/ale/linter.vim b/autoload/ale/linter.vim index b13aa1c9..dc42c52a 100644 --- a/autoload/ale/linter.vim +++ b/autoload/ale/linter.vim @@ -22,6 +22,7 @@ let s:default_ale_linter_aliases = { " Only cargo is enabled for Rust by default. let s:default_ale_linters = { \ 'csh': ['shell'], +\ 'go': ['go build', 'gofmt', 'golint', 'gosimple', 'go vet', 'staticcheck'], \ 'help': [], \ 'rust': ['cargo'], \ 'text': [], diff --git a/doc/ale-go.txt b/doc/ale-go.txt new file mode 100644 index 00000000..3ae82e80 --- /dev/null +++ b/doc/ale-go.txt @@ -0,0 +1,37 @@ +=============================================================================== +ALE Go Integration *ale-go-options* + + +------------------------------------------------------------------------------- +Integration Information + +The `gometalinter` linter is disabled by default, and all other Go linters +supported by ALE are enabled by default. To enable `gometalinter`, update +|g:ale_linters| as appropriate: + +> + " Enable all of the linters you want for Go. + let g:ale_linters = {'go': ['gometalinter', 'gofmt']} +< + +------------------------------------------------------------------------------- +gometalinter *ale-go-gometalinter* + +g:ale_go_gometalinter_enabled *g:ale_go_gometalinter_enabled* + + Type: |Integer| + Default: 0 + + This variable can be change to enable gometalinter for go files. + + +g:ale_go_gometalinter_options *g:ale_go_gometalinter_options* + + Type: |String| + Default: `''` + + This variable can be changed to alter the command-line arguments to the + gometalinter invocation. + +------------------------------------------------------------------------------- + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/doc/ale.txt b/doc/ale.txt index 7ae9b2a6..b82fd5f5 100644 --- a/doc/ale.txt +++ b/doc/ale.txt @@ -31,6 +31,8 @@ CONTENTS *ale-contents* erlc................................|ale-erlang-erlc| fortran...............................|ale-fortran-options| gcc.................................|ale-fortran-gcc| + go....................................|ale-go-options| + gometalinter........................|ale-go-gometalinter| handlebars............................|ale-handlebars-options| ember-template-lint.................|ale-handlebars-embertemplatelint| html..................................|ale-html-options| @@ -124,7 +126,7 @@ The following languages and tools are supported. * Elm: 'elm-make' * Erlang: 'erlc' * Fortran: 'gcc' -* Go: 'gofmt -e', 'go vet', 'golint', 'go build', 'gosimple', 'staticcheck' +* Go: 'gofmt', 'go vet', 'golint', 'go build', 'gosimple', 'staticcheck' * Haml: 'hamllint' * Handlebars: 'ember-template-lint' * Haskell: 'ghc', 'hlint'