Coding conventions
Syntax
Use 2 spaces of indentation per indentation level in
Nix expressions, 4 spaces in shell scripts.
Do not use tab characters, i.e. configure your
editor to use soft tabs. For instance, use (setq-default
indent-tabs-mode nil) in Emacs. Everybody has different
tab settings so it’s asking for trouble.
Use lowerCamelCase for variable
names, not UpperCamelCase. TODO: naming of
attributes in
all-packages.nix?
Function calls with attribute set arguments are
written as
foo {
arg = ...;
}
not
foo
{
arg = ...;
}
Also fine is
foo { arg = ...; }
if it's a short call.
In attribute sets or lists that span multiple lines,
the attribute names or list elements should be aligned:
# A long list.
list =
[ elem1
elem2
elem3
];
# A long attribute set.
attrs =
{ attr1 = short_expr;
attr2 =
if true then big_expr else big_expr;
};
# Alternatively:
attrs = {
attr1 = short_expr;
attr2 =
if true then big_expr else big_expr;
};
Short lists or attribute sets can be written on one
line:
# A short list.
list = [ elem1 elem2 elem3 ];
# A short set.
attrs = { x = 1280; y = 1024; };
Breaking in the middle of a function argument can
give hard-to-read code, like
someFunction { x = 1280;
y = 1024; } otherArg
yetAnotherArg
(especially if the argument is very large, spanning multiple
lines).
Better:
someFunction
{ x = 1280; y = 1024; }
otherArg
yetAnotherArg
or
let res = { x = 1280; y = 1024; };
in someFunction res otherArg yetAnotherArg
The bodies of functions, asserts, and withs are not
indented to prevent a lot of superfluous indentation levels, i.e.
{ arg1, arg2 }:
assert system == "i686-linux";
stdenv.mkDerivation { ...
not
{ arg1, arg2 }:
assert system == "i686-linux";
stdenv.mkDerivation { ...
Function formal arguments are written as:
{ arg1, arg2, arg3 }:
but if they don't fit on one line they're written as:
{ arg1, arg2, arg3
, arg4, ...
, # Some comment...
argN
}:
File naming and organisation
Names of files and directories should be in lowercase, with
dashes between words — not in camel case. For instance, it should be
all-packages.nix, not
allPackages.nix or
AllPackages.nix.