The Uncompromising Nix Code Formatter
Different levels of --quiet by repeating the -q
flag,
which makes Vim users have a better formatting experience by using :%!alejandra -qq
to format the current buffer,
specially when the file has syntax errors.
The possibility for companies to promote their business by placing an add at the end of Alejandra's terminal output, and thank you messages for the sponsors of the project.
You can obtain this benefits in @kamadorueda's sponsor page.
Thank you messages for the different people who have helped improving Alejandra.
alejandra_cli
,
now it is Alejandra
.Full Changelog: https://github.com/kamadorueda/alejandra/compare/2.0.0...3.0.0
A Style Guide, explaining why certain decisions were taken and why they are optimal from a productive Nix hacker point of view.
This guide is a work in progress, but the aim is that it eventually documents all of the aspects of the Nix language, so that we all have the peace of mind that comes from knowing that the style in Alejandra is the way it is for a reason.
Integration guides for: Neovim and GNU Emacs.
Published Alejandra as a crate, and added API documentation so other tools and integrations can be built in top of it.
Now running: $ alejandra -
formats stdin,
as POSIX
suggests.
Comments are now indented by a multiple of 2 issues/294:
Previously (notice how some lines are indented with 3 and 5 spaces):
/*
Bla bla bla.
More bla:
- Bla bla
- Bla
*/
123
Now (all lines are indented to 2 and 4 spaces):
/*
Bla bla bla.
More bla:
- Bla bla
- Bla
*/
123
This makes it easier to write comments on major code editors,
where a <TAB>
(or <Shift>+<Tab>
)
moves the cursor/content to the next multiple of 2,
and so indenting the comment contents
to an odd number of spaces (like 3, 5, 7)
is uncomfortable and unproductive.
This change also allows cooperation with other tools like EditorConfig, to further exercise good practices over a codebase.
Updated dependencies to its latest version.
indent_size = 2
by @blaggacao in https://github.com/kamadorueda/alejandra/pull/324
Full Changelog: https://github.com/kamadorueda/alejandra/compare/1.5.0...2.0.0
Full Changelog: https://github.com/kamadorueda/alejandra/compare/1.4.0...1.5.0
Full Changelog: https://github.com/kamadorueda/alejandra/compare/1.3.0...1.4.0
Full Changelog: https://github.com/kamadorueda/alejandra/compare/1.2.0...1.3.0
apps.${system}.default
to the Flake
so that newer versions of Nix
understand this instead of defaultApp.${system}
.aarch64-linux
appeared twice
and aarch64-darwin
didn't.Full Changelog: https://github.com/kamadorueda/alejandra/compare/1.1.0...1.2.0
--quiet
flag to the CLI which hide output details,
disable the TUI
and only print error messages.Full Changelog: https://github.com/kamadorueda/alejandra/compare/1.0.0...1.1.0
The indentation for function applications was improved, so that indentation is now correct to the human eye in all cases:
- name2 = function arg {
- asdf = 1;
- }
- argument;
+ name2 =
+ function arg {
+ asdf = 1;
+ }
+ argument;
String interpolations ("${something}"
)
now follow the same logic as parentheses ((something)
),
since ultimately, they are the same family of elements.
Parentheses handling logic was rewritten and by extension string interpolations as well.
- (
- self: super: {
- # ...
- }
- )
+ (self: super: {
+ # ...
+ })
- builtins.map (
- pkg: {
- name = "alejandra-${pkg.stdenv.targetPlatform.config}";
- value = pkg;
- }
- )
+ builtins.map (pkg: {
+ name = "alejandra-${pkg.stdenv.targetPlatform.config}";
+ value = pkg;
+ })
- (
- fenix.combine [
- fenix.latest.rustc
- fenix.latest.toolchain
- fenix.targets."wasm32-unknown-unknown".latest.rust-std
- ]
- )
+ (fenix.combine [
+ fenix.latest.rustc
+ fenix.latest.toolchain
+ fenix.targets."wasm32-unknown-unknown".latest.rust-std
+ ])
pkgs.writeText "other-modules.json"
(l.toJSON
- (l.mapAttrs
- (pname: subOutputs: let
- pkg = subOutputs.packages."${pname}".overrideAttrs (old: {
- buildScript = "true";
- installMethod = "copy";
- });
- in "${pkg}/lib/node_modules/${pname}/node_modules")
- outputs.subPackages))
+ (l.mapAttrs
+ (pname: subOutputs:
+ let
+ pkg = subOutputs.packages."${pname}".overrideAttrs (old: {
+ buildScript = "true";
+ installMethod = "copy";
+ });
+ in
+ "${pkg}/lib/node_modules/${pname}/node_modules")
+ outputs.subPackages))
- (with a;
- /*
- comment
- */
- with b;
- with c; {
- a = 1;
- b = 2;
- })
+ (with a;
+ /*
+ comment
+ */
+ with b;
+ with c; {
+ a = 1;
+ b = 2;
+ })
In some cases it's possible to insert a newline after the
opening element (either (
or ${
) to force a tall formatting.
Full Changelog: https://github.com/kamadorueda/alejandra/compare/0.7.0...1.0.0
- ++
- # subsections go last
+ ++ # subsections go last
with
and assert
expressions:
- assert (libXft != null) -> libpng != null;
- # probably a bug
- assert stdenv.isDarwin -> libXaw != null;
- # fails to link otherwise
+ assert (libXft != null) -> libpng != null; # probably a bug
+
+ assert stdenv.isDarwin -> libXaw != null; # fails to link otherwise
+
if-then-else
expressions:
if y ? ${a}
- then v x.${a} y.${a}
- # both have attr, use merge func
- else x.${a}
- # only x has attr
+ then v x.${a} y.${a} # both have attr, use merge func
+ else x.${a} # only x has attr
inherit
expressions:
inherit
(callPackage ../development/tools/ocaml/ocamlformat {})
- ocamlformat
- # latest version
+ ocamlformat # latest version
ocamlformat_0_11_0
parenthesis
expressions:
- || (
- # Accept {} for tests that are unsupported
+ || ( # Accept {} for tests that are unsupported
isDerivation x
&& x ? meta.timeout
);
Linux binaries now use mimalloc to provide much better performance when formatting Nixpkgs:
x86_64-unknown-linux-gnu, 1.3x faster, from 0m10.639s to 0m8.381s
x86_64-unknown-linux-musl, 15.8x faster, from 2m32.686s to 0m9.642s
On QEMU aarch64-unknown-linux-musl, 4.6x faster, from 5m26s to 1m10s
On QEMU armv6l-unknown-linux-musleabihf, 1.05x faster, from 8m7s to 7m41s
On QEMU armv7l-unknown-linux-musleabihf, 1.15x faster, from 5m54s to 5m7s
On QEMU i686-unknown-linux-musl, 1.07x faster, from 2m44s to 2m33s
After profiling the code as suggested by nnethercote's perf-book one critical path of Alejandra was identified an optimized, yielding huge performance boosts:
x86_64-unknown-linux-gnu, 2.5x faster, from 0m8.381s to 0m3.410s
x86_64-unknown-linux-musl, 2.3x faster, from 0m9.642s to 0m4.134s
On QEMU aarch64-unknown-linux-musl, 2.4x faster, from 1m10s to 0m29s
On QEMU armv6l-unknown-linux-musleabihf, 1.85x faster, from 7m41s to 4m8.399s
On QEMU armv7l-unknown-linux-musleabihf, 1.88x faster, from 5m7s to 2m42.595s
On QEMU i686-unknown-linux-musl, 1.65x faster, from 2m33s to 1m32.671s
In general this is an algorithmic improvement and therefore the following platforms should be faster as well by a similar ratio (not measured):
A --threads
flag, so you can pick how many formatting threads to spawn.
Defaults to the number of logical CPUs in your system.
Position counters were improved to offer an extra 1.13x speedup.
Full Changelog: https://github.com/kamadorueda/alejandra/compare/0.6.0...0.7.0
A --check
flag, which makes Alejandra emit an exit code of 2
if any file was changed during formatting.
This means you can now use Alejandra in your CI/CD to ensure your code complies the Alejandra style.
Multiline strings are handled as utf-8 correctly, preventing panics on utf-8 whitespace like:
''
foo
\u{2002}bar
''
All inputs and dependencies were updated to their latest version
Full Changelog: https://github.com/kamadorueda/alejandra/compare/0.5.0...0.6.0