178 lines
5.8 KiB
Nix
178 lines
5.8 KiB
Nix
{ options, config, lib, pkgs, ... }:
|
||
|
||
with lib;
|
||
|
||
let
|
||
cfg = config.environment;
|
||
|
||
exportVariables =
|
||
mapAttrsToList (n: v: ''export ${n}="${v}"'') cfg.variables;
|
||
|
||
aliasCommands =
|
||
mapAttrsToList (n: v: ''alias ${n}=${escapeShellArg v}'')
|
||
(filterAttrs (k: v: v != null) cfg.shellAliases);
|
||
in
|
||
|
||
{
|
||
imports = [
|
||
(mkRemovedOptionModule [ "environment" "loginShell" ] ''
|
||
This option was only used to change the default command in tmux.
|
||
|
||
This has been removed in favour of changing the default command or default shell in tmux directly.
|
||
'')
|
||
];
|
||
|
||
options = {
|
||
environment.profiles = mkOption {
|
||
type = types.listOf types.str;
|
||
description = "A list of profiles used to setup the global environment.";
|
||
};
|
||
|
||
environment.darwinConfig = mkOption {
|
||
type = types.nullOr (types.either types.path types.str);
|
||
default =
|
||
if config.nixpkgs.flake.setNixPath then
|
||
# Don’t set this for flake‐based systems.
|
||
null
|
||
else if config.system.stateVersion >= 6 then
|
||
"/etc/nix-darwin/configuration.nix"
|
||
else
|
||
"${config.system.primaryUserHome}/.nixpkgs/darwin-configuration.nix";
|
||
defaultText = literalExpression ''
|
||
if config.nixpkgs.flake.setNixPath then
|
||
# Don’t set this for flake‐based systems.
|
||
null
|
||
else if config.system.stateVersion >= 6 then
|
||
"/etc/nix-darwin/configuration.nix"
|
||
else
|
||
"''${config.system.primaryUserHome}/.nixpkgs/darwin-configuration.nix"
|
||
'';
|
||
description = ''
|
||
The path of the darwin configuration.nix used to configure the system,
|
||
this updates the default darwin-config entry in NIX_PATH. Since this
|
||
changes an environment variable it will only apply to new shells.
|
||
|
||
NOTE: Changing this requires running {command}`darwin-rebuild switch -I darwin-config=/path/to/configuration.nix`
|
||
the first time to make darwin-rebuild aware of the custom location.
|
||
'';
|
||
};
|
||
|
||
environment.variables = mkOption {
|
||
type = types.attrsOf (types.either types.str (types.listOf types.str));
|
||
default = {};
|
||
example = { EDITOR = "vim"; LANG = "nl_NL.UTF-8"; };
|
||
description = ''
|
||
A set of environment variables used in the global environment.
|
||
These variables will be set on shell initialisation.
|
||
The value of each variable can be either a string or a list of
|
||
strings. The latter is concatenated, interspersed with colon
|
||
characters.
|
||
'';
|
||
apply = mapAttrs (n: v: if isList v then concatStringsSep ":" v else v);
|
||
};
|
||
|
||
environment.shellAliases = mkOption {
|
||
type = types.attrsOf types.str;
|
||
default = {};
|
||
example = { ll = "ls -l"; };
|
||
description = ''
|
||
An attribute set that maps aliases (the top level attribute names in
|
||
this option) to command strings or directly to build outputs. The
|
||
alises are added to all users' shells.
|
||
'';
|
||
};
|
||
|
||
environment.extraInit = mkOption {
|
||
type = types.lines;
|
||
default = "";
|
||
description = ''
|
||
Shell script code called during global environment initialisation
|
||
after all variables and profileVariables have been set.
|
||
This code is asumed to be shell-independent, which means you should
|
||
stick to pure sh without sh word split.
|
||
'';
|
||
};
|
||
|
||
environment.shellInit = mkOption {
|
||
default = "";
|
||
description = ''
|
||
Shell script code called during shell initialisation.
|
||
This code is asumed to be shell-independent, which means you should
|
||
stick to pure sh without sh word split.
|
||
'';
|
||
type = types.lines;
|
||
};
|
||
|
||
environment.loginShellInit = mkOption {
|
||
default = "";
|
||
description = ''
|
||
Shell script code called during login shell initialisation.
|
||
This code is asumed to be shell-independent, which means you should
|
||
stick to pure sh without sh word split.
|
||
'';
|
||
type = types.lines;
|
||
};
|
||
|
||
environment.interactiveShellInit = mkOption {
|
||
default = "";
|
||
description = ''
|
||
Shell script code called during interactive shell initialisation.
|
||
This code is asumed to be shell-independent, which means you should
|
||
stick to pure sh without sh word split.
|
||
'';
|
||
type = types.lines;
|
||
};
|
||
};
|
||
|
||
config = {
|
||
|
||
# This is horrible, sorry.
|
||
system.requiresPrimaryUser = mkIf (
|
||
config.nix.enable
|
||
&& !config.nixpkgs.flake.setNixPath
|
||
&& config.system.stateVersion < 6
|
||
&& options.environment.darwinConfig.highestPrio == (mkOptionDefault {}).priority
|
||
) [
|
||
"environment.darwinConfig"
|
||
];
|
||
|
||
environment.systemPath = mkMerge [
|
||
[ (makeBinPath cfg.profiles) ]
|
||
(mkOrder 1200 [ "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin" ])
|
||
];
|
||
|
||
# Use user, default and system profiles.
|
||
environment.profiles = mkMerge [
|
||
(mkOrder 800 [ "$HOME/.nix-profile" ])
|
||
[ "/run/current-system/sw" "/nix/var/nix/profiles/default" ]
|
||
];
|
||
|
||
environment.extraInit = ''
|
||
export NIX_USER_PROFILE_DIR="/nix/var/nix/profiles/per-user/$USER"
|
||
export NIX_PROFILES="${concatStringsSep " " (reverseList cfg.profiles)}"
|
||
'';
|
||
|
||
environment.variables =
|
||
{
|
||
XDG_CONFIG_DIRS = map (path: path + "/etc/xdg") cfg.profiles;
|
||
XDG_DATA_DIRS = map (path: path + "/share") cfg.profiles;
|
||
EDITOR = mkDefault "nano";
|
||
PAGER = mkDefault "less -R";
|
||
};
|
||
|
||
system.build.setEnvironment = pkgs.writeText "set-environment" ''
|
||
# Prevent this file from being sourced by child shells.
|
||
export __NIX_DARWIN_SET_ENVIRONMENT_DONE=1
|
||
|
||
export PATH=${config.environment.systemPath}
|
||
${concatStringsSep "\n" exportVariables}
|
||
|
||
# Extra initialisation
|
||
${cfg.extraInit}
|
||
'';
|
||
|
||
system.build.setAliases = pkgs.writeText "set-aliases" ''
|
||
${concatStringsSep "\n" aliasCommands}
|
||
'';
|
||
};
|
||
}
|