about summary refs log tree commit diff
path: root/maintainers/docs/coding-conventions.txt
blob: 2cff1c33d7ee547414220887ab379d0094c63d70 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
Some conventions:

* Directories / file names: lowercase, and use dashes between words,
  no camel case.  I.e., all-packages.nix, not all allPackages.nix or
  AllPackages.nix.

* Don't use TABs.  Everybody has different TAB settings so it's asking
  for trouble.

* Use 2 spaces of indentation per indentation level in Nix
  expressions, 4 spaces in shell scripts.  (Maybe 2 is too low, but
  for consistency's sake it should be the same.  Certainly indentation
  should be consistent within a single file.)

* Use lowerCamelCase for variable names, not UpperCamelCase.

* 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;
    };
    
* 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, so

    assert system == "i686-linux";
    stdenv.mkDerivation { ...

  not

    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, ...
    , argN
    }: