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