# Changelog

## v1.8.0 (23.02.2026)

### Enhancements

  - Support unions in macro arguments
  - Preserve empty lines inside `maybe` expression bodies
  - Add `--out-full` option
  - Bypass file server to improve IO performance

### Fixes

  - Fix multiline sigil strings causing "formatter result not equivalent" error
  - Fix non-idempotent formatting of multi-line binary strings
  - Fix escript skip path losing shebang comments with `--require-pragma`

## v1.7.0 (13.06.2025)

### Enhancements

  - Support for zip and strict generators in comprehensions from OTP 28
  - Support for nominal types from OTP 28
  - Support some partially invalid code - e.g. case or receive with no clauses

### Fixes

  - Fix crash with sigils inside ignored sections
  - Improve `erlfmt:error_info()` type

## v1.6.2 (25.04.2025)

### Fixes

  - Fix crash when two erlfmt-ignore-begin/end blocks immediately followed

## v1.6.1 (04.04.2025)

### Fixes

  - Fix crash when formatting an indented tripple quoted string with empty lines

## v1.6.0 (29.01.2025)

### Enhancements

  - Parse code with trailing commas and semicolons and just remove them when reprinting

## v1.5.0 (03.09.2024)

### Enhancements

  - Support OTP 27 sigils https://www.erlang.org/blog/highlights-otp-27/#sigils
  - Support OTP 27 triple-quoted strings https://www.erlang.org/blog/highlights-otp-27/#triple-quoted-strings
  - Support new documentation attributes

### Fixes

  - Apply `exclude_files` to `files` absolute paths - mixing relative & absolute paths could lead to
    unexpected behaviour before

## v1.4.0 (28.08.2024)

### Enhancements

  - Support trailing content on ignore comments
  - Support (and recommend) `erlfmt:ignore`-style ignore comments to align with ELP & eqWAlizer

### Fixes

  - Fix compiler warnings on OTP 27

## v1.3.0 (08.11.2023)

### Enhancements

  - Support map comprehensions, `import_type` attribute, and `maybe` constructs

**POTENTIAL RE-FORMATTING**

All "raw" `maybe` and `else` atoms will be automatically re-quoted to make
the code compatible with the `maybe` feature, if enabled.
After the transformation the code will be compatible with the maybe feature
both enabled & disabled.

## v1.2.0 (24.03.2023)

### Enhancements

  - Support `erlfmt-ignore-begin`, `erlfmt-ignore-end` to skip multiple top-level forms

## v1.1.0 (29.07.2022)

### Enhancements

  - Handle try clauses in define
  - Support formatting PIDs, Refs, Ports
  - Handle ;-separated guards in macro expressions

### Fixes

  - Ensure proper IO opts when reading from stdin
  - Handle Int#{} edge case without crashing

## v1.0.0 (29.06.2021)

1.0.0 Release. No new changes.

## v0.15.2 (24.06.2021)

1.0 Release Candidate 3.2

### Fixes

  - Formatting Ranges support for opt-out pragmas #311

## v0.15.1 (23.06.2021)

1.0 Release Candidate 3.1

### Enhancements

  - Introduce semi-expanded format for containers #309

## v0.15.0 (18.06.2021)

1.0 Release Candidate 3

### Enhancements

  - Add `--range` as a command line option #299, #300, #295
  - Introduce semi-expanded format for function calls #305
  - Introduce noformat pragma #302

### Fixes

  - Return exit code 2 when option isn't recognized. #304

## v0.14.1 (10.05.2021)

1.0 Release Candidate 2.1

### Fixes

  - fix replace pragma to not crash on two blocks of comments

## v0.14.0 (10.05.2021)

1.0 Release Candidate 2

### Fixes

  - comment `@format` pragma to avoid warnings from edoc
  - fix place of comments for list cons #282

### Enhancements

  - added `delete-pragma` command line flag #280

### Formatting Decisions

  - new module documentation analyses #283

## v0.13.0 (19.04.2021)

1.0 Release Candidate 1

### Fixes

  - Preserve newline in spec without guards #273 #275
  - Preserve comments in receive after after #271
  - Fix end_location in raw_string anno #274
  - Fix pre dot comments in function #267
  - Better error reporting for not_equivalent and tests #269

## v0.12.0 (30.03.2021)

Tuples that are not tagged tuples are formatted as lists

### Enhancements

  - Break untagged tuples #259
  - rewrite some binary operators using associativity #262 #264 #265
  - next break fits for dolon #246

### Fixes

  - double indent pattern matches in clauses #247
  - fix parsing of bad records #261

## v0.11.1 (10.03.2021)

Support macros in type and spec names

### Enhancements

 - Added shorthand `-i` for `--insert-pragma` #256

### Fixes

 - Support macros in type and spec names #254

## v0.11.0 (12.02.2021)

List comprehensions revisited

### Enhancements

 - Updated formatting for list comprehensions #249
 - preserve newline after's arrow #245
 - preserve newlines after equal #248

## v0.10.0 (22.01.2021)

Preserve a single empty line between attributes

### Enhancements

  - Preserve a single empty line between attributes #239
  - Only write to file the formatted code when it is different to the current one #235
  - Export the format_nodes function for symmetry with read_nodes function.

### Fixes

  - no newline after spec #224
  - preserve breaks after dolon #225
  - fix: Crash formatting qlc_SUITE in OTP #240
  - Preserve newlines between separated guards #241
  - Adjust AST for try clauses such that they do not move comments around #242

## v0.9.0 (4.11.2020)

Default files and exclude_files option

### Enhancements

  - Provide default value for `--files` when none is provided #204
  - Add `--exclude-files` flag to manually exclude some files from the formatter #213
  - Warn on overly long lines, given `--verbose` flag #209

### Fixes

  - Comments below shebang are pull upwards to support emulator args #207
  - Bind Pipe Tighter in parser #206
  - Fix record field type end location in parser #201
  - Properly handle comments inside concats #216
  - Properly handle trailing comments followed by post-comments #217
  - Preserve comments inside fun type arg list #218

## v0.8.0 (5.10.2020)

Better rebar integration

### Enhancements

  - Better rebar integration #196 #183 #197 #200
  - Change formatting of pipes to prefixes #191 #194

### Fixes

  - Parse attributes with empty parens #189
  - Do not crash with comments before a dot #184
  - Do not crash with post comments in catch #195

## v0.7.0 (17.09.2020)

`--check` flag now provides exit code 1, if files are not formatted.

### Enhancements

  - `--check` flag #123

### Bug fixes

  - Preserve newline in list & binary comprehensions #116
  - Preserve new lines in guards and specs #115
  - Make multi-line tuples & binaries next-break-fits #117
  - Use deterministic compiler option for releasing precompiled escript #127
  - Do not crash when formatting an empty file #130
  - Relax map syntax #137
  - Support macros with parens in concat #138

## v0.6.0 (18.08.2020)

Configurable print-width and erlfmt-ignore comment

### Enhancements

  - `print-width` is now configurable as a command line parameter #99
  - `% erlfmt-ignore` comment ignores the next form and does not format it #98
  - files are now formatted in parallel #101

### Bug fixes

  - Preserve empty lines around if-like attributes #97
  - Don't break multiple clauses with comments #96
  - Make try and after always introduce a newline #107
  - Do not preserve operator newline with a next break fits expression #104
  - New format for multiline fun types #110

## v0.5.1 (05.08.2020)

### Bug fixes
  - correctly handle type unions inside of multiline containers (such as specs) #90

## v0.5.0 (05.08.2020)

### Enhancements
  - new `--insert-pragma` CLI option adds the `@format` pragma to all the formatted
    files that didn't have it before #75
  - preserve empty lines in containers #83

### Bug fixes
  - correctly handle `.script` files like `rebar.config.script` #79
  - `export_type` is formatted the same as `export` #86
  - print type unions either all on single line or each type separated by
    `|` on a separate line #84

## v0.4.2 (24.07.2020)

### Bug Fixes
  - `--require-pragma` combined with stdio for files with high-codepoint unicode

## v0.4.1 (23.07.2020)

### Bug Fixes
  - Fix dialyzer
  - `--require-pragma` for single-form and non-unicode files
  - Compiles with rebar3 3.14

## v0.4.0 (23.07.2020)

### Enhancements
  - require-pragma prints out original file instead of formatting if no pragma is found.
    This makes it easier to integrate into a CI pipeline. #57
  - Better exceptions #58
  - Group imports and exports with similar names on the same line. #65
  - Add format_string as a library call. #66

### Bug Fixes
  - Preserve empty lines between attributes #67
  - Remove space between single clause fun and parens #68

## v0.3.0 (09.07.2020)

### Enhancements
  - Allow reading from stdin with command `$ erlfmt -` #46
  - Support Erlang version 23.0

### Bug Fixes
  - Remove trailing spaces from comments #48
  - Make position of return type in specs consistent #47
  - Fix some parser failures in OTP #39
  - Concat converted from a string also forces breaks #43

## v0.2.0 (03.06.2020)

### New formatting algebra
Switched out formatting algorithm.
This is now based on Elixir's greedy algorithm, instead of a lazy algorithm.
This fixes performance issues with laying out larger tuples.

### Bug Fixes
  - Preserve empty lines between comments and expressions
  - Stop adding unnecessary empty lines between attributes
  - Stop indenting list and binary comprehensions unnecessarily
  - Fix formatting multiple files from command line
  - Ensure all parsable OTP files format cleanly

### Enhancements
  - Support formatting escripts and "consult" files like rebar.config
  - Add `--require-pragma` flag to only format files annotated with `@format`

## v0.1.0 (06.04.2020)

Initial release
