SkillAgentSearch skills...

Zprint

Executables, uberjar, and library to beautifully format Clojure and Clojurescript source code and s-expressions.

Install / Use

/learn @kkinnear/Zprint
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

zprint

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 formatting approaches.

cljdoc badge

Quickstart

Overview

zprint does far more than just properly indent code. Before:

(defn change-start-column [new-start-column style-vec [inline-comment-index
  start-column spaces-before :as comment-vec]] (if (zero? inline-comment-index)
  style-vec (let [delta-spaces (- new-start-column start-column) new-spaces
  (+ spaces-before delta-spaces) previous-element-index (dec
  inline-comment-index) [s c e :as previous-element] (nth style-vec
  previous-element-index) new-previous-element (cond (= e :indent) [(str "\n"
  (blanks new-spaces)) c e] (= e :whitespace) [(str (blanks new-spaces))
  c e 26] :else nil)] (assoc style-vec previous-element-index
  new-previous-element))))

After:

(defn change-start-column
  [new-start-column style-vec
   [inline-comment-index start-column spaces-before :as comment-vec]]
  (if (zero? inline-comment-index)
    style-vec
    (let [delta-spaces (- new-start-column start-column)
          new-spaces (+ spaces-before delta-spaces)
          previous-element-index (dec inline-comment-index)
          [s c e :as previous-element] (nth style-vec previous-element-index)
          new-previous-element
            (cond (= e :indent) [(str "\n" (blanks new-spaces)) c e]
                  (= e :whitespace) [(str (blanks new-spaces)) c e 26]
                  :else nil)]
      (assoc style-vec previous-element-index new-previous-element))))

Recent Additions!

  • There have been several requests for differing treatment of "trailing right" characters. Those are characters that terminate a collection: )]}, which also fall on their own line, either because of :respect-nl or because of a comment. Some have requested that these characters be indented to the indent of the structure involved. Others have requested that (unless required by a comment) they be brought up to the previous line so that they are not "trailing right" characters anymore. Both capabilties are now supported, the first by :indent-trailing-right? and the second by :collapse-trailing-right?, for lists, vectors, maps and sets. See the reference manual for details.
  • :no-wrap-after has been around for a while. This lets you specify an element where you would prefer the next element be on the same line. It has been completely re-implemented and now works well in many more situations.
  • Formatting for tagged-literals was completely reimplemented.
  • The zprint executables now have the ability to locate and process multiple files directly. See the reference manual and look up the {:files {:glob "<filespec>"}} key-value pair for the options map.
  • The style :sort-require will sort the requires in an ns macro, as suggested by how-to-ns. This will interoperate with :ns-justify well, but be sure and put the :sort-require to the left of (i.e., before) the :ns-justify. This will sort the elements of the :refer vector as well.
  • :ns-justify has been modified to support explicit parameters for the variance in the :require, :require-macros and :import sections of the ns macro. They are :require-max-variance, :require-macros-max-variance and :import-max-variance and may be used in a style map. For example {:style-call :ns-justify :require-max-variance 1000} will try as hard as possible to justify the :require list in an ns macro.
  • A new pre-compiled binary is available for macOS running on Apple Silicon. While the macOS Intel binary runs fine on Apple Silicon, the Apple Silicon binary runs considerably (up to 3x) faster! Download zprintma-1.3.0 from the release to get the Apple Silicon version.
  • You can now run zprint as a babashka task or use bbin. It starts very quickly and runs faster than the uberjar on even very large files. If using a task, you don't need to install a new version, just edit bb.edn. See the simple detals here
  • All changes

See zprint:

  • 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.

Use zprint:

Get zprint:

Get something other than the default formatting:

Without learning how to configure 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:

Learn how to alter zprint's formatting behavior:

I want to change...

Usage

cljdoc badge

bb compatible

Clojure 1.9, 1.10, 1.10.3, 1.11.1, 1.12.0:

Leiningen (via Clojars)

Clojars Project

Clojurescript:

zprint has been tested in each of the following environments:

  • figwheel-main 0.2.16 (Clojurescript 1.11.4)
  • shadow-cljs 2.18.0
  • planck 2.28.0 (Clojurescript 1.11.132)

It requires tools.reader at least 1.0.5, which all of the environments above contain.

Clojure 1.8:

The last zprint release built with Clojure 1.8 was [zprint "0.4.15"].

In addit

View on GitHub
GitHub Stars620
CategoryDevelopment
Updated2d ago
Forks53

Languages

Clojure

Security Score

95/100

Audited on Mar 27, 2026

No findings