diff --git a/config/default.nix b/config/default.nix index 8a9b27c0..177542da 100644 --- a/config/default.nix +++ b/config/default.nix @@ -1,17 +1,27 @@ -{ pkgs, config, lib, ... }: +{ + pkgs, + config, + lib, + ... +}: let dotsDir = "${config.home.homeDirectory}/.config/home-manager/dots"; - softLinkDots = dir: - (builtins.listToAttrs (map (n: { - name = "${dir + "/" + n}"; - value = { - source = config.lib.file.mkOutOfStoreSymlink "${dotsDir}/${dir}/${n}"; - force = true; - }; - }) - # HACK: We don't use the absolute path in readDir to respect pure evaluation in nix flakes. - (builtins.attrNames (builtins.readDir ../dots/${dir})))); - nixGLWrap = pkg: + softLinkDots = + dir: + (builtins.listToAttrs ( + map + (n: { + name = "${dir + "/" + n}"; + value = { + source = config.lib.file.mkOutOfStoreSymlink "${dotsDir}/${dir}/${n}"; + force = true; + }; + }) + # HACK: We don't use the absolute path in readDir to respect pure evaluation in nix flakes. + (builtins.attrNames (builtins.readDir ../dots/${dir})) + )); + nixGLWrap = + pkg: pkgs.runCommand "${pkg.name}-nixgl-wrapper" { } '' mkdir $out ln -s ${pkg}/* $out @@ -23,10 +33,12 @@ let chmod +x $wrapped_bin done ''; -in { +in +{ programs.home-manager.enable = true; home = { - packages = with pkgs; + packages = + with pkgs; [ Fmt nodePackages.prettier @@ -85,7 +97,16 @@ in { keyd tidal-hifi nix-output-monitor - ] ++ [ go (lib.hiPrio gotools) ] ++ [ age age-plugin-yubikey passage ] + ] + ++ [ + go + (lib.hiPrio gotools) + ] + ++ [ + age + age-plugin-yubikey + passage + ] ++ [ libsForQt5.qtstyleplugins libsForQt5.qtcurve @@ -93,7 +114,12 @@ in { gtk-engine-murrine gnome.gnome-themes-extra gtk_engines - ] ++ [ ansible ansible-lint ] ++ [ + ] + ++ [ + ansible + ansible-lint + ] + ++ [ # gnumake # cmake # gcc @@ -120,8 +146,7 @@ in { } // softLinkDots ".config"; sessionVariables = { - TERMINFO_DIRS = - "${config.home.homeDirectory}/.nix-profile/share/terminfo"; + TERMINFO_DIRS = "${config.home.homeDirectory}/.nix-profile/share/terminfo"; WSLENV = "TERMINFO_DIRS"; LOCALE_ARCHIVE = "${pkgs.glibcLocales}/lib/locale/locale-archive"; }; @@ -146,7 +171,6 @@ in { "application/xhtml+xml" = [ "firefoxdeveloperedition.desktop" ]; "application/x-extension-xhtml" = [ "firefoxdeveloperedition.desktop" ]; "application/x-extension-xht" = [ "firefoxdeveloperedition.desktop" ]; - }; defaultApplications = { "application/pdf" = [ "org.pwmt.zathura.desktop" ]; @@ -160,7 +184,6 @@ in { "application/xhtml+xml" = [ "firefoxdeveloperedition.desktop" ]; "application/x-extension-xhtml" = [ "firefoxdeveloperedition.desktop" ]; "application/x-extension-xht" = [ "firefoxdeveloperedition.desktop" ]; - }; }; systemDirs.data = [ @@ -232,7 +255,9 @@ in { enable = true; userName = "Price Hiller"; userEmail = "price@orion-technologies.io"; - aliases = { unstage = "reset HEAD --"; }; + aliases = { + unstage = "reset HEAD --"; + }; extraConfig = { init.defaultBranch = "Development"; merge.conflictstyle = "zdiff3"; @@ -291,7 +316,9 @@ in { options = { navigate = true; features = "interactive decorations"; - interactive = { keep-plus-minus-markers = false; }; + interactive = { + keep-plus-minus-markers = false; + }; decorations = { commit-decoration-style = "bold box ul"; dark = true; @@ -317,34 +344,36 @@ in { platformTheme.name = "gtk"; }; - gtk = let - extraGtkConfig = { - gtk-application-prefer-dark-theme = true; - gtk-cursor-theme-size = 0; - gtk-enable-event-sounds = 1; - gtk-enable-input-feedback-sounds = 1; - gtk-xft-antialias = 1; - gtk-xft-hinting = 1; - gtk-xft-hintstyle = "hintfull"; + gtk = + let + extraGtkConfig = { + gtk-application-prefer-dark-theme = true; + gtk-cursor-theme-size = 0; + gtk-enable-event-sounds = 1; + gtk-enable-input-feedback-sounds = 1; + gtk-xft-antialias = 1; + gtk-xft-hinting = 1; + gtk-xft-hintstyle = "hintfull"; + }; + in + { + enable = true; + theme = { + name = "Kanagawa-BL"; + package = pkgs.kanagawa-gtk-theme; + }; + iconTheme = { + name = "Kanagawa"; + package = pkgs.kanagawa-gtk-icon-theme; + }; + font = { + name = "Open Sans"; + size = 11; + package = pkgs.open-sans; + }; + gtk3.extraConfig = extraGtkConfig; + gtk4.extraConfig = extraGtkConfig; }; - in { - enable = true; - theme = { - name = "Kanagawa-BL"; - package = pkgs.kanagawa-gtk-theme; - }; - iconTheme = { - name = "Kanagawa"; - package = pkgs.kanagawa-gtk-icon-theme; - }; - font = { - name = "Open Sans"; - size = 11; - package = pkgs.open-sans; - }; - gtk3.extraConfig = extraGtkConfig; - gtk4.extraConfig = extraGtkConfig; - }; services = { gromit-mpx = { @@ -388,19 +417,30 @@ in { device = "default"; color = "red"; arrowSize = 5; - modifiers = [ "CONTROL" "SHIFT" ]; + modifiers = [ + "CONTROL" + "SHIFT" + ]; } { device = "default"; color = "blue"; arrowSize = 5; - modifiers = [ "CONTROL" "SHIFT" "2" ]; + modifiers = [ + "CONTROL" + "SHIFT" + "2" + ]; } { device = "default"; color = "yellow"; arrowSize = 5; - modifiers = [ "CONTROL" "SHIFT" "3" ]; + modifiers = [ + "CONTROL" + "SHIFT" + "3" + ]; } ]; }; @@ -425,27 +465,31 @@ in { targets.compositor = { Unit = { Description = "Unit for DE to launch"; - ConditionEnvironment = [ "WAYLAND_DISPLAY" "DISPLAY" ]; + ConditionEnvironment = [ + "WAYLAND_DISPLAY" + "DISPLAY" + ]; }; }; services = { swww-daemon = { Service = - let - cleanup-socket-script = pkgs.writeShellScript "swww-daemon-cleanup-socket" '' - # Remove the existing swww.socket if it exists, avoids some issues with swww-daemon - # startup where swww-daemon claims the address is already in use - if [[ -w "$XDG_RUNTIME_DIR/swww.socket" ]]; then - rm -f $XDG_RUNTIME_DIR/swww.socket || exit 1 - fi - ''; - in { - RestartSec = 3; - PassEnvironment = [ "XDG_RUNTIME_DIR" ]; - ExecStartPre = "${cleanup-socket-script}"; - ExecStopPost = "${cleanup-socket-script}"; - ExecStart = "${pkgs.swww}/bin/swww-daemon"; - }; + let + cleanup-socket-script = pkgs.writeShellScript "swww-daemon-cleanup-socket" '' + # Remove the existing swww.socket if it exists, avoids some issues with swww-daemon + # startup where swww-daemon claims the address is already in use + if [[ -w "$XDG_RUNTIME_DIR/swww.socket" ]]; then + rm -f $XDG_RUNTIME_DIR/swww.socket || exit 1 + fi + ''; + in + { + RestartSec = 3; + PassEnvironment = [ "XDG_RUNTIME_DIR" ]; + ExecStartPre = "${cleanup-socket-script}"; + ExecStopPost = "${cleanup-socket-script}"; + ExecStart = "${pkgs.swww}/bin/swww-daemon"; + }; Install.WantedBy = [ "compositor.target" ]; Unit = { Description = "Wayland Wallpaper Service"; @@ -462,11 +506,14 @@ in { "SWWW_TRANSITION_STEP=30" "SWWW_TRANSITION_DURATION=0.75" ]; - ExecStart = let wallpaper-dir = "${dotsDir}/.local/share/wallpapers"; - in [ - "${pkgs.swww}/bin/swww img -t random ${wallpaper-dir}/Nebula.jpg" - "${pkgs.swww}/bin/swww img -t wipe --transition-angle 40 -o eDP-1 ${wallpaper-dir}/Autumn-Leaves.jpg" - ]; + ExecStart = + let + wallpaper-dir = "${dotsDir}/.local/share/wallpapers"; + in + [ + "${pkgs.swww}/bin/swww img -t random ${wallpaper-dir}/Nebula.jpg" + "${pkgs.swww}/bin/swww img -t wipe --transition-angle 40 -o eDP-1 ${wallpaper-dir}/Autumn-Leaves.jpg" + ]; }; Install.WantedBy = [ "swww-daemon.service" ]; Unit = { @@ -497,14 +544,16 @@ in { After = [ "compositor.target" ]; }; }; - gromit-mpx.Service.ExecStart = - lib.mkForce "echo 'Disabled, managed by WM'"; + gromit-mpx.Service.ExecStart = lib.mkForce "echo 'Disabled, managed by WM'"; opensnitch-ui = { Service.RestartSec = 3; Install.WantedBy = [ "compositor.target" ]; Unit = { PartOf = [ "compositor.target" ]; - After = [ "compositor.target" "waybar.service" ]; + After = [ + "compositor.target" + "waybar.service" + ]; }; }; easyeffects = { diff --git a/flake.lock b/flake.lock index ebbfce88..d1d3e28e 100644 --- a/flake.lock +++ b/flake.lock @@ -9,7 +9,7 @@ }, "locked": { "lastModified": 1, - "narHash": "sha256-w//f0CiJqZtYO1MYA7DzwPnNFZh/dxPx6+ZP9tNoUEs=", + "narHash": "sha256-nQ8iqn/VyJJc96TlwtT6SvKcPFZKFA99tnk6pKgxkWE=", "path": "pkgs/Fmt", "type": "path" }, diff --git a/flake.nix b/flake.nix index bbfbd58b..277c3f18 100644 --- a/flake.nix +++ b/flake.nix @@ -36,71 +36,82 @@ }; }; - outputs = inputs@{ self, home-manager, nixpkgs, ... }: + outputs = + inputs@{ + self, + home-manager, + nixpkgs, + ... + }: let system = "x86_64-linux"; username = "sam"; pkgs = nixpkgs.legacyPackages.${system}; - in { + in + { packages.x86_64-linux.default = home-manager.defaultPackage.x86_64-linux; checks.${system} = { - formatting = pkgs.runCommand "check-dot-file-formatting" { - buildInputs = with pkgs; [ - findutils - inputs.Fmt.packages.x86_64-linux.default - ]; - } '' - set -euo pipefail - cd ${self} - Fmt -- $(find . -type f) - printf "TEST COMPLETED!\n" > $out - ''; - }; - homeConfigurations.${username} = - home-manager.lib.homeManagerConfiguration { - inherit pkgs; - extraSpecialArgs = { - inherit inputs; - inherit self; - }; - modules = [ - ({ - imports = [ inputs.agenix.homeManagerModules.default ]; - nixpkgs.overlays = [ - inputs.neovim-nightly-overlay.overlay - inputs.bob.overlays.default - inputs.Fmt.overlays.default - inputs.kanagawa-gtk.overlays.default - inputs.nixgl.overlay - (final: prev: { - waybar = inputs.waybar.packages.${system}.default; - lxappearance = prev.lxappearance.overrideAttrs (oldAttrs: { - postInstall = '' - wrapProgram $out/bin/lxappearance --prefix GDK_BACKEND : x11 - ''; - }); - opensnitch-ui = prev.opensnitch-ui.overrideAttrs (oldAttrs: { - propagatedBuildInputs = oldAttrs.propagatedBuildInputs - ++ [ prev.python311Packages.qt-material ]; - }); - }) + formatting = + pkgs.runCommand "check-dot-file-formatting" + { + buildInputs = with pkgs; [ + findutils + inputs.Fmt.packages.x86_64-linux.default ]; - home = { - username = "${username}"; - homeDirectory = "/home/${username}"; - stateVersion = "24.05"; - }; - }) - ./config - ]; + } + '' + set -euo pipefail + cd ${self} + Fmt -- $(find . -type f) + printf "TEST COMPLETED!\n" > $out + ''; + }; + homeConfigurations.${username} = home-manager.lib.homeManagerConfiguration { + inherit pkgs; + extraSpecialArgs = { + inherit inputs; + inherit self; }; - } // inputs.flake-utils.lib.eachDefaultSystem (system: + modules = [ + ({ + imports = [ inputs.agenix.homeManagerModules.default ]; + nixpkgs.overlays = [ + inputs.neovim-nightly-overlay.overlay + inputs.bob.overlays.default + inputs.Fmt.overlays.default + inputs.kanagawa-gtk.overlays.default + inputs.nixgl.overlay + (final: prev: { + waybar = inputs.waybar.packages.${system}.default; + lxappearance = prev.lxappearance.overrideAttrs (oldAttrs: { + postInstall = '' + wrapProgram $out/bin/lxappearance --prefix GDK_BACKEND : x11 + ''; + }); + opensnitch-ui = prev.opensnitch-ui.overrideAttrs (oldAttrs: { + propagatedBuildInputs = oldAttrs.propagatedBuildInputs ++ [ prev.python311Packages.qt-material ]; + }); + }) + ]; + home = { + username = "${username}"; + homeDirectory = "/home/${username}"; + stateVersion = "24.05"; + }; + }) + ./config + ]; + }; + } + // inputs.flake-utils.lib.eachDefaultSystem ( + system: let pkgs = import nixpkgs { inherit system; overlays = [ inputs.agenix.overlays.default ]; }; - in { + in + { devShells.default = pkgs.mkShell { packages = with pkgs; [ age @@ -113,5 +124,6 @@ export RULES="$PWD/secrets/secrets.nix" ''; }; - }); + } + ); } diff --git a/lib/default.nix b/lib/default.nix index e771a4f6..e0341f40 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -1,31 +1,40 @@ # Some of these functions were taken from https://github.com/NixOS/nixpkgs/blob/master/lib/ -{ lib ? (import { }).lib }: rec { - hasSuffix = suffix: string: +{ + lib ? (import { }).lib, +}: +rec { + hasSuffix = + suffix: string: let lenSuffix = builtins.stringLength suffix; lenString = builtins.stringLength string; - in (lenString >= lenSuffix - && (builtins.substring (lenString - lenSuffix) lenString string) - == suffix); - recurseDir = dir: - let dirContents = builtins.readDir dir; - in (builtins.concatMap (dirItem: + in + (lenString >= lenSuffix && (builtins.substring (lenString - lenSuffix) lenString string) == suffix); + recurseDir = + dir: + let + dirContents = builtins.readDir dir; + in + (builtins.concatMap ( + dirItem: let itemType = builtins.getAttr dirItem dirContents; itemPath = dir + "/${dirItem}"; - in if itemType == "directory" then - (recurseDir itemPath) - else - [ itemPath ]) (builtins.attrNames dirContents)); - recurseFilesInDir = dir: suffix: - (builtins.filter (file: hasSuffix "${suffix}" file) (recurseDir dir)); - recurseFilesInDirs = dirs: suffix: - (builtins.concatMap (dir: (recurseFilesInDir dir "${suffix}")) dirs); + in + if itemType == "directory" then (recurseDir itemPath) else [ itemPath ] + ) (builtins.attrNames dirContents)); + recurseFilesInDir = + dir: suffix: (builtins.filter (file: hasSuffix "${suffix}" file) (recurseDir dir)); + recurseFilesInDirs = + dirs: suffix: (builtins.concatMap (dir: (recurseFilesInDir dir "${suffix}")) dirs); # Full credit to https://stackoverflow.com/questions/54504685/nix-function-to-merge-attributes-records-recursively-and-concatenate-arrays/54505212#54505212 - recursiveMerge = attrList: + recursiveMerge = + attrList: let - f = attrPath: - lib.zipAttrsWith (n: values: + f = + attrPath: + lib.zipAttrsWith ( + n: values: if lib.tail values == [ ] then lib.head values else if lib.all builtins.isList values then @@ -33,6 +42,8 @@ else if lib.all builtins.isAttrs values then f (attrPath ++ [ n ]) values else - lib.last values); - in f [ ] attrList; + lib.last values + ); + in + f [ ] attrList; } diff --git a/pkgs/Fmt/flake.nix b/pkgs/Fmt/flake.nix index ddd07a9c..851989c3 100644 --- a/pkgs/Fmt/flake.nix +++ b/pkgs/Fmt/flake.nix @@ -6,10 +6,18 @@ flake-utils.url = "github:numtide/flake-utils"; }; - outputs = { self, nixpkgs, flake-utils }: - flake-utils.lib.eachDefaultSystem (system: - let pkgs = nixpkgs.legacyPackages.${system}; - in { + outputs = + { + self, + nixpkgs, + flake-utils, + }: + flake-utils.lib.eachDefaultSystem ( + system: + let + pkgs = nixpkgs.legacyPackages.${system}; + in + { packages.default = pkgs.writeShellApplication { name = "Fmt"; runtimeInputs = with pkgs; [ @@ -19,13 +27,16 @@ nodePackages.prettier shfmt ]; - text = ('' - #!${pkgs.bash}/bin/bash - '' + builtins.readFile ./fmt.bash); + text = ( + '' + #!${pkgs.bash}/bin/bash + '' + + builtins.readFile ./fmt.bash + ); }; - }) // { - overlays.default = final: prev: { - Fmt = self.packages.${final.system}.default; - }; - }; + } + ) + // { + overlays.default = final: prev: { Fmt = self.packages.${final.system}.default; }; + }; } diff --git a/pkgs/bob-nvim/flake.nix b/pkgs/bob-nvim/flake.nix index cf768e81..f33e4376 100644 --- a/pkgs/bob-nvim/flake.nix +++ b/pkgs/bob-nvim/flake.nix @@ -10,15 +10,29 @@ flake-utils.url = "github:numtide/flake-utils"; }; - outputs = { self, nixpkgs, flake-utils, bob }: - flake-utils.lib.eachDefaultSystem (system: + outputs = + { + self, + nixpkgs, + flake-utils, + bob, + }: + flake-utils.lib.eachDefaultSystem ( + system: let pkgs = nixpkgs.legacyPackages.${system}; rust-toolchain = pkgs.symlinkJoin { name = "rust-toolchain"; - paths = with pkgs; [ rustc cargo cargo-watch rust-analyzer rustfmt ]; + paths = with pkgs; [ + rustc + cargo + cargo-watch + rust-analyzer + rustfmt + ]; }; - in rec { + in + rec { # This builds the blog binary then runs it and collects the output. Once done it throws away the binary and # shoves the newly created static site into the result. packages.default = pkgs.rustPlatform.buildRustPackage { @@ -36,9 +50,9 @@ ''; nativeBuildInputs = [ rust-toolchain ]; }; - }) // { - overlays.default = final: prev: { - bob-nvim = self.packages.${final.system}.default; - }; - }; + } + ) + // { + overlays.default = final: prev: { bob-nvim = self.packages.${final.system}.default; }; + }; } diff --git a/pkgs/kanagawa-gtk/flake.nix b/pkgs/kanagawa-gtk/flake.nix index 862d16cd..5b3cd605 100644 --- a/pkgs/kanagawa-gtk/flake.nix +++ b/pkgs/kanagawa-gtk/flake.nix @@ -10,12 +10,20 @@ flake-utils.url = "github:numtide/flake-utils"; }; - outputs = { self, nixpkgs, flake-utils, kanagawa-gtk }: - flake-utils.lib.eachDefaultSystem (system: + outputs = + { + self, + nixpkgs, + flake-utils, + kanagawa-gtk, + }: + flake-utils.lib.eachDefaultSystem ( + system: let pkgs = nixpkgs.legacyPackages.${system}; lib = nixpkgs.lib; - in rec { + in + rec { # This builds the blog binary then runs it and collects the output. Once done it throws away the binary and # shoves the newly created static site into the result. packages.kanagawa-gtk-theme = pkgs.stdenvNoCC.mkDerivation rec { @@ -35,13 +43,11 @@ runHook postInstall ''; meta = with lib; { - description = - "A GTK theme with the Kanagawa colour palette. Borrowed with ❤️ from https://github.com/NixOS/nixpkgs/pull/277073."; + description = "A GTK theme with the Kanagawa colour palette. Borrowed with ❤️ from https://github.com/NixOS/nixpkgs/pull/277073."; homepage = "https://github.com/Fausto-Korpsvart/Kanagawa-GKT-Theme"; license = licenses.gpl3Only; platforms = platforms.all; }; - }; packages.default = packages.kanagawa-gtk-theme; @@ -70,8 +76,7 @@ ''; meta = with lib; { - description = - "An icon theme for the Kanagawa colour palette. Borrowed with ❤️ from https://github.com/NixOS/nixpkgs/pull/277073."; + description = "An icon theme for the Kanagawa colour palette. Borrowed with ❤️ from https://github.com/NixOS/nixpkgs/pull/277073."; homepage = "https://github.com/Fausto-Korpsvart/Kanagawa-GKT-Theme"; license = licenses.gpl3Only; platforms = platforms.all; @@ -79,11 +84,12 @@ }; # Rust dev environment - }) // { - overlays.default = final: prev: { - kanagawa-gtk-theme = self.packages.${final.system}.kanagawa-gtk-theme; - kanagawa-gtk-icon-theme = - self.packages.${final.system}.kanagwa-icon-theme; - }; + } + ) + // { + overlays.default = final: prev: { + kanagawa-gtk-theme = self.packages.${final.system}.kanagawa-gtk-theme; + kanagawa-gtk-icon-theme = self.packages.${final.system}.kanagwa-icon-theme; }; + }; } diff --git a/secrets/default.nix b/secrets/default.nix index f0a107e6..c60f5e71 100644 --- a/secrets/default.nix +++ b/secrets/default.nix @@ -1,16 +1,30 @@ -{ agenix ? true, lib ? import ../lib { } }: +{ + agenix ? true, + lib ? import ../lib { }, +}: let keys = [ "age1yubikey1qfnj0k4mkzrn8ef5llwh2sv6hd7ckr0qml3n9hzdpz9c59ypvryhyst87k0" "age1ur2lr3z6d2eftgxcalc6s5x9840ew9x43upl9k23wg0ugacrn5as4zl6sj" ]; - secrets = let dir = "files"; in { }; -in if agenix then - (builtins.listToAttrs (builtins.concatMap (secretName: [{ - name = builtins.toString secretName; - value.publicKeys = keys; - }]) (builtins.attrNames secrets))) + secrets = + let + dir = "files"; + in + { }; +in +if agenix then + (builtins.listToAttrs ( + builtins.concatMap (secretName: [ + { + name = builtins.toString secretName; + value.publicKeys = keys; + } + ]) (builtins.attrNames secrets) + )) else - (lib.recursiveMerge (builtins.map (secretName: { - age.secrets.${secretName}.file = ./${secrets.${secretName}}; - }) (builtins.attrNames secrets))) + (lib.recursiveMerge ( + builtins.map (secretName: { age.secrets.${secretName}.file = ./${secrets.${secretName}}; }) ( + builtins.attrNames secrets + ) + ))