https://github.com/borkdude/clj-kondo.git
git clone 'https://github.com/borkdude/clj-kondo.git'
(ql:quickload :borkdude.clj-kondo)
A linter for Clojure code that sparks joy.
You don't mind the occasional inline
def for
debugging, but you would like to get rid of them before making your code
public. Also, unnecessary do
and let
nestings don't really add any value to
your life. Let clj-kondo help you tidy your code.
clj-kondo detects:
def
expressionsdo
and let
wrappingslet
and letfn
binding callsrecur
)clojure.test/deftest
before your REPL knows it.
It suggests several style guide recommendations, such as:
:else
as the catch-all test expression in cond
(see Clojure style guide)seq
instead of (not (empty? ,,,))
(see Clojure style guide)It has support for syntax of commonly used macros like
clojure.core.async/alt!!
, schema.core/defn
and potemkin/import-vars
.
It provides analysis data so you build your own custom linters.
This linter is:
.clj
, .cljs
, .cljc
and .edn
filesTry clj-kondo at the interactive playground.
Lint from stdin:
$ echo '(def x (def x 1))' | clj-kondo --lint -
<stdin>:1:8: warning: inline def
Lint a file:
$ echo '(def x (def x 1))' > /tmp/foo.clj
$ clj-kondo --lint /tmp/foo.clj
/tmp/foo.clj:1:8: warning: inline def
Lint a directory:
$ clj-kondo --lint src
src/clj_kondo/test.cljs:7:1: warning: redundant do
src/clj_kondo/calls.clj:291:3: error: Wrong number of args (1) passed to clj-kondo.calls/analyze-calls
Lint a project classpath:
$ clj-kondo --lint "$(lein classpath)"
To detect lint errors across namespaces in your project, a cache is needed. To
let clj-kondo know where to create one, make a .clj-kondo
directory in the
root of your project, meaning on the same level as your project.clj
,
deps.edn
or build.boot
. A cache will be created inside of it when you run
clj-kondo
. Before linting inside your editor, it is recommended to lint the
entire classpath to teach clj-kondo
about all the libraries you are using,
including Clojure and/or ClojureScript itself:
$ clj-kondo --lint "<classpath>"
Build tool specific ways to get a classpath:
- lein classpath
- boot with-cp -w -f
- clojure -Spath
So for lein
the entire command would be:
$ clj-kondo --lint "$(lein classpath)"
Now you are ready to lint single files using editor integration. A simulation of what happens when you edit a file in your editor:
$ echo '(select-keys)' | clj-kondo --lang cljs --lint -
<stdin>:1:1: error: Wrong number of args (0) passed to cljs.core/select-keys
Since clj-kondo now knows about your version of ClojureScript via the cache,
it detects that the number of arguments you passed to select-keys
is
invalid. Each time you edit a file, the cache is incrementally updated, so
clj-kondo is informed about new functions you just wrote.
If you want to use a different directory to read and write the cache, use the
--cache-dir
option. To disable the cache even if you have a .clj-kondo
directory, use --cache false
.
0
: no errors or warnings were found2
: more than one warning was found3
: more than one error was foundAll other error codes indicate an unexpected error.
script/test
var-info.edn
and inspirationDo you enjoy this project? Consider buying me a hot beverage.
Copyright © 2019 Michiel Borkent
Distributed under the EPL License, same as Clojure. See LICENSE.
The directory inlined
contains source from tools.reader
which is licensed under the EPL license.
The directory parser
contains modified source from rewrite-clj
which is licensed under the MIT license.