# Modules used by most systems. { config, lib, pkgs, home-manager, ... }: with lib; with types; let themeType = let named = submodule { options = { normal = mkOption { type = str; }; bright = mkOption { type = str; }; pastel = mkOption { type = str; }; }; }; special = submodule { options = { primary = mkOption { type = str; }; normal = mkOption { type = str; }; slight = mkOption { type = str; }; }; }; in submodule { options = { foreground = mkOption { type = special; }; background = mkOption { type = special; }; grayscales = mkOption { type = listOf str; }; red = mkOption { type = named; }; green = mkOption { type = named; }; blue = mkOption { type = named; }; yellow = mkOption { type = named; }; purple = mkOption { type = named; }; cyan = mkOption { type = named; }; pink = mkOption { type = named; }; orange = mkOption { type = named; }; misc = mkOption { type = attrsOf str; }; hex = mkOption { type = themeType; }; }; }; utils = import ../env.nix { inherit pkgs; }; in { options.riley = with lib; { theme = mkOption { type = themeType; description = '' The theme used across the installation. Not used if gui is disabled. ''; }; }; options.devices = mkOption { type = with types; submodule { options = { audio = mkOption { type = nullOr (submodule { options = { speakers = mkOption { type = str; }; external = mkOption { type = str; }; headset = mkOption { type = nullOr str; }; main-mic = mkOption { type = nullOr str; }; }; }); description = '' Known audio devices: outputs & microphones. Each string should be a pulseaudio sink or source. ''; }; video = mkOption { type = submodule { options = { displays = let output = submodule { options = { primary = mkOption { type = bool; default = false; }; position = mkOption { type = nullOr (listOf int); default = null; }; rotate = mkOption { type = enum [ "normal" "left" "right" "inverted" ]; default = "normal"; }; }; }; in mkOption { type = attrsOf output; description = '' A list of outputs with information on how to place them. ''; }; }; }; description = '' Define the video devices (just the displays, for now). ''; }; }; }; }; imports = [ home-manager.nixosModule ./kak ./gui ./fonts.nix ./git.nix ./ssh.nix ]; config = { riley.theme = (import ../colors.nix)."dark"; time.timeZone = "Europe/Amsterdam"; home-manager.useGlobalPkgs = true; home-manager.useUserPackages = true; environment.systemPackages = with pkgs; [ # Web utils wget curl git # Common utils (rg, sk, fd, etc.) utils ]; environment.shellAliases = { # Born to VIM ":q" = "exit"; # Sike I use kakoune ":e" = "kak"; # Launch [T]erminal "t" = "alacritty"; # [D]isown "d" = "disown"; }; programs.bash.interactiveShellInit = '' # [G]o to the directory. Create the directory if it does not exist # yet, and if the directory contains a shell.nix file, source it. g () { [ -d "$1" ] || mkdir -p "$1"; cd "$1"; [ -e "shell.nix" ] && nix-shell; } # [M]ake a directory and immediately enter it. m () { mkdir -p "$1" && cd "$1"; } # [R]eplace the current process with the given one. r () { $1 & disown; exit; } # [J]ump to the directory by means of fuzzy search. If the fuzzy finder # is aborted, the jump is also aborted. j () { t=`sk` && cd $t; } # Enter a temporary [d]irectory. d () { cd "$(mktemp -d)"; } ''; boot = { loader.systemd-boot = { enable = true; editor = false; configurationLimit = 10; }; loader.efi = { canTouchEfiVariables = true; }; }; networking = { firewall.enable = false; useDHCP = false; }; security.rtkit.enable = true; users.users."riley" = { isNormalUser = true; extraGroups = [ "wheel" ]; # Enable ‘sudo’ for the user. }; }; }