From d2789aad7ee449fba604f6f1dcc8486936f72e4c Mon Sep 17 00:00:00 2001 From: Alex Maldonado Date: Mon, 3 Aug 2026 10:30:48 -0400 Subject: [PATCH] feat: cleanup configs --- .envrc | 1 + README.md | 135 +++++++++++++ flake.nix | 164 ++++++++++------ home/alex/default.nix | 39 ++-- home/alex/gh.nix | 6 +- home/alex/git.nix | 5 +- home/modules/datalad.nix | 1 - home/modules/direnv.nix | 6 + home/modules/dropbox.nix | 8 +- home/modules/ghostty.nix | 322 +++++++++++++++++++++++++------ home/modules/gimp.nix | 1 - home/modules/helix.nix | 33 +++- home/modules/hyperfine.nix | 1 - home/modules/masterpdfeditor.nix | 1 - home/modules/pixi.nix | 2 +- home/modules/plasma.nix | 55 ++++-- home/modules/python.nix | 1 - home/modules/rust.nix | 1 - home/modules/shell-tools.nix | 14 ++ home/modules/ssh.nix | 6 +- home/modules/starship.nix | 4 +- home/modules/typst.nix | 1 - home/modules/vscode.nix | 62 +++--- home/modules/yazi.nix | 85 ++++++-- home/modules/zellij.nix | 3 +- home/modules/zig.nix | 1 - home/modules/zoom.nix | 1 - home/modules/zsh.nix | 10 +- hosts/oreo/default.nix | 5 +- hosts/oreo/hardware.nix | 49 +++-- hosts/seasoned/default.nix | 3 +- hosts/whitegrizzly/default.nix | 5 +- hosts/whitegrizzly/hardware.nix | 48 +++-- justfile | 17 ++ modules/core.nix | 5 +- modules/darwin.nix | 1 - modules/docker.nix | 3 +- modules/nvidia.nix | 51 +++-- modules/plasma.nix | 2 +- modules/security.nix | 2 +- 40 files changed, 870 insertions(+), 290 deletions(-) create mode 100644 .envrc create mode 100644 home/modules/direnv.nix create mode 100644 home/modules/shell-tools.nix diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..3550a30 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake diff --git a/README.md b/README.md index a7663b7..288fb0f 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,141 @@ notfiles/ | [`nix4vscode`][nix4vscode] | VSCode/VSCodium extension management | | [`globalprotect-openconnect`][globalprotect-openconnect] | VPN client | +## Tasks + +[`just`][just] runs the routine tasks in this repo. Run it with no arguments to list every recipe: + +``` +just +``` + +Most recipes act on a single host. +The `host` variable resolves on its own: macOS reads `scutil --get LocalHostName`, Linux uses `hostname`. +That value has to match a key under `nixosConfigurations` or `darwinConfigurations` in `flake.nix`. +To act on a different machine, override it: + +``` +just host=whitegrizzly rebuild +``` + +`rebuild`, `clean`, and `diff` choose `darwin-rebuild` or `nixos-rebuild` from the current OS, so one command covers every machine. + +Three recipes (`fmt`, `lint`, `diff`) use tools that live in the flake's dev shell rather than a host profile. +With direnv the shell loads on entry to the repo (see [Dev shell](#dev-shell)); without it, prefix the command, for example `nix develop -c just lint`. + +| Recipe | What it does | +| :----- | :----------- | +| `rebuild` | Build the current host's config and switch to it now | +| `diff` | Build the current host's config and show what would change, without switching | +| `update` | Update `flake.lock` to the latest inputs | +| `clean` | Delete generations older than 7 days, optimize the store, stage the result for next boot | +| `fmt` | Format every `.nix` file with `nixfmt` | +| `lint` | Run `statix` and `deadnix` over the tree | +| `gen-keys` | Generate Ed25519 SSH keys for the named services | +| `fetch-iso` | Download the latest NixOS installer ISO into `iso/` | +| `make-usb` | Write a bootable installer USB | +| `register-host` | Scaffold `hosts//` and add a `flake.nix` entry | +| `capture-hardware` | Write the current machine's `hardware.nix` | +| `hosts` | List the hosts registered in `flake.nix` | +| `docker-creds` | Seed `~/.docker/config.json` and set up a credential store | + +## Dev shell + +Editing the repo (as opposed to running it) calls for a formatter, two linters, and a pair of inspectors: `nixfmt`, `statix`, `deadnix`, `nvd`, and `nix-tree`. +They live in `devShells.default` in `flake.nix`, deliberately outside every host's system profile, so they show up only while you work on this repo. + +A repo-root `.envrc` containing `use flake` loads the shell through [direnv] on entry and drops it on exit. +Run `direnv allow` once after cloning. +Without direnv, enter it by hand: + +``` +nix develop +``` + +Either path puts `just fmt`, `just lint`, and `just diff` in reach. + +## Common workflows + +### The edit loop + +Change a module, preview the effect, then switch: + +``` +$EDITOR home/modules/helix.nix +just diff +just rebuild +``` + +`just diff` builds the target system to `/tmp/notfiles-next` and runs `nvd diff` against the running one, so the added, removed, and upgraded packages are visible before anything changes. +The switch happens only at `just rebuild`. + +Before committing, format and lint: + +``` +just fmt +just lint +``` + +`lint` exits nonzero when `statix` or `deadnix` find something, which makes it a usable pre-commit or CI gate. +The first run on an established config tends to surface unused bindings and a few anti-patterns; clear them once and later runs go quiet. + +### Staying current + +``` +just update +just diff +just rebuild +``` + +`just update` refreshes every flake input. +Read the changes with `just diff` before switching. +Reclaim disk now and then: + +``` +just clean +``` + +`clean` drops generations older than a week, deduplicates the store, and stages the rebuilt system for the next boot (a plain `switch` on macOS). + +### Adding a machine + +Register the host from any checkout, then capture hardware on the machine itself: + +``` +just register-host blackbear # scaffolds hosts/blackbear/, edits flake.nix +# then, on blackbear: +just capture-hardware blackbear # writes hosts/blackbear/hardware.nix +just host=blackbear rebuild +``` + +`just hosts` shows what is already registered. + +### Building install media + +For a fresh NixOS box, fetch an installer image and write it to a USB stick: + +``` +just fetch-iso +just make-usb --iso iso/latest-nixos-graphical-x86_64-linux.iso +``` + +`fetch-iso` accepts channel and edition overrides, for example `just fetch-iso --channel nixos-unstable --edition minimal`. +`make-usb` self-elevates with sudo when it needs to. + +### Keys and credentials + +Generate signing and auth keys, then seed Docker's credential store: + +``` +just gen-keys +just docker-creds +``` + +`gen-keys` writes one Ed25519 key per service and defaults to the set this repo expects (GitHub, Gradescope, the HPC clusters, and the two Git signing keys). +`docker-creds` defaults to a `pass`-backed store and sets up the GPG key behind it; pass `secretservice` to use the desktop keyring instead. + +[just]: https://github.com/casey/just +[direnv]: https://direnv.net/ [nixpkgs]: https://github.com/NixOS/nixpkgs [home-manager]: https://github.com/nix-community/home-manager [plasma-manager]: https://github.com/nix-community/plasma-manager diff --git a/flake.nix b/flake.nix index 92a25b0..44bb4eb 100644 --- a/flake.nix +++ b/flake.nix @@ -34,66 +34,112 @@ }; }; - outputs = { self, nixpkgs, home-manager, nix-darwin, globalprotect-openconnect, ... }@inputs: - let - linuxSystem = "x86_64-linux"; + outputs = + { + self, + nixpkgs, + home-manager, + nix-darwin, + globalprotect-openconnect, + ... + }@inputs: + let + linuxSystem = "x86_64-linux"; - # Home Manager wiring shared by the NixOS (Linux) hosts. - # plasma-manager is Linux-only, so it lives here rather than in the - # darwin block below. - nixosHome = { - home-manager = { - useGlobalPkgs = true; - useUserPackages = true; - backupFileExtension = "backup"; - users.alex = import ./home/alex; - extraSpecialArgs = { inherit inputs; isDarwin = false; }; - sharedModules = [ inputs.plasma-manager.homeModules.plasma-manager ]; + # Systems this repo is edited/built on: the Linux hosts and the mac. + # devShells are produced for each so `direnv`/`nix develop` works on all. + systems = [ + "x86_64-linux" + "aarch64-darwin" + ]; + forAllSystems = nixpkgs.lib.genAttrs systems; + + # Home Manager wiring shared by the NixOS (Linux) hosts. + # plasma-manager is Linux-only, so it lives here rather than in the + # darwin block below. + nixosHome = { + home-manager = { + useGlobalPkgs = true; + useUserPackages = true; + backupFileExtension = "backup"; + users.alex = import ./home/alex; + extraSpecialArgs = { + inherit inputs; + isDarwin = false; + }; + sharedModules = [ inputs.plasma-manager.homeModules.plasma-manager ]; + }; }; + in + { + nixosConfigurations = { + + # To add a new Linux machine, duplicate this block and change the name. + whitegrizzly = nixpkgs.lib.nixosSystem { + system = linuxSystem; + specialArgs = { inherit inputs; }; + modules = [ + ./hosts/whitegrizzly + home-manager.nixosModules.home-manager + nixosHome + ]; + }; + + oreo = nixpkgs.lib.nixosSystem { + system = linuxSystem; + specialArgs = { inherit inputs; }; + modules = [ + ./hosts/oreo + home-manager.nixosModules.home-manager + nixosHome + ]; + }; + }; + + darwinConfigurations = { + + seasoned = nix-darwin.lib.darwinSystem { + specialArgs = { inherit inputs; }; + modules = [ + ./hosts/seasoned + home-manager.darwinModules.home-manager + { + home-manager = { + useGlobalPkgs = true; + useUserPackages = true; + backupFileExtension = "backup"; + users.alex = import ./home/alex; + extraSpecialArgs = { + inherit inputs; + isDarwin = true; + }; + }; + } + ]; + }; + }; + + # Maintenance shell for working on this repo: formatter, linters, and + # generation/closure inspectors. Kept out of every host's global profile + # and auto-loaded by direnv via the repo-root .envrc (`use flake`). + devShells = forAllSystems ( + system: + let + pkgs = nixpkgs.legacyPackages.${system}; + in + { + default = pkgs.mkShellNoCC { + name = "notfiles-dev"; + packages = with pkgs; [ + nixfmt # RFC 166 formatter + statix # lint / anti-pattern detection + deadnix # find unused (dead) bindings + nvd # diff two system generations / profiles + nix-tree # interactively explore a closure + nix-output-monitor # `nom` — readable build output + ]; + }; + } + ); }; - in { - nixosConfigurations = { - - # To add a new Linux machine, duplicate this block and change the name. - whitegrizzly = nixpkgs.lib.nixosSystem { - system = linuxSystem; - specialArgs = { inherit inputs; }; - modules = [ - ./hosts/whitegrizzly - home-manager.nixosModules.home-manager - nixosHome - ]; - }; - - oreo = nixpkgs.lib.nixosSystem { - system = linuxSystem; - specialArgs = { inherit inputs; }; - modules = [ - ./hosts/oreo - home-manager.nixosModules.home-manager - nixosHome - ]; - }; - }; - - darwinConfigurations = { - - seasoned = nix-darwin.lib.darwinSystem { - specialArgs = { inherit inputs; }; - modules = [ - ./hosts/seasoned - home-manager.darwinModules.home-manager - { - home-manager = { - useGlobalPkgs = true; - useUserPackages = true; - backupFileExtension = "backup"; - users.alex = import ./home/alex; - extraSpecialArgs = { inherit inputs; isDarwin = true; }; - }; - } - ]; - }; - }; - }; } diff --git a/home/alex/default.nix b/home/alex/default.nix index bbb2ef6..4943ea0 100644 --- a/home/alex/default.nix +++ b/home/alex/default.nix @@ -1,4 +1,9 @@ -{ pkgs, lib, isDarwin, ... }: +{ + pkgs, + lib, + isDarwin, + ... +}: let # Modules that only make sense on Linux, either because they use systemd, @@ -23,6 +28,7 @@ in imports = [ ../modules/datalad.nix + ../modules/direnv.nix ../modules/docker.nix ../modules/fonts.nix ../modules/ghostty.nix @@ -31,6 +37,7 @@ in ../modules/pixi.nix ../modules/python.nix ../modules/rust.nix + ../modules/shell-tools.nix ../modules/ssh.nix ../modules/starship.nix ../modules/typst.nix @@ -41,18 +48,22 @@ in ../modules/zsh.nix ./git.nix ./gh.nix - ] ++ linuxOnly; + ] + ++ linuxOnly; - home.packages = with pkgs; [ - atool - httpie - just - git-lfs - typst - unzip - glow - ] ++ lib.optionals (!isDarwin) [ - spotify - brave - ]; + home.packages = + with pkgs; + [ + atool + httpie + just + git-lfs + typst + unzip + glow + ] + ++ lib.optionals (!isDarwin) [ + spotify + brave + ]; } diff --git a/home/alex/gh.nix b/home/alex/gh.nix index 47029c4..4f9885a 100644 --- a/home/alex/gh.nix +++ b/home/alex/gh.nix @@ -1,6 +1,4 @@ -{ ... }: - -{ +_: { programs.gh = { enable = true; settings = { @@ -9,7 +7,7 @@ editor = "hx"; prompt = "enabled"; prefer_editor_prompt = "disabled"; - browser = ""; + browser = ""; pager = ""; aliases = { co = "pr checkout"; diff --git a/home/alex/git.nix b/home/alex/git.nix index f133b5e..4d9f354 100644 --- a/home/alex/git.nix +++ b/home/alex/git.nix @@ -1,6 +1,9 @@ { pkgs, ... }: { - home.packages = [ pkgs.delta pkgs.git-annex ]; + home.packages = [ + pkgs.delta + pkgs.git-annex + ]; programs.git = { enable = true; signing = { diff --git a/home/modules/datalad.nix b/home/modules/datalad.nix index f47ccb8..5095e17 100644 --- a/home/modules/datalad.nix +++ b/home/modules/datalad.nix @@ -4,4 +4,3 @@ datalad ]; } - diff --git a/home/modules/direnv.nix b/home/modules/direnv.nix new file mode 100644 index 0000000..37f6d99 --- /dev/null +++ b/home/modules/direnv.nix @@ -0,0 +1,6 @@ +_: { + programs.direnv = { + enable = true; + nix-direnv.enable = true; + }; +} diff --git a/home/modules/dropbox.nix b/home/modules/dropbox.nix index fee7613..0c78c5a 100644 --- a/home/modules/dropbox.nix +++ b/home/modules/dropbox.nix @@ -5,14 +5,14 @@ systemd.user.services.dropbox = { Unit = { - Description = "Dropbox service"; + Description = "Dropbox service"; }; Install = { - WantedBy = [ "default.target" ]; + WantedBy = [ "default.target" ]; }; Service = { - ExecStart = "${pkgs.dropbox}/bin/dropbox"; - Restart = "on-failure"; + ExecStart = "${pkgs.dropbox}/bin/dropbox"; + Restart = "on-failure"; }; }; } diff --git a/home/modules/ghostty.nix b/home/modules/ghostty.nix index 85a0e47..79a6133 100644 --- a/home/modules/ghostty.nix +++ b/home/modules/ghostty.nix @@ -1,4 +1,9 @@ -{ pkgs, lib, isDarwin, ... }: +{ + pkgs, + lib, + isDarwin, + ... +}: let baseKeybinds = [ "ctrl+t=new_tab" @@ -18,7 +23,7 @@ in enable = true; # nixpkgs `ghostty` is the Linux/GTK build (Linux-only meta.platforms). # On macOS use `ghostty-bin`, the repackaged official .dmg. - package = if isDarwin then pkgs.ghostty-bin else pkgs.ghostty; + package = if isDarwin then pkgs.ghostty-bin else pkgs.ghostty; settings = { # Font Settings @@ -31,58 +36,261 @@ in "foreground" = "#abb2bf"; "cursor-style" = "block"; "palette" = [ - "0=#282c34" "1=#e06c75" "2=#98c379" "3=#e5c07b" - "4=#61afef" "5=#c678dd" "6=#56b6c2" "7=#abb2bf" - "8=#5c6370" "9=#e06c75" "10=#98c379" "11=#e5c07b" - "12=#61afef" "13=#c678dd" "14=#56b6c2" "15=#ffffff" - "16=#000000" "17=#00005f" "18=#000087" "19=#0000af" - "20=#0000d7" "21=#0000ff" "22=#005f00" "23=#005f5f" "24=#005f87" - "25=#005faf" "26=#005fd7" "27=#005fff" "28=#008700" "29=#00875f" - "30=#008787" "31=#0087af" "32=#0087d7" "33=#0087ff" "34=#00af00" - "35=#00af5f" "36=#00af87" "37=#00afaf" "38=#00afd7" "39=#00afff" - "40=#00d700" "41=#00d75f" "42=#00d787" "43=#00d7af" "44=#00d7d7" - "45=#00d7ff" "46=#00ff00" "47=#00ff5f" "48=#00ff87" "49=#00ffaf" - "50=#00ffd7" "51=#00ffff" "52=#5f0000" "53=#5f005f" "54=#5f0087" - "55=#5f00af" "56=#5f00d7" "57=#5f00ff" "58=#5f5f00" "59=#5f5f5f" - "60=#5f5f87" "61=#5f5faf" "62=#5f5fd7" "63=#5f5fff" "64=#5f8700" - "65=#5f875f" "66=#5f8787" "67=#5f87af" "68=#5f87d7" "69=#5f87ff" - "70=#5faf00" "71=#5faf5f" "72=#5faf87" "73=#5fafaf" "74=#5fafd7" - "75=#5fafff" "76=#5fd700" "77=#5fd75f" "78=#5fd787" "79=#5fd7af" - "80=#5fd7d7" "81=#5fd7ff" "82=#5fff00" "83=#5fff5f" "84=#5fff87" - "85=#5fffaf" "86=#5fffd7" "87=#5fffff" "88=#870000" "89=#87005f" - "90=#870087" "91=#8700af" "92=#8700d7" "93=#8700ff" "94=#875f00" - "95=#875f5f" "96=#875f87" "97=#875faf" "98=#875fd7" "99=#875fff" - "100=#878700" "101=#87875f" "102=#878787" "103=#8787af" "104=#8787d7" - "105=#8787ff" "106=#87af00" "107=#87af5f" "108=#87af87" "109=#87afaf" - "110=#87afd7" "111=#87afff" "112=#87d700" "113=#87d75f" "114=#87d787" - "115=#87d7af" "116=#87d7d7" "117=#87d7ff" "118=#87ff00" "119=#87ff5f" - "120=#87ff87" "121=#87ffaf" "122=#87ffd7" "123=#87ffff" "124=#af0000" - "125=#af005f" "126=#af0087" "127=#af00af" "128=#af00d7" "129=#af00ff" - "130=#af5f00" "131=#af5f5f" "132=#af5f87" "133=#af5faf" "134=#af5fd7" - "135=#af5fff" "136=#af8700" "137=#af875f" "138=#af8787" "139=#af87af" - "140=#af87d7" "141=#af87ff" "142=#afaf00" "143=#afaf5f" "144=#afaf87" - "145=#afafaf" "146=#afafd7" "147=#afafff" "148=#afd700" "149=#afd75f" - "150=#afd787" "151=#afd7af" "152=#afd7d7" "153=#afd7ff" "154=#afff00" - "155=#afff5f" "156=#afff87" "157=#afffaf" "158=#afffd7" "159=#afffff" - "160=#d70000" "161=#d7005f" "162=#d70087" "163=#d700af" "164=#d700d7" - "165=#d700ff" "166=#d75f00" "167=#d75f5f" "168=#d75f87" "169=#d75faf" - "170=#d75fd7" "171=#d75fff" "172=#d78700" "173=#d7875f" "174=#d78787" - "175=#d787af" "176=#d787d7" "177=#d787ff" "178=#d7af00" "179=#d7af5f" - "180=#d7af87" "181=#d7afaf" "182=#d7afd7" "183=#d7afff" "184=#d7d700" - "185=#d7d75f" "186=#d7d787" "187=#d7d7af" "188=#d7d7d7" "189=#d7d7ff" - "190=#d7ff00" "191=#d7ff5f" "192=#d7ff87" "193=#d7ffaf" "194=#d7ffd7" - "195=#d7ffff" "196=#ff0000" "197=#ff005f" "198=#ff0087" "199=#ff00af" - "200=#ff00d7" "201=#ff00ff" "202=#ff5f00" "203=#ff5f5f" "204=#ff5f87" - "205=#ff5faf" "206=#ff5fd7" "207=#ff5fff" "208=#ff8700" "209=#ff875f" - "210=#ff8787" "211=#ff87af" "212=#ff87d7" "213=#ff87ff" "214=#ffaf00" - "215=#ffaf5f" "216=#ffaf87" "217=#ffafaf" "218=#ffafd7" "219=#ffafff" - "220=#ffd700" "221=#ffd75f" "222=#ffd787" "223=#ffd7af" "224=#ffd7d7" - "225=#ffd7ff" "226=#ffff00" "227=#ffff5f" "228=#ffff87" "229=#ffffaf" - "230=#ffffd7" "231=#ffffff" "232=#080808" "233=#121212" "234=#1c1c1c" - "235=#262626" "236=#303030" "237=#3a3a3a" "238=#444444" "239=#4e4e4e" - "240=#585858" "241=#626262" "242=#6c6c6c" "243=#767676" "244=#808080" - "245=#8a8a8a" "246=#949494" "247=#9e9e9e" "248=#a8a8a8" "249=#b2b2b2" - "250=#bcbcbc" "251=#c6c6c6" "252=#d0d0d0" "253=#dadada" "254=#e4e4e4" + "0=#282c34" + "1=#e06c75" + "2=#98c379" + "3=#e5c07b" + "4=#61afef" + "5=#c678dd" + "6=#56b6c2" + "7=#abb2bf" + "8=#5c6370" + "9=#e06c75" + "10=#98c379" + "11=#e5c07b" + "12=#61afef" + "13=#c678dd" + "14=#56b6c2" + "15=#ffffff" + "16=#000000" + "17=#00005f" + "18=#000087" + "19=#0000af" + "20=#0000d7" + "21=#0000ff" + "22=#005f00" + "23=#005f5f" + "24=#005f87" + "25=#005faf" + "26=#005fd7" + "27=#005fff" + "28=#008700" + "29=#00875f" + "30=#008787" + "31=#0087af" + "32=#0087d7" + "33=#0087ff" + "34=#00af00" + "35=#00af5f" + "36=#00af87" + "37=#00afaf" + "38=#00afd7" + "39=#00afff" + "40=#00d700" + "41=#00d75f" + "42=#00d787" + "43=#00d7af" + "44=#00d7d7" + "45=#00d7ff" + "46=#00ff00" + "47=#00ff5f" + "48=#00ff87" + "49=#00ffaf" + "50=#00ffd7" + "51=#00ffff" + "52=#5f0000" + "53=#5f005f" + "54=#5f0087" + "55=#5f00af" + "56=#5f00d7" + "57=#5f00ff" + "58=#5f5f00" + "59=#5f5f5f" + "60=#5f5f87" + "61=#5f5faf" + "62=#5f5fd7" + "63=#5f5fff" + "64=#5f8700" + "65=#5f875f" + "66=#5f8787" + "67=#5f87af" + "68=#5f87d7" + "69=#5f87ff" + "70=#5faf00" + "71=#5faf5f" + "72=#5faf87" + "73=#5fafaf" + "74=#5fafd7" + "75=#5fafff" + "76=#5fd700" + "77=#5fd75f" + "78=#5fd787" + "79=#5fd7af" + "80=#5fd7d7" + "81=#5fd7ff" + "82=#5fff00" + "83=#5fff5f" + "84=#5fff87" + "85=#5fffaf" + "86=#5fffd7" + "87=#5fffff" + "88=#870000" + "89=#87005f" + "90=#870087" + "91=#8700af" + "92=#8700d7" + "93=#8700ff" + "94=#875f00" + "95=#875f5f" + "96=#875f87" + "97=#875faf" + "98=#875fd7" + "99=#875fff" + "100=#878700" + "101=#87875f" + "102=#878787" + "103=#8787af" + "104=#8787d7" + "105=#8787ff" + "106=#87af00" + "107=#87af5f" + "108=#87af87" + "109=#87afaf" + "110=#87afd7" + "111=#87afff" + "112=#87d700" + "113=#87d75f" + "114=#87d787" + "115=#87d7af" + "116=#87d7d7" + "117=#87d7ff" + "118=#87ff00" + "119=#87ff5f" + "120=#87ff87" + "121=#87ffaf" + "122=#87ffd7" + "123=#87ffff" + "124=#af0000" + "125=#af005f" + "126=#af0087" + "127=#af00af" + "128=#af00d7" + "129=#af00ff" + "130=#af5f00" + "131=#af5f5f" + "132=#af5f87" + "133=#af5faf" + "134=#af5fd7" + "135=#af5fff" + "136=#af8700" + "137=#af875f" + "138=#af8787" + "139=#af87af" + "140=#af87d7" + "141=#af87ff" + "142=#afaf00" + "143=#afaf5f" + "144=#afaf87" + "145=#afafaf" + "146=#afafd7" + "147=#afafff" + "148=#afd700" + "149=#afd75f" + "150=#afd787" + "151=#afd7af" + "152=#afd7d7" + "153=#afd7ff" + "154=#afff00" + "155=#afff5f" + "156=#afff87" + "157=#afffaf" + "158=#afffd7" + "159=#afffff" + "160=#d70000" + "161=#d7005f" + "162=#d70087" + "163=#d700af" + "164=#d700d7" + "165=#d700ff" + "166=#d75f00" + "167=#d75f5f" + "168=#d75f87" + "169=#d75faf" + "170=#d75fd7" + "171=#d75fff" + "172=#d78700" + "173=#d7875f" + "174=#d78787" + "175=#d787af" + "176=#d787d7" + "177=#d787ff" + "178=#d7af00" + "179=#d7af5f" + "180=#d7af87" + "181=#d7afaf" + "182=#d7afd7" + "183=#d7afff" + "184=#d7d700" + "185=#d7d75f" + "186=#d7d787" + "187=#d7d7af" + "188=#d7d7d7" + "189=#d7d7ff" + "190=#d7ff00" + "191=#d7ff5f" + "192=#d7ff87" + "193=#d7ffaf" + "194=#d7ffd7" + "195=#d7ffff" + "196=#ff0000" + "197=#ff005f" + "198=#ff0087" + "199=#ff00af" + "200=#ff00d7" + "201=#ff00ff" + "202=#ff5f00" + "203=#ff5f5f" + "204=#ff5f87" + "205=#ff5faf" + "206=#ff5fd7" + "207=#ff5fff" + "208=#ff8700" + "209=#ff875f" + "210=#ff8787" + "211=#ff87af" + "212=#ff87d7" + "213=#ff87ff" + "214=#ffaf00" + "215=#ffaf5f" + "216=#ffaf87" + "217=#ffafaf" + "218=#ffafd7" + "219=#ffafff" + "220=#ffd700" + "221=#ffd75f" + "222=#ffd787" + "223=#ffd7af" + "224=#ffd7d7" + "225=#ffd7ff" + "226=#ffff00" + "227=#ffff5f" + "228=#ffff87" + "229=#ffffaf" + "230=#ffffd7" + "231=#ffffff" + "232=#080808" + "233=#121212" + "234=#1c1c1c" + "235=#262626" + "236=#303030" + "237=#3a3a3a" + "238=#444444" + "239=#4e4e4e" + "240=#585858" + "241=#626262" + "242=#6c6c6c" + "243=#767676" + "244=#808080" + "245=#8a8a8a" + "246=#949494" + "247=#9e9e9e" + "248=#a8a8a8" + "249=#b2b2b2" + "250=#bcbcbc" + "251=#c6c6c6" + "252=#d0d0d0" + "253=#dadada" + "254=#e4e4e4" "255=#eeeeee" ]; @@ -95,9 +303,9 @@ in "confirm-close-surface" = true; # Keybindings (Tabs & Splits) - "keybind" = baseKeybinds - ++ lib.optionals isDarwin [ "super+d=unbind" ]; - } // lib.optionalAttrs isDarwin { + "keybind" = baseKeybinds ++ lib.optionals isDarwin [ "super+d=unbind" ]; + } + // lib.optionalAttrs isDarwin { "macos-titlebar-style" = "transparent"; "macos-icon" = "official"; }; diff --git a/home/modules/gimp.nix b/home/modules/gimp.nix index 1170ecd..62b832a 100644 --- a/home/modules/gimp.nix +++ b/home/modules/gimp.nix @@ -4,4 +4,3 @@ gimp ]; } - diff --git a/home/modules/helix.nix b/home/modules/helix.nix index 8b70cd0..17f39e2 100644 --- a/home/modules/helix.nix +++ b/home/modules/helix.nix @@ -113,37 +113,51 @@ in }; keys.normal = { - "C-g" = [ ":new" ":insert-output lazygit" ":buffer-close!" ":redraw" ]; "d" = "delete_selection_noyank"; "A-d" = "delete_selection"; "C-y" = [ ":sh rm -f /tmp/yazi-chooser" '':insert-output yazi "%{buffer_name}" --chooser-file=/tmp/yazi-chooser'' '':sh printf '\x1b[?1049h\x1b[?2004h' > /dev/tty'' - '':open %sh{cat /tmp/yazi-chooser}'' + ":open %sh{cat /tmp/yazi-chooser}" ":redraw" ]; - } // lib.optionalAttrs pkgs.stdenv.isDarwin macKeys; + } + // lib.optionalAttrs pkgs.stdenv.isDarwin macKeys; keys.select = { - } // lib.optionalAttrs pkgs.stdenv.isDarwin macKeys; + } + // lib.optionalAttrs pkgs.stdenv.isDarwin macKeys; }; - languages = { language = [ { name = "quarto"; language-id = "markdown"; - language-servers = [ "marksman" "harper-ls" ]; + language-servers = [ + "marksman" + "harper-ls" + ]; auto-format = false; - comment-tokens = [ "-" "*" ">" ]; + comment-tokens = [ + "-" + "*" + ">" + ]; } { name = "markdown"; - language-servers = [ "marksman" "harper-ls" ]; + language-servers = [ + "marksman" + "harper-ls" + ]; auto-format = false; - comment-tokens = [ "-" "*" ">" ]; + comment-tokens = [ + "-" + "*" + ">" + ]; } ]; @@ -174,4 +188,3 @@ in ]; }; } - diff --git a/home/modules/hyperfine.nix b/home/modules/hyperfine.nix index c1176f0..f113b15 100644 --- a/home/modules/hyperfine.nix +++ b/home/modules/hyperfine.nix @@ -4,4 +4,3 @@ hyperfine ]; } - diff --git a/home/modules/masterpdfeditor.nix b/home/modules/masterpdfeditor.nix index 9de89d8..a18bcdc 100644 --- a/home/modules/masterpdfeditor.nix +++ b/home/modules/masterpdfeditor.nix @@ -4,4 +4,3 @@ masterpdfeditor ]; } - diff --git a/home/modules/pixi.nix b/home/modules/pixi.nix index 3842c56..75575db 100644 --- a/home/modules/pixi.nix +++ b/home/modules/pixi.nix @@ -3,7 +3,7 @@ home.sessionPath = [ "$HOME/.pixi/bin" ]; home.activation.pixi = { after = [ "writeBoundary" ]; - before = []; + before = [ ]; data = '' export PATH="${pkgs.curl}/bin:${pkgs.coreutils}/bin:$PATH" if ! command -v pixi &> /dev/null; then diff --git a/home/modules/plasma.nix b/home/modules/plasma.nix index 763689a..89e6462 100644 --- a/home/modules/plasma.nix +++ b/home/modules/plasma.nix @@ -1,4 +1,4 @@ -{ ... }: { +_: { programs.plasma = { enable = true; @@ -41,14 +41,23 @@ kmix.increase_microphone_volume = "Microphone Volume Up"; kmix.increase_volume = "Volume Up"; kmix.increase_volume_small = "Shift+Volume Up"; - kmix.mic_mute = ["Microphone Mute" "Meta+Volume Mute"]; + kmix.mic_mute = [ + "Microphone Mute" + "Meta+Volume Mute" + ]; kmix.mute = "Volume Mute"; - ksmserver."Lock Session" = ["Meta+L" "Screensaver"]; + ksmserver."Lock Session" = [ + "Meta+L" + "Screensaver" + ]; ksmserver."Log Out" = "Ctrl+Alt+Del"; kwin."Activate Window Demanding Attention" = "Meta+Ctrl+A"; kwin."Edit Tiles" = "Meta+T"; kwin.Expose = "Ctrl+F9"; - kwin.ExposeAll = ["Ctrl+F10" "Launch (C)"]; + kwin.ExposeAll = [ + "Ctrl+F10" + "Launch (C)" + ]; kwin.ExposeClass = "Ctrl+F7"; kwin."Grid View" = "Meta+G"; kwin."Kill Window" = "Meta+Ctrl+Esc"; @@ -68,10 +77,22 @@ kwin."Switch to Desktop 2" = "Ctrl+F2"; kwin."Switch to Desktop 3" = "Ctrl+F3"; kwin."Switch to Desktop 4" = "Ctrl+F4"; - kwin."Walk Through Windows" = ["Meta+Tab" "Alt+Tab"]; - kwin."Walk Through Windows (Reverse)" = ["Meta+Shift+Tab" "Alt+Shift+Tab"]; - kwin."Walk Through Windows of Current Application" = ["Meta+`" "Alt+`"]; - kwin."Walk Through Windows of Current Application (Reverse)" = ["Meta+~" "Alt+~"]; + kwin."Walk Through Windows" = [ + "Meta+Tab" + "Alt+Tab" + ]; + kwin."Walk Through Windows (Reverse)" = [ + "Meta+Shift+Tab" + "Alt+Shift+Tab" + ]; + kwin."Walk Through Windows of Current Application" = [ + "Meta+`" + "Alt+`" + ]; + kwin."Walk Through Windows of Current Application (Reverse)" = [ + "Meta+~" + "Alt+~" + ]; kwin."Window Close" = "Alt+F4"; kwin."Window Maximize" = "Meta+PgUp"; kwin."Window Minimize" = "Meta+PgDown"; @@ -88,7 +109,10 @@ kwin."Window to Previous Screen" = "Meta+Shift+Left"; kwin.disableInputCapture = "Meta+Shift+Esc"; kwin.view_actual_size = "Meta+0"; - kwin.view_zoom_in = ["Meta++" "Meta+="]; + kwin.view_zoom_in = [ + "Meta++" + "Meta+=" + ]; kwin.view_zoom_out = "Meta+-"; mediacontrol.nextmedia = "Media Next"; mediacontrol.pausemedia = "Media Pause"; @@ -106,8 +130,14 @@ org_kde_powerdevil.PowerOff = "Power Off"; org_kde_powerdevil.Sleep = "Sleep"; org_kde_powerdevil."Toggle Keyboard Backlight" = "Keyboard Light On/Off"; - org_kde_powerdevil.powerProfile = ["Battery" "Meta+B"]; - plasmashell."activate application launcher" = ["Meta" "Alt+F1"]; + org_kde_powerdevil.powerProfile = [ + "Battery" + "Meta+B" + ]; + plasmashell."activate application launcher" = [ + "Meta" + "Alt+F1" + ]; plasmashell."activate task manager entry 1" = "Meta+1"; plasmashell."activate task manager entry 2" = "Meta+2"; plasmashell."activate task manager entry 3" = "Meta+3"; @@ -128,7 +158,8 @@ # At the moment, these are mostly defaults. configFile = { - baloofilerc.General."exclude filters" = "*~,*.part,*.o,*.la,*.lo,*.loT,*.moc,moc_*.cpp,qrc_*.cpp,ui_*.h,cmake_install.cmake,CMakeCache.txt,CTestTestfile.cmake,libtool,config.status,confdefs.h,autom4te,conftest,confstat,Makefile.am,*.gcode,.ninja_deps,.ninja_log,build.ninja,*.csproj,*.m4,*.rej,*.gmo,*.pc,*.omf,*.aux,*.tmp,*.po,*.vm*,*.nvram,*.rcore,*.swp,*.swap,lzo,litmain.sh,*.orig,.histfile.*,.xsession-errors*,*.map,*.so,*.a,*.db,*.qrc,*.ini,*.init,*.img,*.vdi,*.vbox*,vbox.log,*.qcow2,*.vmdk,*.vhd,*.vhdx,*.sql,*.sql.gz,*.ytdl,*.tfstate*,*.class,*.pyc,*.pyo,*.elc,*.qmlc,*.jsc,*.fastq,*.fq,*.gb,*.fasta,*.fna,*.gbff,*.faa,po,CVS,.svn,.git,_darcs,.bzr,.hg,CMakeFiles,CMakeTmp,CMakeTmpQmake,.moc,.obj,.pch,.uic,.npm,.yarn,.yarn-cache,__pycache__,node_modules,node_packages,nbproject,.terraform,.venv,venv,core-dumps,lost+found"; + baloofilerc.General."exclude filters" = + "*~,*.part,*.o,*.la,*.lo,*.loT,*.moc,moc_*.cpp,qrc_*.cpp,ui_*.h,cmake_install.cmake,CMakeCache.txt,CTestTestfile.cmake,libtool,config.status,confdefs.h,autom4te,conftest,confstat,Makefile.am,*.gcode,.ninja_deps,.ninja_log,build.ninja,*.csproj,*.m4,*.rej,*.gmo,*.pc,*.omf,*.aux,*.tmp,*.po,*.vm*,*.nvram,*.rcore,*.swp,*.swap,lzo,litmain.sh,*.orig,.histfile.*,.xsession-errors*,*.map,*.so,*.a,*.db,*.qrc,*.ini,*.init,*.img,*.vdi,*.vbox*,vbox.log,*.qcow2,*.vmdk,*.vhd,*.vhdx,*.sql,*.sql.gz,*.ytdl,*.tfstate*,*.class,*.pyc,*.pyo,*.elc,*.qmlc,*.jsc,*.fastq,*.fq,*.gb,*.fasta,*.fna,*.gbff,*.faa,po,CVS,.svn,.git,_darcs,.bzr,.hg,CMakeFiles,CMakeTmp,CMakeTmpQmake,.moc,.obj,.pch,.uic,.npm,.yarn,.yarn-cache,__pycache__,node_modules,node_packages,nbproject,.terraform,.venv,venv,core-dumps,lost+found"; dolphinrc.DetailsMode.PreviewSize = 22; dolphinrc.General.DoubleClickViewAction = "open_terminal"; dolphinrc."KFileDialog Settings"."Places Icons Auto-resize" = false; diff --git a/home/modules/python.nix b/home/modules/python.nix index 79239da..3f58471 100644 --- a/home/modules/python.nix +++ b/home/modules/python.nix @@ -4,4 +4,3 @@ python315 ]; } - diff --git a/home/modules/rust.nix b/home/modules/rust.nix index 1229d8a..71f6928 100644 --- a/home/modules/rust.nix +++ b/home/modules/rust.nix @@ -4,4 +4,3 @@ rustup ]; } - diff --git a/home/modules/shell-tools.nix b/home/modules/shell-tools.nix new file mode 100644 index 0000000..5d7c10d --- /dev/null +++ b/home/modules/shell-tools.nix @@ -0,0 +1,14 @@ +{ pkgs, ... }: +{ + programs = { + fzf.enable = true; # Ctrl-R fuzzy history, Ctrl-T file search + zoxide.enable = true; # `z foo` smart cd + bat.enable = true; # syntax-highlighting pager / fzf preview + eza.enable = true; + }; + home.packages = with pkgs; [ + ripgrep + fd + jq + ]; +} diff --git a/home/modules/ssh.nix b/home/modules/ssh.nix index 735904a..a9b8f6a 100644 --- a/home/modules/ssh.nix +++ b/home/modules/ssh.nix @@ -1,11 +1,9 @@ -{ ... }: - -{ +_: { programs.ssh = { enable = true; enableDefaultConfig = false; - + settings = { "github.com" = { hostname = "github.com"; diff --git a/home/modules/starship.nix b/home/modules/starship.nix index c6642b9..bc08f02 100644 --- a/home/modules/starship.nix +++ b/home/modules/starship.nix @@ -1,6 +1,4 @@ -{ ... }: - -{ +_: { programs.starship = { enable = true; enableZshIntegration = true; diff --git a/home/modules/typst.nix b/home/modules/typst.nix index c54c419..ff6e32c 100644 --- a/home/modules/typst.nix +++ b/home/modules/typst.nix @@ -5,4 +5,3 @@ tinymist ]; } - diff --git a/home/modules/vscode.nix b/home/modules/vscode.nix index d08a06f..cbe2aa2 100644 --- a/home/modules/vscode.nix +++ b/home/modules/vscode.nix @@ -1,33 +1,45 @@ -{ pkgs, lib, isDarwin, ... }: { +{ + pkgs, + lib, + isDarwin, + ... +}: +{ programs.vscodium = { enable = true; package = pkgs.vscodium; profiles.default = { - extensions = (with pkgs.vscode-extensions; [ - charliermarsh.ruff - editorconfig.editorconfig - gruntfuggly.todo-tree - hediet.vscode-drawio - jnoortheen.nix-ide - mechatroner.rainbow-csv - ms-toolsai.jupyter - ms-python.python - ms-vscode-remote.remote-ssh - myriad-dreamin.tinymist - rust-lang.rust-analyzer - timonwong.shellcheck - unifiedjs.vscode-mdx - ]) ++ pkgs.nix4vscode.forOpenVsx [ - "akamud.vscode-theme-onedark" - "astral-sh.ty" - "modular-mojotools.vscode-mojo" - ] ++ lib.optionals (!isDarwin) (with pkgs.vscode-extensions; [ - # markdown-pdf pins ungoogled-chromium (Linux-only) as its PDF - # renderer. On macOS, install it from the marketplace by hand and set - # markdown-pdf.executablePath to Chrome/Brave, or render via typst. - yzane.markdown-pdf - ]); + extensions = + (with pkgs.vscode-extensions; [ + charliermarsh.ruff + editorconfig.editorconfig + gruntfuggly.todo-tree + hediet.vscode-drawio + jnoortheen.nix-ide + mechatroner.rainbow-csv + ms-toolsai.jupyter + ms-python.python + ms-vscode-remote.remote-ssh + myriad-dreamin.tinymist + rust-lang.rust-analyzer + timonwong.shellcheck + unifiedjs.vscode-mdx + ]) + ++ pkgs.nix4vscode.forOpenVsx [ + "akamud.vscode-theme-onedark" + "astral-sh.ty" + "modular-mojotools.vscode-mojo" + ] + ++ lib.optionals (!isDarwin) ( + with pkgs.vscode-extensions; + [ + # markdown-pdf pins ungoogled-chromium (Linux-only) as its PDF + # renderer. On macOS, install it from the marketplace by hand and set + # markdown-pdf.executablePath to Chrome/Brave, or render via typst. + yzane.markdown-pdf + ] + ); userSettings = { "editor.fontFamily" = "'JetBrains Mono', monospace"; diff --git a/home/modules/yazi.nix b/home/modules/yazi.nix index 3ff9feb..a59dbb7 100644 --- a/home/modules/yazi.nix +++ b/home/modules/yazi.nix @@ -15,14 +15,23 @@ let ''; helixOpener = [ - { run = ''hx-zellij-open "$@"''; desc = "Open in Helix pane"; block = false; for = "unix"; } + { + run = ''hx-zellij-open "$@"''; + desc = "Open in Helix pane"; + block = false; + for = "unix"; + } ]; tomlFormat = pkgs.formats.toml { }; ideYaziToml = tomlFormat.generate "yazi.toml" { mgr = { - ratio = [ 0 1 0 ]; + ratio = [ + 0 + 1 + 0 + ]; linemode = "none"; }; opener.edit = helixOpener; @@ -30,8 +39,16 @@ let ideKeymapToml = tomlFormat.generate "keymap.toml" { mgr.prepend_keymap = [ - { on = "h"; run = "plugin bounded-leave"; desc = "Parent dir (stop at project root)"; } - { on = ""; run = "plugin bounded-leave"; desc = "Parent dir (stop at project root)"; } + { + on = "h"; + run = "plugin bounded-leave"; + desc = "Parent dir (stop at project root)"; + } + { + on = ""; + run = "plugin bounded-leave"; + desc = "Parent dir (stop at project root)"; + } ]; }; @@ -60,23 +77,59 @@ let ideThemeToml = tomlFormat.generate "theme.toml" { status = { - overall = { fg = "#abb2bf"; bg = "#21252b"; }; # readable text on a dark bar - progress_label = { fg = "#abb2bf"; bold = true; }; - progress_normal = { fg = "#98c379"; bg = "#21252b"; }; - progress_error = { fg = "#e06c75"; bg = "#21252b"; }; + overall = { + fg = "#abb2bf"; + bg = "#21252b"; + }; # readable text on a dark bar + progress_label = { + fg = "#abb2bf"; + bold = true; + }; + progress_normal = { + fg = "#98c379"; + bg = "#21252b"; + }; + progress_error = { + fg = "#e06c75"; + bg = "#21252b"; + }; }; mode = { - normal_main = { fg = "#21252b"; bg = "#61afef"; bold = true; }; - normal_alt = { fg = "#61afef"; bg = "#21252b"; }; - select_main = { fg = "#21252b"; bg = "#98c379"; bold = true; }; - select_alt = { fg = "#98c379"; bg = "#21252b"; }; - unset_main = { fg = "#21252b"; bg = "#e06c75"; bold = true; }; - unset_alt = { fg = "#e06c75"; bg = "#21252b"; }; + normal_main = { + fg = "#21252b"; + bg = "#61afef"; + bold = true; + }; + normal_alt = { + fg = "#61afef"; + bg = "#21252b"; + }; + select_main = { + fg = "#21252b"; + bg = "#98c379"; + bold = true; + }; + select_alt = { + fg = "#98c379"; + bg = "#21252b"; + }; + unset_main = { + fg = "#21252b"; + bg = "#e06c75"; + bold = true; + }; + unset_alt = { + fg = "#e06c75"; + bg = "#21252b"; + }; }; }; in { - home.packages = [ hx-zellij-open yazi-ide ]; + home.packages = [ + hx-zellij-open + yazi-ide + ]; programs.yazi = { enable = true; @@ -85,7 +138,6 @@ in settings.opener.edit = helixOpener; }; - xdg.configFile = { "yazi-ide/yazi.toml".source = ideYaziToml; "yazi-ide/theme.toml".source = ideThemeToml; @@ -118,4 +170,3 @@ in ''; }; } - diff --git a/home/modules/zellij.nix b/home/modules/zellij.nix index f1826a6..8089803 100644 --- a/home/modules/zellij.nix +++ b/home/modules/zellij.nix @@ -1,5 +1,4 @@ -{ ... }: -{ +_: { programs.zellij.enable = true; xdg.configFile."zellij/config.kdl".text = '' diff --git a/home/modules/zig.nix b/home/modules/zig.nix index e0b7201..26fc269 100644 --- a/home/modules/zig.nix +++ b/home/modules/zig.nix @@ -4,4 +4,3 @@ zig ]; } - diff --git a/home/modules/zoom.nix b/home/modules/zoom.nix index 30b7070..5e9e5f5 100644 --- a/home/modules/zoom.nix +++ b/home/modules/zoom.nix @@ -4,4 +4,3 @@ zoom-us ]; } - diff --git a/home/modules/zsh.nix b/home/modules/zsh.nix index 4ca4f4c..785c03a 100644 --- a/home/modules/zsh.nix +++ b/home/modules/zsh.nix @@ -1,4 +1,9 @@ -{ pkgs, lib, isDarwin, ... }: +{ + pkgs, + lib, + isDarwin, + ... +}: { programs.zsh = { @@ -54,8 +59,7 @@ # ghostty (GTK) ships terminfo under $out/share on Linux. The macOS # ghostty-bin bundles its own, so only add ncurses there. TERMINFO_DIRS = lib.concatStringsSep ":" ( - lib.optional (!isDarwin) "${pkgs.ghostty}/share/terminfo" - ++ [ "${pkgs.ncurses}/share/terminfo" ] + lib.optional (!isDarwin) "${pkgs.ghostty}/share/terminfo" ++ [ "${pkgs.ncurses}/share/terminfo" ] ); }; } diff --git a/hosts/oreo/default.nix b/hosts/oreo/default.nix index 323a96a..e129e2f 100644 --- a/hosts/oreo/default.nix +++ b/hosts/oreo/default.nix @@ -26,7 +26,10 @@ users.users.alex = { isNormalUser = true; shell = pkgs.zsh; - extraGroups = [ "wheel" "networkmanager" ]; + extraGroups = [ + "wheel" + "networkmanager" + ]; }; programs._1password.enable = true; diff --git a/hosts/oreo/hardware.nix b/hosts/oreo/hardware.nix index 7e08360..1b7273e 100644 --- a/hosts/oreo/hardware.nix +++ b/hosts/oreo/hardware.nix @@ -1,32 +1,47 @@ # Do not modify this file! It was generated by ‘nixos-generate-config’ # and may be overwritten by future invocations. Please make changes # to /etc/nixos/configuration.nix instead. -{ config, lib, pkgs, modulesPath, ... }: +{ + config, + lib, + pkgs, + modulesPath, + ... +}: { - imports = - [ (modulesPath + "/installer/scan/not-detected.nix") - ]; + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + ]; - boot.initrd.availableKernelModules = [ "xhci_pci" "thunderbolt" "vmd" "nvme" "rtsx_pci_sdmmc" ]; + boot.initrd.availableKernelModules = [ + "xhci_pci" + "thunderbolt" + "vmd" + "nvme" + "rtsx_pci_sdmmc" + ]; boot.initrd.kernelModules = [ ]; boot.kernelModules = [ "kvm-intel" ]; boot.extraModulePackages = [ ]; - fileSystems."/" = - { device = "/dev/disk/by-uuid/5a8d96fe-20a7-40e8-bb27-f42f462123fc"; - fsType = "ext4"; - }; + fileSystems."/" = { + device = "/dev/disk/by-uuid/5a8d96fe-20a7-40e8-bb27-f42f462123fc"; + fsType = "ext4"; + }; - fileSystems."/boot" = - { device = "/dev/disk/by-uuid/9A43-44E9"; - fsType = "vfat"; - options = [ "fmask=0077" "dmask=0077" ]; - }; - - swapDevices = - [ { device = "/dev/disk/by-uuid/021c3b9a-3d3b-4eab-ad72-c878bc39bfd5"; } + fileSystems."/boot" = { + device = "/dev/disk/by-uuid/9A43-44E9"; + fsType = "vfat"; + options = [ + "fmask=0077" + "dmask=0077" ]; + }; + + swapDevices = [ + { device = "/dev/disk/by-uuid/021c3b9a-3d3b-4eab-ad72-c878bc39bfd5"; } + ]; nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; diff --git a/hosts/seasoned/default.nix b/hosts/seasoned/default.nix index 10d7bfb..0c870da 100644 --- a/hosts/seasoned/default.nix +++ b/hosts/seasoned/default.nix @@ -1,5 +1,4 @@ -{ ... }: -{ +_: { imports = [ ../../modules/darwin.nix ]; diff --git a/hosts/whitegrizzly/default.nix b/hosts/whitegrizzly/default.nix index 8a59c63..1b05eb8 100644 --- a/hosts/whitegrizzly/default.nix +++ b/hosts/whitegrizzly/default.nix @@ -24,7 +24,10 @@ users.users.alex = { isNormalUser = true; shell = pkgs.zsh; - extraGroups = [ "wheel" "networkmanager" ]; + extraGroups = [ + "wheel" + "networkmanager" + ]; }; programs._1password.enable = true; diff --git a/hosts/whitegrizzly/hardware.nix b/hosts/whitegrizzly/hardware.nix index fd01d4e..8374e79 100644 --- a/hosts/whitegrizzly/hardware.nix +++ b/hosts/whitegrizzly/hardware.nix @@ -1,32 +1,46 @@ # Do not modify this file! It was generated by ‘nixos-generate-config’ # and may be overwritten by future invocations. Please make changes # to /etc/nixos/configuration.nix instead. -{ config, lib, pkgs, modulesPath, ... }: +{ + config, + lib, + pkgs, + modulesPath, + ... +}: { - imports = - [ (modulesPath + "/installer/scan/not-detected.nix") - ]; + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + ]; - boot.initrd.availableKernelModules = [ "xhci_pci" "thunderbolt" "nvme" "rtsx_pci_sdmmc" ]; + boot.initrd.availableKernelModules = [ + "xhci_pci" + "thunderbolt" + "nvme" + "rtsx_pci_sdmmc" + ]; boot.initrd.kernelModules = [ ]; boot.kernelModules = [ "kvm-intel" ]; boot.extraModulePackages = [ ]; - fileSystems."/" = - { device = "/dev/disk/by-uuid/29245dae-0f7b-4249-8d53-c305034156fa"; - fsType = "ext4"; - }; + fileSystems."/" = { + device = "/dev/disk/by-uuid/29245dae-0f7b-4249-8d53-c305034156fa"; + fsType = "ext4"; + }; - fileSystems."/boot" = - { device = "/dev/disk/by-uuid/3429-BC80"; - fsType = "vfat"; - options = [ "fmask=0077" "dmask=0077" ]; - }; - - swapDevices = - [ { device = "/dev/disk/by-uuid/e1adeb6e-feae-4627-a879-4667fd5e689e"; } + fileSystems."/boot" = { + device = "/dev/disk/by-uuid/3429-BC80"; + fsType = "vfat"; + options = [ + "fmask=0077" + "dmask=0077" ]; + }; + + swapDevices = [ + { device = "/dev/disk/by-uuid/e1adeb6e-feae-4627-a879-4667fd5e689e"; } + ]; nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; diff --git a/justfile b/justfile index dc3869c..16d2285 100644 --- a/justfile +++ b/justfile @@ -26,6 +26,23 @@ clean: sudo nix-store --optimise sudo {{ if os() == "macos" { "darwin-rebuild switch" } else { "nixos-rebuild boot" } }} --flake .#{{host}} +# Format every .nix file in the repo with nixfmt (RFC 166 style). +# Runs inside the devShell, so it works with or without direnv loaded. +fmt: + nix develop -c bash -c "find . -name '*.nix' -not -path './iso/*' -not -path './.direnv/*' -exec nixfmt {} +" + +# Lint Nix for anti-patterns (statix) and dead/unused bindings (deadnix). +# Exits nonzero on findings, so it doubles as a CI check. +lint: + nix develop -c statix check . + nix develop -c deadnix --fail . + +# Preview what the next `rebuild` would change: build the target system +# without switching, then diff it against the running one. +diff: + nix build --out-link /tmp/notfiles-next {{ if os() == "macos" { ".#darwinConfigurations." + host + ".system" } else { ".#nixosConfigurations." + host + ".config.system.build.toplevel" } }} + nix develop -c nvd diff /run/current-system /tmp/notfiles-next + # Generate Ed25519 SSH keys for each named service (default: github gradescope). # Override: just gen-keys gitlab bitbucket gen-keys *services='github gradescope h2p durrantlab signing_git scienting_git scienting_static_sites': diff --git a/modules/core.nix b/modules/core.nix index a0026a5..798530f 100644 --- a/modules/core.nix +++ b/modules/core.nix @@ -1,5 +1,8 @@ { inputs, pkgs, ... }: { - nix.settings.experimental-features = [ "nix-command" "flakes" ]; + nix.settings.experimental-features = [ + "nix-command" + "flakes" + ]; nixpkgs.config.allowUnfree = true; time.timeZone = "America/New_York"; diff --git a/modules/darwin.nix b/modules/darwin.nix index 1512c0c..4673c19 100644 --- a/modules/darwin.nix +++ b/modules/darwin.nix @@ -61,4 +61,3 @@ trackpad.Clicking = false; }; } - diff --git a/modules/docker.nix b/modules/docker.nix index bb71a48..7d9b22d 100644 --- a/modules/docker.nix +++ b/modules/docker.nix @@ -1,4 +1,4 @@ -{ ... }: { +_: { virtualisation.docker = { enable = true; rootless = { @@ -7,4 +7,3 @@ }; }; } - diff --git a/modules/nvidia.nix b/modules/nvidia.nix index 9769b59..0c40038 100644 --- a/modules/nvidia.nix +++ b/modules/nvidia.nix @@ -17,8 +17,7 @@ package = lib.mkOption { type = lib.types.package; default = config.boot.kernelPackages.nvidiaPackages.stable; - defaultText = lib.literalExpression - "config.boot.kernelPackages.nvidiaPackages.stable"; + defaultText = lib.literalExpression "config.boot.kernelPackages.nvidiaPackages.stable"; description = "The NVIDIA driver package to use."; }; @@ -26,7 +25,11 @@ enable = lib.mkEnableOption "NVIDIA Optimus PRIME (hybrid graphics)"; mode = lib.mkOption { - type = lib.types.enum [ "offload" "sync" "reverse-sync" ]; + type = lib.types.enum [ + "offload" + "sync" + "reverse-sync" + ]; default = "offload"; description = '' Which PRIME mode to use. @@ -63,13 +66,13 @@ hardware.graphics.enable = true; services.xserver.videoDrivers = - if config.modules.nvidia.prime.enable - && config.modules.nvidia.prime.mode == "offload" - then [ - (if config.modules.nvidia.prime.amdBusId != "" then "amdgpu" else "modesetting") - "nvidia" - ] - else [ "nvidia" ]; + if config.modules.nvidia.prime.enable && config.modules.nvidia.prime.mode == "offload" then + [ + (if config.modules.nvidia.prime.amdBusId != "" then "amdgpu" else "modesetting") + "nvidia" + ] + else + [ "nvidia" ]; hardware.nvidia = { modesetting.enable = true; @@ -83,21 +86,27 @@ prime = lib.mkIf config.modules.nvidia.prime.enable ( let busIds = lib.filterAttrs (_: v: v != "") { - intelBusId = config.modules.nvidia.prime.intelBusId; + intelBusId = config.modules.nvidia.prime.intelBusId; amdgpuBusId = config.modules.nvidia.prime.amdBusId; nvidiaBusId = config.modules.nvidia.prime.nvidiaBusId; }; modeConfig = - if config.modules.nvidia.prime.mode == "offload" then { - offload.enable = true; - offload.enableOffloadCmd = true; - } else if config.modules.nvidia.prime.mode == "sync" then { - sync.enable = true; - } else { - reverseSync.enable = true; - allowExternalGpu = false; - }; - in busIds // modeConfig + if config.modules.nvidia.prime.mode == "offload" then + { + offload.enable = true; + offload.enableOffloadCmd = true; + } + else if config.modules.nvidia.prime.mode == "sync" then + { + sync.enable = true; + } + else + { + reverseSync.enable = true; + allowExternalGpu = false; + }; + in + busIds // modeConfig ); }; }; diff --git a/modules/plasma.nix b/modules/plasma.nix index 8051486..d6e7be4 100644 --- a/modules/plasma.nix +++ b/modules/plasma.nix @@ -1,4 +1,4 @@ -{ ... }: { +_: { services.xserver.enable = true; services.displayManager.sddm = { enable = true; diff --git a/modules/security.nix b/modules/security.nix index 9fbd31a..abf5ec8 100644 --- a/modules/security.nix +++ b/modules/security.nix @@ -1,4 +1,4 @@ -{ ... }: { +_: { programs._1password.enable = true; programs._1password-gui = { enable = true;