# Global config { config, lib, pkgs, ... }: with lib; with types; 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; }; }; }; themeType = 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; }; }; }; 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 = [ ./kak ./gui ./fonts.nix ./git.nix ./ssh.nix ]; config = { riley.theme = (import ../colors.nix)."dark"; time.timeZone = "Europe/Amsterdam"; environment.systemPackages = with pkgs; [ # Web utils wget curl git # Coreutils ripgrep bottom skim exa bat lf fd ]; environment.shellAliases = { # Born to VIM ":q" = "exit"; # Launch [A]lacritty "a" = "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; }; cleanTmpDir = true; }; networking = { firewall.enable = false; useDHCP = false; }; nixpkgs.config.allowUnfree = true; security.rtkit.enable = true; users.users."riley" = { isNormalUser = true; extraGroups = [ "wheel" ]; # Enable ‘sudo’ for the user. }; }; }