Changelog
February 23, 2026 ยท View on GitHub
v1.8.0 (23.02.2026)
Enhancements
- Support unions in macro arguments
- Preserve empty lines inside
maybeexpression bodies - Add
--out-fulloption - 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_filestofilesabsolute 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_typeattribute, andmaybeconstructs
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-endto 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
--rangeas 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
@formatpragma to avoid warnings from edoc - fix place of comments for list cons #282
Enhancements
- added
delete-pragmacommand 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
-ifor--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
--fileswhen none is provided #204 - Add
--exclude-filesflag to manually exclude some files from the formatter #213 - Warn on overly long lines, given
--verboseflag #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
--checkflag #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-widthis now configurable as a command line parameter #99% erlfmt-ignorecomment 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-pragmaCLI option adds the@formatpragma to all the formatted files that didn't have it before #75 - preserve empty lines in containers #83
Bug fixes
- correctly handle
.scriptfiles likerebar.config.script#79 export_typeis formatted the same asexport#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-pragmacombined with stdio for files with high-codepoint unicode
v0.4.1 (23.07.2020)
Bug Fixes
- Fix dialyzer
--require-pragmafor 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-pragmaflag to only format files annotated with@format
v0.1.0 (06.04.2020)
Initial release