{ 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.`."); }; 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; }; }