diff --git a/README.md b/README.md
index 9561c363..64d54821 100644
--- a/README.md
+++ b/README.md
@@ -18,6 +18,7 @@ project may be more suitable.
[clojure]: https://clojure.org/
[clojure style guide]: https://github.com/bbatsov/clojure-style-guide
+[zprint]: https://github.com/kkinnear/zprint
## Usage
@@ -101,6 +102,8 @@ And to fix those errors:
bb cljfmt fix
```
+[babashka]: https://babashka.org/
+
### Standalone
cljfmt can also be run as a standalone `-main` application. Do do so,
diff --git a/docs/INDENTS.md b/docs/INDENTS.md
index 8b1f5ee8..6644f055 100644
--- a/docs/INDENTS.md
+++ b/docs/INDENTS.md
@@ -1,311 +1,231 @@
# Indentation
-When we talk about how rules affect indentation of source code, we
-refer to (foo arg1 arg2...
-argn)
as a form, `foo` as a form symbol, and
-arg1 arg2 ... argn
as
-form arguments.
+## Overview
-The default indentation rules are encoded
-[here](cljfmt/resources/cljfmt/).
+Indentation in Clojure can be difficult to get right, as each macro may
+have different indentation conventions.
-Rules affect indentation of form arguments. A form argument is
-eligible for indentation only when it is the first element on a line.
+By default, cljfmt indents according to the [Clojure Style Guide][]. Any
+function or macro that differs needs specific indent rules. These can be
+defined using the `:indents` option. For example:
-An indentation rule specifies an indentation type and indentation type
-arguments. One or more rules can be applied to a form symbol.
-
-Indentation types are:
-
-* `:inner` -
- two character indentation applied to form arguments at a depth
- relative to a form symbol
-
-* `:block` -
- first argument aligned indentation applied to form arguments at form
- depth 0 for a symbol
-
-## Form depth
-
-A rule for depth n affects indentation of form arguments relative to
-form symbol at depth n.
-
-Form depth is the nested depth of any element within the form.
-
-A contrived example will help to explain depth:
-
-```clojure
-(foo
- bar
- (baz
- (qux plugh)
- corge)
- (grault
- waldo
- (thud wubble flob)))
+```edn
+{:indents {when [[:block 1]]}}
```
-If we look at the example code as a tree, we can visualize the effect
-of different form depths relative to `foo`:
-
-![form depth 0 diagram](images/form-depth-0.png)
-![form depth 1 diagram](images/form-depth-1.png)
-![form depth 2 diagram](images/form-depth-2.png)
-
-## Default behavior
-
-In the absence of indentation rules:
+The key can be either a symbol or a regular expression. For example:
```clojure
-(foo bar (foo bar
-baz == formats to => baz
-bang) bang)
+{:indents {#"^with-" [[:inner 0]]}}
```
-```clojure
-(foo (foo
-bar == formats to => bar
-bang) bang)
-```
+Note that edn files do not support regular expressions.
-## Inner rules
+If the symbol is unqualified, it will match all symbols regardless of
+namespace. If the symbol is qualified, it will match only the symbol
+with that namespace. In most cases, cljfmt can infer the namespace of
+any symbol by reading the `ns` declaration.
-The `:inner` rule applies an indentation of two spaces to all eligible
-form arguments of forms at a given form depth. It has 2 rule type
-arguments:
+In the cases where it cannot, you can supply an optional alias map. For
+example:
-* `form-depth` -
- apply inner indentation within forms at this depth
+```edn
+{:indents {com.example/foo [[:inner 0]]}
+ :alias-map {ex com.example}}
+```
-* `limit-to-form-index` -
- optionally limit indentation formatting to a single form, by default
- formatting is applied to all forms at `form-depth`
+This rule would match both `com.example/foo` and `ex/foo`.
-Indent rule:
+By default, new indentation rules are merged with the defaults. If you
+want to replace the defaults, use the `:replace` metadata hint. For
+example, to replace all indentation rules with a constant 2-space
+indentation:
-```clojure
-{foo [[:inner 0]]}
+```edn
+{:indents ^:replace {#".*" [[:inner 0]]}}
```
-Will indent all arguments for symbol `foo` at depth `0` by two spaces:
+[clojure style guide]: https://github.com/bbatsov/clojure-style-guide
-```clojure
-(foo bar (foo bar
-baz == formats to => baz
-bang) bang)
-```
+## Concepts
-Indent rule:
+cljfmt format rules use **indexes** and **depth**.
+
+The index is the argument index, starting from zero. In a list, this
+means that the second element is 0, the third is 1, etc.
```clojure
-{foo [[:inner 1]]}
+(foo bar baz)
+; ^ ^
+; 0 1
```
-Results in `:inner` indenting form arguments at depth `1`. Form
-`(bang...)` is at depth `1` so its arguments are affected:
+The depth of an element is how deeply it's nested, relative to a chosen
+parent. Elements in the parent list have depth 0, its children have
+depth 1, its grandchildren depth 2, etc.
```clojure
-(foo bar (foo bar
-baz baz
-(bang == formats to => (bang
-quz quz
-qoz)) qoz))
+(foo ; <- 0
+ (bar baz ; <- 1
+ (quz) ; <- 2
+ bang)) ; <- 1
```
-Because no rule was specified for depth 0, default indentation is
-applied to `bar` `baz` and `(bang...)`.
+For the purpose of indentation, it is the depth of the first element in
+the line that matters, and the argument index is always of the form
+being indented.
-## Limiting inner indentation
+## Rules
-Sometimes it is useful to limit `:inner` indentation to one, rather
-than all, forms at the specified depth. For example, we'd like `letfn`
-to use inner indentation only in its binding vector.
+There are three types of indentation in cljfmt: **default**, **inner**
+and **block**.
-Let's look at `letfn` example in the absence of any indentation rules:
+### Default
-```clojure
-(letfn [(double [x]
- (* x 2))] ;; want inner indentation here
- (let [y (double 2)
- z (double 3)]
- (println y
- z))) ;; but not here
-```
+Default indentation is used in absence of any other type. For lists,
+it formats differently depending on the number of elements in the first
+line.
-Applying the rule:
+If there is one or fewer elements on the first line it indents by one
+space:
```clojure
-{letfn [[:inner 2]]}
+(println ; <= one or fewer elements on first line
+ "hello"
+ "world")
```
-Brings in the `letfn` function body to where we want it by affecting
-form `(double [x]...)`:
+If there is more than one element it indents to the level of the second
+element:
```clojure
-(letfn [(double [x]
- (* x 2))] ;; want inner indentation here
- (let [y (double 2)
- z (double 3)]
- (println y
- z))) ;; but not here
+(println "hello" ; <= more than one element on first line
+ "world")
```
-But also affects all other forms at depth `2`. In this case,
-`(println...)` indentation is affected in an undesirable way. To limit
-formatting to `(double [x]...)`, the `0`th form at depth `2`, the
-`limit-to-form-index` rule type argument is added:
+### Inner
-```clojure
-{letfn [[:inner 2 0]]}
-```
+Inner indentation always indents by two spaces on every line after the
+first, regardless of how many elements there are:
-... giving us:
```clojure
-(letfn [(double [x]
- (* x 2))] ;; want inner indentation here
- (let [y (double 2)
- z (double 3)]
- (println y
- z))) ;; but not here
-```
-
-Remember that when calculating `limit-to-form-index`, all forms at the
-specified depth are included, even self-evaluating ones. Given:
+(defn greet [name]
+ (println "Hello" name))
-```clojure
-(foo a b c
- (e f
- g)
- (h i
- j))
+(defn dismiss
+ [name]
+ (println "Goodbye" name))
```
-To affect inner indentation within form `(e...)` only, we use a rule
-of:
+The indentation rule for `defn` is:
-```clojure
-{foo [[:inner 1 3]]}
+```edn
+{defn [[:inner 0]]}
```
-Which results in:
+The 0 indicates that only elements at depth 0 should have an inner
+indent. We can see that elements at a greater depth use their own
+indentation rules:
```clojure
-(foo a b c
- (e f
- g)
- (h i
- j))
+depth │ code │ indent
+──────┼────────────────────┼──────────
+ │ (defn greet │
+ 0 │ [name] │ :inner
+ 0 │ (println "Hello" │ :inner
+ 1 │ name)) │ :default
```
-Because `(e...)` is the 4th (index `3`) at form depth `1`.
-
-#### Block rules
-
-The `:block` rule works like the `:inner` rule under some
-circumstances, and like a normal list form under others. It takes one
-argument:
+Note that the depth used to determine the indentation for the line is
+is depth of the first element in the line.
-* `line-threshold-index` -
- if the argument at this index starts a new line, all following lines
- will be indented by a constant 2 spaces. Any other lines are
- indented normally.
+We can compare `defn` to another core macro, `reify`. The indentation
+rule for `reify` is:
-For example:
-
-```clojure
-{foo [[:block 0]]}
+```edn
+{reify [[:inner 0] [:inner 1]]}
```
-If the argument at index 0 (the first argument) does not start a new
-line, the form is indented as normal:
+This will use the inner indentation rule for depth 0 and 1. For example:
```clojure
-(foo bar (foo bar
-baz == formats to => baz
-bang) bang)
+depth │ code │ indent
+──────┼───────────────────────┼──────────
+ │ (reify │
+ 0 │ clojure.lang.IDeref │ :inner
+ 0 │ (deref [_] │ :inner
+ 1 │ (str "Hello" │ :inner
+ 2 │ "World"))) │ :default
```
-If it does, the lines are indented with a constant 2 spaces:
+We can narrow this rule even further. The indentation rule for `letfn`
+is:
-```clojure
-(foo (foo
-bar == formats to => bar
-baz baz
-bang) bang)
+```edn
+{letfn [[:block 1] [:inner 2 0]]}
```
-To give another example
-
-```clojure
-{foo [[:block 1]]}
-```
+We'll talk about block indentation in the next section. What's important
+in this example is the `[:inner 2 0]`, which has two arguments. The
+first is the depth, in this case `2`; the second argument is the index
+to restrict this rule to, in this case `0`.
-This time we're looking at the argument at index 1 (the second
-argument). If it starts a new line, the indent is constant:
+This is best shown with an example:
```clojure
-(foo bar (foo bar
-baz == formats to => baz
-bang) bang)
+depth │ index │ code │ indent
+──────┼───────┼────────────────────────┼──────────
+ │ │ (letfn [(square [x] │
+ 2 │ 0 │ (* x x)) │ :inner
+ 1 │ 0 │ (sum [x y] | :default
+ 2 │ 0 │ (+ x y))] │ :inner
+ 0 │ 1 │ (let [x 3 │ :block
+ 2 │ 1 │ y 4] │ :default
+ 2 │ 1 │ (sum (square x) │ :default
+ 3 │ 1 │ (square y)))) │ :default
```
-But if it does not, start a new line, normal indentation rules are
-used instead:
+Note that the index is the argument index of `letfn`; either 0 for the
+vector of bindings, or 1 for the inner `let` clause.
-```clojure
-(foo bar baz == formats to => (foo bar baz
-bang) bang)
-```
-
-Any lines before the threshold are always indented normally:
+If the inner indentation of `letfn` were not restricted to the first
+argument, the binding vector, the `sum` function would be incorrectly
+formatted.
-```clojure
-(foo (foo
-bar bar
-baz == formats to => baz
-bang) bang)
-```
+### Block
-## Multiple rules
+Block indentation is a mix of the two. It behaves according to the
+default rules up to a particular index. If the argument with that index
+is the first element in a line, it switches to use inner indentation.
-Multiple rules can be specified. Picking up from our previous `letfn`
-example, the rule:
+That may be hard to visualize, so lets illustrate with an example. The
+`do` form has the indentation rule:
-```clojure
-{letfn [[:inner 2 0]]}
+```edn
+{do [[:block 0]]}
```
-Gave us:
+If the argument 0, the first argument, is at the start of a line, it
+uses inner indentation: a constant 2 spaces for each line.
-```clojure
-(letfn [(double [x]
- (* x 2))] ;; want inner indentation here
- (let [y (double 2)
- z (double 3)]
- (println y
- z))) ;; but not here
+```edn
+(do
+ (println "Hello")
+ (println "World"))
```
-Adding a `:block` rule:
+However, if argument 0 does not begin a line, the default indentation
+is used:
-```clojure
-{letfn [[:block 1][:inner 2 0]]}
+```edn
+(do (println "Hello")
+ (println "World"))
```
-Matches the [current default rule for `letfn`][default-rule] and
-results in indenting the `(let...` to where we want it:
-
-```clojure
-(letfn [(double [x]
- (* x 2))] ;; want inner indentation here
- (let [y (double 2)
- z (double 3)]
- (println y
- z))) ;; but not here
-```
+## Defaults
-In this case, single form argument `[(double...)]` does not break the
-`line-arg-count-threshold` of `1` and we therefore get inner
-indentation for form argument `(let...)`.
+The default indentation for cljfmt are stored in the following resources:
-[default-rule]: cljfmt/resources/cljfmt/indents/clojure.clj
+* [cljfmt/indents/clojure.clj](../cljfmt/resources/cljfmt/indents/clojure.clj)
+* [cljfmt/indents/compojure.clj](../cljfmt/resources/cljfmt/indents/compojure.clj)
+* [cljfmt/indents/fuzzy.clj](../cljfmt/resources/cljfmt/indents/fuzzy.clj)
diff --git a/docs/images/form-depth-0.drawio b/docs/images/form-depth-0.drawio
deleted file mode 100644
index e01fc10f..00000000
--- a/docs/images/form-depth-0.drawio
+++ /dev/null
@@ -1 +0,0 @@
-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
\ No newline at end of file
diff --git a/docs/images/form-depth-0.png b/docs/images/form-depth-0.png
deleted file mode 100644
index 248fe9d7..00000000
Binary files a/docs/images/form-depth-0.png and /dev/null differ
diff --git a/docs/images/form-depth-1.drawio b/docs/images/form-depth-1.drawio
deleted file mode 100644
index 9f135d0a..00000000
--- a/docs/images/form-depth-1.drawio
+++ /dev/null
@@ -1 +0,0 @@
-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
\ No newline at end of file
diff --git a/docs/images/form-depth-1.png b/docs/images/form-depth-1.png
deleted file mode 100644
index 1fd9e72d..00000000
Binary files a/docs/images/form-depth-1.png and /dev/null differ
diff --git a/docs/images/form-depth-2.drawio b/docs/images/form-depth-2.drawio
deleted file mode 100644
index c006580d..00000000
--- a/docs/images/form-depth-2.drawio
+++ /dev/null
@@ -1 +0,0 @@
-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
\ No newline at end of file
diff --git a/docs/images/form-depth-2.png b/docs/images/form-depth-2.png
deleted file mode 100644
index 637a0688..00000000
Binary files a/docs/images/form-depth-2.png and /dev/null differ