zprint is a library and command line tool providing a variety of pretty printing capabilities for both Clojure code and Clojure/EDN structures. It can meet almost anyone's needs. As such, it supports a number of major source code formattng approaches.
- classic zprint -- ignores whitespace in function definitions and formats code with a variety of heuristics to look as good as hand-formatted code (see examples)
- respect blank lines -- similar to classic zprint, but blank lines inside of function defintions are retained, while code is otherwise formatted to look beautiful (see examples)
- indent only -- very different from classic zprint -- no code ever changes lines, it is only correctly indented on whatever line it was already on (see examples)
In addition, zprint is very handy to use at the REPL.
- to format whole files
- while using an editor
- at the REPL
- with a team
- with different formatting for different projects
- to format a range of lines in a file
- to format a babashka script
- to correct indentation but not otherwise reformat a file
- and have it run even faster
- from inside a Clojure(script) program
- a standalone binary for macOS starts in <50 ms
- a standalone binary for Linux starts in <50 ms
- an uberjar for any Java enabled platform starts in several seconds
- an accelerated uberjar for any Java enabled platform starts in about 1s
- a library to use at the REPL
- other ways to access zprint
Maybe one of the existing "styles" will meet your needs. All you have to
do is put {:style ...}
on the command line or as the third argument
to a zprint call. For example, {:style :community}
or
{:style :respect-bl}
.
Some commonly used styles:
- Format using "community" standards
- Respect blank lines
- Indent Only
- Respect all newlines
- Detect and format hiccup vectors
- Justify all pairs
- Backtranslate
quote
,deref
,var
,unquote
in structures - Detect keywords in vectors, if found respect newlines
- Sort dependencies in project.clj
- Support "How to ns"
- how user defined functions are formatted
- the indentation in lists
- the configuration to track the "community" standard
- how blank lines in source are handled
- how map keys are formatted
- the colors used for formatting source
- how the second element of a pair is indented
- how comments are handled
- how blank lines are handled at the top level
- anything else...
Leiningen (via Clojars)
zprint has been tested in each of the following environments:
- Clojurescript 1.10.520
- figwheel 0.5.19
- shadow-cljs 2.8.62
lumo
1.10.1planck
2.24.0
It requires tools.reader
at least 1.0.5, which all of the environments
above contain.
The last zprint release built with Clojure 1.8 was [zprint "0.4.15"].
In addition to the zprint dependency, you also need to include the following library when using Clojure 1.8:
[clojure-future-spec "1.9.0-alpha17"]
- Entire reference document
- What does zprint do?
- Features
- The zprint API
- Configuration
- Configuration uses an options map
- Where to put an options map
- Simplified Configuration -- using
:style
- Respect blank lines
- Indent Only
- Format using "community" standards
- Respect all newlines
- Detect and format hiccup vectors
- Justify all pairs
- Backtranslate
quote
,deref
,var
,unquote
in structures - Detect keywords in vectors, if found respect newlines
- Sort dependencies in project.clj
- Support "How to ns"
- Add newlines between pairs in
let
binding vectors - Add newlines between
cond
,assoc
pairs - Add newlines between extend clauses
- Add newlines between map pairs
- Prefer hangs and improve performance for deeply nested code and data
- Options map format
- Generalized Capabilities
- Syntax Coloring
- Function Classification for Pretty Printing
- Formatting large or deep collections
- Widely Used Configuration Parameters
- Configurable Elements
A number of folks have contributed to zprint, not all of whom show up on GitHub because I have integrated the code or suggestions manually. Thanks for all of the great contributions!
--url
and--url-only
: @coltnz- Suggestion/encouragement to implement
:respect-bl
: @griffis :option-fn
and:fn-format
for enhanced vector formatting: @milankinen- Fixed missing require in
spec.cljc
: @Quezion - Corrected readme: @griffis
- Fixed nested reader conditional: @rgould1
- Clarified and added useful example for clj usage: @bherrmann7
- Suggested fix for international chars and graalVM native image: @huahaiy
Thanks to everyone who has contributed fixes as well as everyone who has reported an issue. I really appreciate all of the help making zprint better for everybody!
At the core of zprint
is the rewrite-clj
library by Yannick
Scherer, which will parse Clojure source into a zipper. This is a
great library! I would not have attempted zprint
if rewrite-clj
didn't exist to build upon. The Clojurescript port relies on Magnus
Rundberget's port of rewrite-clj
to Clojurescript, rewrite-cljs
.
It too worked with no issues when porting to Clojurescript!
Copyright © 2016-2020 Kim Kinnear
Distributed under the MIT License. See the file LICENSE for details.