nixcfg/modules/nixos/user/default.nix

169 lines
4.5 KiB
Nix
Raw Normal View History

2024-01-11 11:26:46 +01:00
{ options
, config
, pkgs
, lib
, ...
}:
with lib;
with lib.plusultra; let
cfg = config.plusultra.user;
defaultIconFileName = "profile.png";
defaultIcon = pkgs.stdenvNoCC.mkDerivation {
name = "default-icon";
src = ./. + "/${defaultIconFileName}";
dontUnpack = true;
installPhase = ''
cp $src $out
'';
passthru = { fileName = defaultIconFileName; };
};
propagatedIcon =
pkgs.runCommandNoCC "propagated-icon"
{ passthru = { fileName = cfg.icon.fileName; }; }
''
local target="$out/share/plusultra-icons/user/${cfg.name}"
mkdir -p "$target"
cp ${cfg.icon} "$target/${cfg.icon.fileName}"
'';
in
{
options.plusultra.user = with types; {
name = mkOpt str "short" "The name to use for the user account.";
fullName = mkOpt str "Jake Hamilton" "The full name of the user.";
email = mkOpt str "jake.hamilton@hey.com" "The email of the user.";
initialPassword =
mkOpt str "password"
"The initial password to use when the user is first created.";
icon =
mkOpt (nullOr package) defaultIcon
"The profile picture to use for the user.";
prompt-init = mkBoolOpt true "Whether or not to show an initial message when opening a new shell.";
extraGroups = mkOpt (listOf str) [ ] "Groups for the user to be assigned.";
extraOptions =
mkOpt attrs { }
(mdDoc "Extra options passed to `users.users.<name>`.");
};
config = {
environment.systemPackages = with pkgs; [
cowsay
fortune
lolcat
plusultra.cowsay-plus
propagatedIcon
];
programs.zsh = {
enable = true;
autosuggestions.enable = true;
histFile = "$XDG_CACHE_HOME/zsh.history";
};
plusultra.home = {
file = {
"Desktop/.keep".text = "";
"Documents/.keep".text = "";
"Downloads/.keep".text = "";
"Music/.keep".text = "";
"Pictures/.keep".text = "";
"Videos/.keep".text = "";
"work/.keep".text = "";
".face".source = cfg.icon;
"Pictures/${
cfg.icon.fileName or (builtins.baseNameOf cfg.icon)
}".source =
cfg.icon;
};
extraOptions = {
home.shellAliases = {
lc = "${pkgs.colorls}/bin/colorls --sd";
lcg = "lc --gs";
lcl = "lc -1";
lclg = "lc -1 --gs";
lcu = "${pkgs.colorls}/bin/colorls -U";
lclu = "${pkgs.colorls}/bin/colorls -U -1";
};
programs = {
starship = {
enable = true;
settings = {
character = {
success_symbol = "[](bold green)";
error_symbol = "[](bold red) ";
vicmd_symbol = "[](bold blue) ";
};
};
};
zsh = {
enable = true;
enableCompletion = true;
enableAutosuggestions = true;
syntaxHighlighting.enable = true;
initExtra =
''
# Fix an issue with tmux.
export KEYTIMEOUT=1
# Use vim bindings.
set -o vi
# Improved vim bindings.
source ${pkgs.zsh-vi-mode}/share/zsh-vi-mode/zsh-vi-mode.plugin.zsh
''
+ optionalString cfg.prompt-init ''
${pkgs.toilet}/bin/toilet -f future "Plus Ultra" --gay
'';
shellAliases = {
say = "${pkgs.toilet}/bin/toilet -f pagga";
};
plugins = [
{
name = "zsh-nix-shell";
file = "nix-shell.plugin.zsh";
src = pkgs.fetchFromGitHub {
owner = "chisui";
repo = "zsh-nix-shell";
rev = "v0.4.0";
sha256 = "037wz9fqmx0ngcwl9az55fgkipb745rymznxnssr3rx9irb6apzg";
};
}
];
};
};
};
};
users.users.${cfg.name} =
{
isNormalUser = true;
inherit (cfg) name initialPassword;
home = "/home/${cfg.name}";
group = "users";
shell = pkgs.zsh;
# Arbitrary user ID to use for the user. Since I only
# have a single user on my machines this won't ever collide.
# However, if you add multiple users you'll need to change this
# so each user has their own unique uid (or leave it out for the
# system to select).
uid = 1000;
extraGroups = [ ] ++ cfg.extraGroups;
}
// cfg.extraOptions;
};
}