forked from lix-project/lix
![Eelco Dolstra](/assets/img/avatar_default.png)
single quotes. Example (from NixOS): job = '' start on network-interfaces start script rm -f /var/run/opengl-driver ${if videoDriver == "nvidia" then "ln -sf ${nvidiaDrivers} /var/run/opengl-driver" else if cfg.driSupport then "ln -sf ${mesa} /var/run/opengl-driver" else "" } rm -f /var/log/slim.log end script ''; This style has two big advantages: - \, ' and " aren't special, only '' and ${. So you get a lot less escaping in shell scripts / configuration files in Nixpkgs/NixOS. The delimiter '' is rare in scripts (and can usually be written as ""). ${ is also fairly rare. Other delimiters such as <<...>>, {{...}} and <|...|> were also considered but this one appears to have the fewest drawbacks (thanks Martin). - Indentation is intelligently stripped so that multi-line strings can follow the nesting structure of the containing Nix expression. E.g. in the example above 6 spaces are stripped from the start of each line. This prevents unnecessary indentation in generated files (which sometimes even breaks things). See tests/lang/eval-okay-ind-string.nix for some examples.
108 lines
3 KiB
Nix
108 lines
3 KiB
Nix
let
|
|
|
|
s1 = ''
|
|
This is an indented multi-line string
|
|
literal. An amount of whitespace at
|
|
the start of each line matching the minimum
|
|
indentation of all lines in the string
|
|
literal together will be removed. Thus,
|
|
in this case four spaces will be
|
|
stripped from each line, even though
|
|
THIS LINE is indented six spaces.
|
|
|
|
Also, empty lines don't count in the
|
|
determination of the indentation level (the
|
|
previous empty line has indentation 0, but
|
|
it doesn't matter).
|
|
'';
|
|
|
|
s2 = '' If the string starts with whitespace
|
|
followed by a newline, it's stripped, but
|
|
that's not the case here. Two spaces are
|
|
stripped because of the " " at the start.
|
|
'';
|
|
|
|
s3 = ''
|
|
This line is indented
|
|
a bit further.
|
|
''; # indentation of last line doesn't count if it's empty
|
|
|
|
s4 = ''
|
|
Anti-quotations, like ${if true then "so" else "not so"}, are
|
|
also allowed.
|
|
'';
|
|
|
|
s5 = ''
|
|
The \ is not special here.
|
|
' can be followed by any character except another ', e.g. 'x'.
|
|
Likewise for $, e.g. $$ or $varName.
|
|
But ' followed by ' is special, as is $ followed by {.
|
|
If you want them, use anti-quotations: ${"''"}, ${"\${"}.
|
|
'';
|
|
|
|
s6 = ''
|
|
Tabs are not interpreted as whitespace (since we can't guess
|
|
what tab settings are intended), so don't use them.
|
|
This line starts with a space and a tab, so only one
|
|
space will be stripped from each line.
|
|
'';
|
|
|
|
s7 = ''
|
|
Also note that if the last line (just before the closing ' ')
|
|
consists only of whitespace, it's ignored. But here there is
|
|
some non-whitespace stuff, so the line isn't removed. '';
|
|
|
|
s8 = '' ${""}
|
|
This shows a hacky way to preserve an empty line after the start.
|
|
But there's no reason to do so: you could just repeat the empty
|
|
line.
|
|
'';
|
|
|
|
s9 = ''
|
|
${""} Similarly you can force an indentation level,
|
|
in this case to 2 spaces. This works because the anti-quote
|
|
is significant (not whitespace).
|
|
'';
|
|
|
|
s10 = ''
|
|
'';
|
|
|
|
s11 = '''';
|
|
|
|
s12 = '' '';
|
|
|
|
s13 = ''
|
|
start on network-interfaces
|
|
|
|
start script
|
|
|
|
rm -f /var/run/opengl-driver
|
|
${if true
|
|
then "ln -sf 123 /var/run/opengl-driver"
|
|
else if true
|
|
then "ln -sf 456 /var/run/opengl-driver"
|
|
else ""
|
|
}
|
|
|
|
rm -f /var/log/slim.log
|
|
|
|
end script
|
|
|
|
env SLIM_CFGFILE=${"abc"}
|
|
env SLIM_THEMESDIR=${"def"}
|
|
env FONTCONFIG_FILE=/etc/fonts/fonts.conf # !!! cleanup
|
|
env XKB_BINDIR=${"foo"}/bin # Needed for the Xkb extension.
|
|
env LD_LIBRARY_PATH=${"libX11"}/lib:${"libXext"}/lib:/usr/lib/ # related to xorg-sys-opengl - needed to load libglx for (AI)GLX support (for compiz)
|
|
|
|
${if true
|
|
then "env XORG_DRI_DRIVER_PATH=${"nvidiaDrivers"}/X11R6/lib/modules/drivers/"
|
|
else if true
|
|
then "env XORG_DRI_DRIVER_PATH=${"mesa"}/lib/modules/dri"
|
|
else ""
|
|
}
|
|
|
|
exec ${"slim"}/bin/slim
|
|
'';
|
|
|
|
in s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10 + s11 + s12 + s13
|