From 68f969ec5992f725622e7a47b0f45c70580dd848 Mon Sep 17 00:00:00 2001 From: Emile Clark-Boman Date: Wed, 30 Oct 2024 13:51:36 +1000 Subject: [PATCH 001/328] da first commit --- .gitignore | 0 README | 19 + deploy.sh | 1 + flake.lock | 392 ++++++++++++++++++++ flake.nix | 70 ++++ homes/me/default.nix | 0 hosts/lolcathost/default.nix | 112 ++++++ hosts/lolcathost/hardware-configuration.nix | 1 + hosts/myputer/default.nix | 147 ++++++++ hosts/myputer/hardware-configuration.nix | 41 ++ hosts/myputer/sddm-theme.nix | 35 ++ modules/core/bluetooth.nix | 12 + modules/core/garbage-collector.nix | 16 + modules/core/pipewire.nix | 29 ++ 14 files changed, 875 insertions(+) create mode 100644 .gitignore create mode 100644 README create mode 100755 deploy.sh create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 homes/me/default.nix create mode 100644 hosts/lolcathost/default.nix create mode 100644 hosts/lolcathost/hardware-configuration.nix create mode 100644 hosts/myputer/default.nix create mode 100644 hosts/myputer/hardware-configuration.nix create mode 100644 hosts/myputer/sddm-theme.nix create mode 100644 modules/core/bluetooth.nix create mode 100644 modules/core/garbage-collector.nix create mode 100644 modules/core/pipewire.nix diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/README b/README new file mode 100644 index 0000000..0068d79 --- /dev/null +++ b/README @@ -0,0 +1,19 @@ +### Philosophy +I try to use Home Manager as little as possible. When I first started with NixOS I found +it distracting and confusing. NixOS already handles system wide and user packages, so having +another user level package management method was baffling. Obviously I understand now how +it can be useful (so I do use it). But where possible I will instead use the functionality +of Nix rather than Home Manager. + + +### TODO +There are a lot of `TODO` items in this repository. To improve these dotfiles +I should run a command to find files containing "TODO" and then implement the +recommendation I left behind :) + + + + +### Credits +1. https://github.com/XNM1/linux-nixos-hyprland-config-dotfiles +The simplicity of their layout is amazing, was really good to pick out small modules and learn how something works / is configured. diff --git a/deploy.sh b/deploy.sh new file mode 100755 index 0000000..6fe9c3f --- /dev/null +++ b/deploy.sh @@ -0,0 +1 @@ +sudo nixos-rebuild switch --flake ./ diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..c2e5529 --- /dev/null +++ b/flake.lock @@ -0,0 +1,392 @@ +{ + "nodes": { + "aquamarine": { + "inputs": { + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "hyprwayland-scanner": [ + "hyprland", + "hyprwayland-scanner" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1729527199, + "narHash": "sha256-D5/YksfRga8Akd04ZtIkuYSIOjXVrAzQIQBSeplokzU=", + "owner": "hyprwm", + "repo": "aquamarine", + "rev": "8d732fa8aff8b12ef2b1e2f00fc8153e41312b72", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "aquamarine", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "gitignore": { + "inputs": { + "nixpkgs": [ + "hyprland", + "pre-commit-hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1709087332, + "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, + "home-manager": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1729551526, + "narHash": "sha256-7LAGY32Xl14OVQp3y6M43/0AtHYYvV6pdyBcp3eoz0s=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "5ec753a1fc4454df9285d8b3ec0809234defb975", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "home-manager", + "type": "github" + } + }, + "hyprcursor": { + "inputs": { + "hyprlang": [ + "hyprland", + "hyprlang" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1728669738, + "narHash": "sha256-EDNAU9AYcx8OupUzbTbWE1d3HYdeG0wO6Msg3iL1muk=", + "owner": "hyprwm", + "repo": "hyprcursor", + "rev": "0264e698149fcb857a66a53018157b41f8d97bb0", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprcursor", + "type": "github" + } + }, + "hyprland": { + "inputs": { + "aquamarine": "aquamarine", + "hyprcursor": "hyprcursor", + "hyprland-protocols": "hyprland-protocols", + "hyprlang": "hyprlang", + "hyprutils": "hyprutils", + "hyprwayland-scanner": "hyprwayland-scanner", + "nixpkgs": "nixpkgs", + "pre-commit-hooks": "pre-commit-hooks", + "systems": "systems", + "xdph": "xdph" + }, + "locked": { + "lastModified": 1729657195, + "narHash": "sha256-YGk7oeyyfvZs4d8qAyMBPg2J/euYK48hPiI6PLKEa30=", + "owner": "hyprwm", + "repo": "Hyprland", + "rev": "6e0aadc585c6d9fdaaebfa5853adbf9610897c82", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "Hyprland", + "type": "github" + } + }, + "hyprland-protocols": { + "inputs": { + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1728345020, + "narHash": "sha256-xGbkc7U/Roe0/Cv3iKlzijIaFBNguasI31ynL2IlEoM=", + "owner": "hyprwm", + "repo": "hyprland-protocols", + "rev": "a7c183800e74f337753de186522b9017a07a8cee", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprland-protocols", + "type": "github" + } + }, + "hyprlang": { + "inputs": { + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1728168612, + "narHash": "sha256-AnB1KfiXINmuiW7BALYrKqcjCnsLZPifhb/7BsfPbns=", + "owner": "hyprwm", + "repo": "hyprlang", + "rev": "f054f2e44d6a0b74607a6bc0f52dba337a3db38e", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprlang", + "type": "github" + } + }, + "hyprutils": { + "inputs": { + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1728941256, + "narHash": "sha256-WRypmcZ2Bw94lLmcmxYokVOHPJSZ7T06V49QZ4tkZeQ=", + "owner": "hyprwm", + "repo": "hyprutils", + "rev": "fd4be8b9ca932f7384e454bcd923c5451ef2aa85", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprutils", + "type": "github" + } + }, + "hyprwayland-scanner": { + "inputs": { + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1726874836, + "narHash": "sha256-VKR0sf0PSNCB0wPHVKSAn41mCNVCnegWmgkrneKDhHM=", + "owner": "hyprwm", + "repo": "hyprwayland-scanner", + "rev": "500c81a9e1a76760371049a8d99e008ea77aa59e", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprwayland-scanner", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1729413321, + "narHash": "sha256-I4tuhRpZFa6Fu6dcH9Dlo5LlH17peT79vx1y1SpeKt0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "1997e4aa514312c1af7e2bda7fad1644e778ff26", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-stable": { + "locked": { + "lastModified": 1720386169, + "narHash": "sha256-NGKVY4PjzwAa4upkGtAMz1npHGoRzWotlSnVlqI40mo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "194846768975b7ad2c4988bdb82572c00222c0d7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-24.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1729413321, + "narHash": "sha256-I4tuhRpZFa6Fu6dcH9Dlo5LlH17peT79vx1y1SpeKt0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "1997e4aa514312c1af7e2bda7fad1644e778ff26", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "pre-commit-hooks": { + "inputs": { + "flake-compat": "flake-compat", + "gitignore": "gitignore", + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "nixpkgs-stable": "nixpkgs-stable" + }, + "locked": { + "lastModified": 1729104314, + "narHash": "sha256-pZRZsq5oCdJt3upZIU4aslS9XwFJ+/nVtALHIciX/BI=", + "owner": "cachix", + "repo": "git-hooks.nix", + "rev": "3c3e88f0f544d6bb54329832616af7eb971b6be6", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "git-hooks.nix", + "type": "github" + } + }, + "root": { + "inputs": { + "home-manager": "home-manager", + "hyprland": "hyprland", + "nixpkgs": "nixpkgs_2" + } + }, + "systems": { + "locked": { + "lastModified": 1689347949, + "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", + "owner": "nix-systems", + "repo": "default-linux", + "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default-linux", + "type": "github" + } + }, + "xdph": { + "inputs": { + "hyprland-protocols": [ + "hyprland", + "hyprland-protocols" + ], + "hyprlang": [ + "hyprland", + "hyprlang" + ], + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "hyprwayland-scanner": [ + "hyprland", + "hyprwayland-scanner" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1728166987, + "narHash": "sha256-w6dVTguAn9zJ+7aPOhBQgDz8bn6YZ7b56cY8Kg5HJRI=", + "owner": "hyprwm", + "repo": "xdg-desktop-portal-hyprland", + "rev": "fb9c8d665af0588bb087f97d0f673ddf0d501787", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "xdg-desktop-portal-hyprland", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..b308364 --- /dev/null +++ b/flake.nix @@ -0,0 +1,70 @@ +{ + description = "Emile's Nix Dotfiles"; + + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + + home-manager = { + url = "github:nix-community/home-manager"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + hyprland.url = "github:hyprwm/Hyprland"; + }; + + outputs = { + self, + nixpkgs, + home-manager, + hyprland, + ... + }@inputs: + let + system = "x86_64-linux"; + #system = pkgs.stdenv.hostPlatform.system; + + pkgs = import nixpkgs { + inherit system; + + #config = { + # allowUnfree = true; + #}; + }; + + # this is just something I'm experimenting with + PROJECT_ROOT = builtins.toString ./.; + + in { + nixosConfigurations = { + # i be on my puter fr + myputer = nixpkgs.lib.nixosSystem { + modules = [ + ./hosts/myputer + ]; + specialArgs = { + inherit inputs system; # inherit inputs outputs; + }; + }; + + # my laptop 0w0 + #lolcathost = nixpkgs.lib.nixosSystem { + # modules = [ + # ./hosts/lolcathost + # ]; + # specialArgs = { + # inherit system; # inherit inputs outputs; + # }; + #}; + }; + + homeConfigurations = { + me = home-manager.lib.homeManagerConfiguration { + inherit pkgs; + + modules = [ + ./home/emile # ./home/me + ]; + }; + }; + }; +} diff --git a/homes/me/default.nix b/homes/me/default.nix new file mode 100644 index 0000000..e69de29 diff --git a/hosts/lolcathost/default.nix b/hosts/lolcathost/default.nix new file mode 100644 index 0000000..93ee8e1 --- /dev/null +++ b/hosts/lolcathost/default.nix @@ -0,0 +1,112 @@ +{ + pkgs, + inputs, + ... +}: { + imports = [ + ./hardware-configuration.nix + ]; + + # Use the systemd-boot EFI boot loader. + # TODO: use GRUB2 instead + boot.loader.systemd-boot.enable = true; + boot.loader.efi.canTouchEfiVariables = true; + #boot.loader = { + # efi = { + # canTouchEfiVariables = true; + # efiSysMountPoint = "/boot/efi"; + # }; + # grub = { + # efiSupport = true; + # #efiInstallAsRemovable = true; # in case canTouchEfiVariables doesn't work on this system + # device = "nodev"; + # }; + #}; + + networking.hostName = "myputer"; + # Pick only one of the below networking options. + # networking.wireless.enable = true; # Enables wireless support via wpa_supplicant. + networking.networkmanager.enable = true; # Easiest to use and most distros use this by default. + + # Set your time zone. + time.timeZone = "Australia/Brisbane"; + + # Select internationalisation properties. + i18n.defaultLocale = "en_US.UTF-8"; + console = { + font = "Lat2-Terminus16"; + keyMap = "us"; + #useXkbConfig = true; # use xkb.options in tty. + }; + + # Enable sound. + #services.pipewire = { + # enable = true; + # pulse.enable = true; + #}; + + # Enable touchpad support (enabled default in most desktopManager). + # services.libinput.enable = true; + + # Define a user account. Don't forget to set a password with ‘passwd’. + users.users.emile = { + isNormalUser = true; + extraGroups = [ "wheel" ]; # Enable ‘sudo’ for the user. + packages = with pkgs; [ + #firefox + tree + ]; + }; + + # List packages installed in system profile. To search, run: + # $ nix search wget + environment.systemPackages = with pkgs; [ + vim + wget + ]; + + # Some programs need SUID wrappers, can be configured further or are + # started in user sessions. + # programs.mtr.enable = true; + # programs.gnupg.agent = { + # enable = true; + # enableSSHSupport = true; + # }; + + # List services that you want to enable: + + # Enable the OpenSSH daemon. + # services.openssh.enable = true; + + # Open ports in the firewall. + # networking.firewall.allowedTCPPorts = [ ... ]; + # networking.firewall.allowedUDPPorts = [ ... ]; + # Or disable the firewall altogether. + # networking.firewall.enable = false; + + # Copy the NixOS configuration file and link it from the resulting system + # (/run/current-system/configuration.nix). This is useful in case you + # accidentally delete configuration.nix. + # system.copySystemConfiguration = true; + + # This option defines the first version of NixOS you have installed on this particular machine, + # and is used to maintain compatibility with application data (e.g. databases) created on older NixOS versions. + # + # Most users should NEVER change this value after the initial install, for any reason, + # even if you've upgraded your system to a new NixOS release. + # + # This value does NOT affect the Nixpkgs version your packages and OS are pulled from, + # so changing it will NOT upgrade your system - see https://nixos.org/manual/nixos/stable/#sec-upgrading for how + # to actually do that. + # + # This value being lower than the current NixOS release does NOT mean your system is + # out of date, out of support, or vulnerable. + # + # Do NOT change this value unless you have manually inspected all the changes it would make to your configuration, + # and migrated your data accordingly. + # + # For more information, see `man configuration.nix` or https://nixos.org/manual/nixos/stable/options#opt-system.stateVersion . + system.stateVersion = "24.05"; # Did you read the comment? + +} + diff --git a/hosts/lolcathost/hardware-configuration.nix b/hosts/lolcathost/hardware-configuration.nix new file mode 100644 index 0000000..9892c37 --- /dev/null +++ b/hosts/lolcathost/hardware-configuration.nix @@ -0,0 +1 @@ +# TODO: (i haven't put NixOS on lolcathost yet) diff --git a/hosts/myputer/default.nix b/hosts/myputer/default.nix new file mode 100644 index 0000000..6475c09 --- /dev/null +++ b/hosts/myputer/default.nix @@ -0,0 +1,147 @@ +{ + pkgs, + inputs, + ... +}: { + imports = [ + ./hardware-configuration.nix + ]; + + # Use the systemd-boot EFI boot loader. + # TODO: use GRUB2 instead + boot.loader.systemd-boot.enable = true; + boot.loader.efi.canTouchEfiVariables = true; + #boot.loader = { + # efi = { + # canTouchEfiVariables = true; + # efiSysMountPoint = "/boot/efi"; + # }; + # grub = { + # efiSupport = true; + # #efiInstallAsRemovable = true; # in case canTouchEfiVariables doesn't work on this system + # device = "nodev"; + # }; + #}; + + # Set your time zone. + time.timeZone = "Australia/Brisbane"; + + # Select internationalisation properties. + i18n.defaultLocale = "en_US.UTF-8"; + console = { + font = "Lat2-Terminus16"; + keyMap = "us"; + #useXkbConfig = true; # use xkb.options in tty. + }; + + + # ----- NETWORKING SECTION ----- + networking.hostName = "myputer"; + # Pick only one of the below networking options. + # networking.wireless.enable = true; # Enables wireless support via wpa_supplicant. + networking.networkmanager.enable = true; # Easiest to use and most distros use this by default. + + # Open ports in the firewall. + # networking.firewall.allowedTCPPorts = [ ... ]; + # networking.firewall.allowedUDPPorts = [ ... ]; + # Or disable the firewall altogether. + networking.firewall.enable = true; + + + # ----- SERVICES ----- + services = { + # Set display manager (login screen) + displayManager = { + sddm = { + enable = true; + theme = "${import ./sddm-theme.nix { inherit pkgs; }}"; + # enable experimental sddm support for wayland + wayland.enable = true; + }; + defaultSession = "hyprland"; + }; + + # Enable sound + # TODO: use the modules/core/pipewire.nix module instead :) + pipewire = { + enable = true; + pulse.enable = true; + }; + }; + + users.users = { + # just me fr (personal account) + me = { + isNormalUser = true; + extraGroups = [ "wheel" ]; + shell = pkgs.fish; + packages = with pkgs; [ + firefox + nitch + tldr + tree + ]; + }; + + # programming/development account + dev = { + isNormalUser = true; + extraGroups = [ "wheel" ]; + shell = pkgs.zsh; + packages = with pkgs; [ + tree + ]; + }; + + # user for my professional jobs and stuff + pro = { + isNormalUser = true; + extraGroups = [ "wheel" ]; + shell = pkgs.fish; + packages = with pkgs; [ + tree + ]; + }; + }; + # new users will use zsh by default + users.defaultUserShell = pkgs.bash; + + # ---- SYSTEM PACKAGES ----- + environment.systemPackages = with pkgs; [ + vim + wget + kitty + git + ]; + + + # Enable the use of certain programs + programs = { + hyprland.enable = true; + fish.enable = true; + zsh.enable = true; + }; + + # Enable the new CLI commands and the flakes as experimental features + nix.settings.experimental-features = [ + "nix-command" + "flakes" + ]; + + # Some programs need SUID wrappers, can be configured further or are + # started in user sessions. + # programs.mtr.enable = true; + # programs.gnupg.agent = { + # enable = true; + # enableSSHSupport = true; + # }; + + # Enable the OpenSSH daemon. + # services.openssh.enable = true; + + + # DO NOT MODIFY + system.stateVersion = "24.05"; # Did you read the comment? + +} + diff --git a/hosts/myputer/hardware-configuration.nix b/hosts/myputer/hardware-configuration.nix new file mode 100644 index 0000000..46551ec --- /dev/null +++ b/hosts/myputer/hardware-configuration.nix @@ -0,0 +1,41 @@ +# 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, ... }: + +{ + imports = + [ (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "ahci" "usb_storage" "usbhid" "sd_mod" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-amd" ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = + { device = "/dev/disk/by-uuid/ff19e1b0-cacc-4270-a94b-7922f7224ae2"; + fsType = "ext4"; + }; + + fileSystems."/boot" = + { device = "/dev/disk/by-uuid/7046-177A"; + fsType = "vfat"; + options = [ "fmask=0077" "dmask=0077" ]; + }; + + swapDevices = + [ { device = "/dev/disk/by-uuid/7f7e9d69-78e0-49f1-b792-6be26ed8e040"; } + ]; + + # Enables DHCP on each ethernet and wireless interface. In case of scripted networking + # (the default) this is the recommended approach. When using systemd-networkd it's + # still possible to use this option, but it's recommended to use it in conjunction + # with explicit per-interface declarations with `networking.interfaces..useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.enp34s0.useDHCP = lib.mkDefault true; + # networking.interfaces.wlp38s0.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/hosts/myputer/sddm-theme.nix b/hosts/myputer/sddm-theme.nix new file mode 100644 index 0000000..d60c046 --- /dev/null +++ b/hosts/myputer/sddm-theme.nix @@ -0,0 +1,35 @@ +{ pkgs }: + +let + #image = pkgs.fetchurl { + # url = "https://"; + # sha256 = ""; + #}; +in +pkgs.stdenv.mkDerivation { + name = "sddm-theme"; + src = pkgs.fetchFromGitHub { + owner = "MarianArlt"; + repo = "sddm-sugar-dark"; + rev = "ceb2c455663429be03ba62d9f898c571650ef7fe"; + sha256 = "0153z1kylbhc9d12nxy9vpn0spxgrhgy36wy37pk6ysq7akaqlvy"; + }; + # dependencies + buildInputs = with pkgs.libsForQt5; [ + qt5.qtbase + qt5.qtx11extras + qt5.qtquickcontrols2 + qt5.qtgraphicaleffects + qt5.wrapQtAppsHook + #libsForQt5.qt5.qtquickcontrols2 + #libsForQt5.qt5.qtgraphicaleffects + ]; + installPhase = '' + # move necessary files + mkdir -p $out + cp -R ./* $out/ + ''; + # set background + #rm $out/Background.jpg + #mv ${image} $out/Background.jpg +} diff --git a/modules/core/bluetooth.nix b/modules/core/bluetooth.nix new file mode 100644 index 0000000..400abfc --- /dev/null +++ b/modules/core/bluetooth.nix @@ -0,0 +1,12 @@ +{ pkgs, ... }: + +{ + # Enable Bluetooth + hardware.bluetooth.enable = true; + hardware.bluetooth.powerOnBoot = false; + + # TODO: this should be managed by home-manager + environment.systemPackages = with pkgs; [ + overskride + ]; +} diff --git a/modules/core/garbage-collector.nix b/modules/core/garbage-collector.nix new file mode 100644 index 0000000..683602b --- /dev/null +++ b/modules/core/garbage-collector.nix @@ -0,0 +1,16 @@ +{ ... }: + +{ + # Optimize storage and automatic scheduled GC running + # If you want to run GC manually, use commands: + # `nix-store --optimize` for finding and eliminating redundant copies of identical store paths + # `nix-store --gc` for optimizing the nix store and removing unreferenced and obsolete store paths + # `nix-collect-garbage -d` for deleting old generations of user profiles + nix.settings.auto-optimise-store = true; + nix.optimise.automatic = true; + nix.gc = { + automatic = true; + dates = "weekly"; + options = "--delete-older-than 14d"; + }; +} diff --git a/modules/core/pipewire.nix b/modules/core/pipewire.nix new file mode 100644 index 0000000..d3d1852 --- /dev/null +++ b/modules/core/pipewire.nix @@ -0,0 +1,29 @@ +# Credit: https://github.com/XNM1/linux-nixos-hyprland-config-dotfiles/ +{ pkgs, ... }: + +{ + # Enable sound with pipewire. + hardware.pulseaudio.enable = false; + security.rtkit.enable = true; + services.pipewire = { + enable = true; + + alsa.enable = true; + alsa.support32Bit = true; + pulse.enable = true; + jack.enable = true; + + wireplumber.enable = true; + + # use the example session manager (no others are packaged yet so this is enabled by default, + # no need to redefine it in your config for now) + # media-session.enable = true; + }; + + # TODO: these should instead be manager but home-manager + environment.systemPackages = with pkgs; [ + helvum + easyeffects + ]; +} + From 92c471b9e1ef13300de30c1c8f32d404967d1233 Mon Sep 17 00:00:00 2001 From: _cry64 Date: Wed, 30 Oct 2024 13:51:36 +1000 Subject: [PATCH 002/328] da first commit --- .gitignore | 0 README | 19 + deploy.sh | 1 + flake.lock | 392 ++++++++++++++++++++ flake.nix | 70 ++++ homes/me/default.nix | 0 hosts/lolcathost/default.nix | 112 ++++++ hosts/lolcathost/hardware-configuration.nix | 1 + hosts/myputer/default.nix | 147 ++++++++ hosts/myputer/hardware-configuration.nix | 41 ++ hosts/myputer/sddm-theme.nix | 35 ++ modules/core/bluetooth.nix | 12 + modules/core/garbage-collector.nix | 16 + modules/core/pipewire.nix | 29 ++ 14 files changed, 875 insertions(+) create mode 100644 .gitignore create mode 100644 README create mode 100755 deploy.sh create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 homes/me/default.nix create mode 100644 hosts/lolcathost/default.nix create mode 100644 hosts/lolcathost/hardware-configuration.nix create mode 100644 hosts/myputer/default.nix create mode 100644 hosts/myputer/hardware-configuration.nix create mode 100644 hosts/myputer/sddm-theme.nix create mode 100644 modules/core/bluetooth.nix create mode 100644 modules/core/garbage-collector.nix create mode 100644 modules/core/pipewire.nix diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/README b/README new file mode 100644 index 0000000..0068d79 --- /dev/null +++ b/README @@ -0,0 +1,19 @@ +### Philosophy +I try to use Home Manager as little as possible. When I first started with NixOS I found +it distracting and confusing. NixOS already handles system wide and user packages, so having +another user level package management method was baffling. Obviously I understand now how +it can be useful (so I do use it). But where possible I will instead use the functionality +of Nix rather than Home Manager. + + +### TODO +There are a lot of `TODO` items in this repository. To improve these dotfiles +I should run a command to find files containing "TODO" and then implement the +recommendation I left behind :) + + + + +### Credits +1. https://github.com/XNM1/linux-nixos-hyprland-config-dotfiles +The simplicity of their layout is amazing, was really good to pick out small modules and learn how something works / is configured. diff --git a/deploy.sh b/deploy.sh new file mode 100755 index 0000000..6fe9c3f --- /dev/null +++ b/deploy.sh @@ -0,0 +1 @@ +sudo nixos-rebuild switch --flake ./ diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..c2e5529 --- /dev/null +++ b/flake.lock @@ -0,0 +1,392 @@ +{ + "nodes": { + "aquamarine": { + "inputs": { + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "hyprwayland-scanner": [ + "hyprland", + "hyprwayland-scanner" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1729527199, + "narHash": "sha256-D5/YksfRga8Akd04ZtIkuYSIOjXVrAzQIQBSeplokzU=", + "owner": "hyprwm", + "repo": "aquamarine", + "rev": "8d732fa8aff8b12ef2b1e2f00fc8153e41312b72", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "aquamarine", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "gitignore": { + "inputs": { + "nixpkgs": [ + "hyprland", + "pre-commit-hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1709087332, + "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, + "home-manager": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1729551526, + "narHash": "sha256-7LAGY32Xl14OVQp3y6M43/0AtHYYvV6pdyBcp3eoz0s=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "5ec753a1fc4454df9285d8b3ec0809234defb975", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "home-manager", + "type": "github" + } + }, + "hyprcursor": { + "inputs": { + "hyprlang": [ + "hyprland", + "hyprlang" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1728669738, + "narHash": "sha256-EDNAU9AYcx8OupUzbTbWE1d3HYdeG0wO6Msg3iL1muk=", + "owner": "hyprwm", + "repo": "hyprcursor", + "rev": "0264e698149fcb857a66a53018157b41f8d97bb0", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprcursor", + "type": "github" + } + }, + "hyprland": { + "inputs": { + "aquamarine": "aquamarine", + "hyprcursor": "hyprcursor", + "hyprland-protocols": "hyprland-protocols", + "hyprlang": "hyprlang", + "hyprutils": "hyprutils", + "hyprwayland-scanner": "hyprwayland-scanner", + "nixpkgs": "nixpkgs", + "pre-commit-hooks": "pre-commit-hooks", + "systems": "systems", + "xdph": "xdph" + }, + "locked": { + "lastModified": 1729657195, + "narHash": "sha256-YGk7oeyyfvZs4d8qAyMBPg2J/euYK48hPiI6PLKEa30=", + "owner": "hyprwm", + "repo": "Hyprland", + "rev": "6e0aadc585c6d9fdaaebfa5853adbf9610897c82", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "Hyprland", + "type": "github" + } + }, + "hyprland-protocols": { + "inputs": { + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1728345020, + "narHash": "sha256-xGbkc7U/Roe0/Cv3iKlzijIaFBNguasI31ynL2IlEoM=", + "owner": "hyprwm", + "repo": "hyprland-protocols", + "rev": "a7c183800e74f337753de186522b9017a07a8cee", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprland-protocols", + "type": "github" + } + }, + "hyprlang": { + "inputs": { + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1728168612, + "narHash": "sha256-AnB1KfiXINmuiW7BALYrKqcjCnsLZPifhb/7BsfPbns=", + "owner": "hyprwm", + "repo": "hyprlang", + "rev": "f054f2e44d6a0b74607a6bc0f52dba337a3db38e", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprlang", + "type": "github" + } + }, + "hyprutils": { + "inputs": { + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1728941256, + "narHash": "sha256-WRypmcZ2Bw94lLmcmxYokVOHPJSZ7T06V49QZ4tkZeQ=", + "owner": "hyprwm", + "repo": "hyprutils", + "rev": "fd4be8b9ca932f7384e454bcd923c5451ef2aa85", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprutils", + "type": "github" + } + }, + "hyprwayland-scanner": { + "inputs": { + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1726874836, + "narHash": "sha256-VKR0sf0PSNCB0wPHVKSAn41mCNVCnegWmgkrneKDhHM=", + "owner": "hyprwm", + "repo": "hyprwayland-scanner", + "rev": "500c81a9e1a76760371049a8d99e008ea77aa59e", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprwayland-scanner", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1729413321, + "narHash": "sha256-I4tuhRpZFa6Fu6dcH9Dlo5LlH17peT79vx1y1SpeKt0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "1997e4aa514312c1af7e2bda7fad1644e778ff26", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-stable": { + "locked": { + "lastModified": 1720386169, + "narHash": "sha256-NGKVY4PjzwAa4upkGtAMz1npHGoRzWotlSnVlqI40mo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "194846768975b7ad2c4988bdb82572c00222c0d7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-24.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1729413321, + "narHash": "sha256-I4tuhRpZFa6Fu6dcH9Dlo5LlH17peT79vx1y1SpeKt0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "1997e4aa514312c1af7e2bda7fad1644e778ff26", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "pre-commit-hooks": { + "inputs": { + "flake-compat": "flake-compat", + "gitignore": "gitignore", + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "nixpkgs-stable": "nixpkgs-stable" + }, + "locked": { + "lastModified": 1729104314, + "narHash": "sha256-pZRZsq5oCdJt3upZIU4aslS9XwFJ+/nVtALHIciX/BI=", + "owner": "cachix", + "repo": "git-hooks.nix", + "rev": "3c3e88f0f544d6bb54329832616af7eb971b6be6", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "git-hooks.nix", + "type": "github" + } + }, + "root": { + "inputs": { + "home-manager": "home-manager", + "hyprland": "hyprland", + "nixpkgs": "nixpkgs_2" + } + }, + "systems": { + "locked": { + "lastModified": 1689347949, + "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", + "owner": "nix-systems", + "repo": "default-linux", + "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default-linux", + "type": "github" + } + }, + "xdph": { + "inputs": { + "hyprland-protocols": [ + "hyprland", + "hyprland-protocols" + ], + "hyprlang": [ + "hyprland", + "hyprlang" + ], + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "hyprwayland-scanner": [ + "hyprland", + "hyprwayland-scanner" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1728166987, + "narHash": "sha256-w6dVTguAn9zJ+7aPOhBQgDz8bn6YZ7b56cY8Kg5HJRI=", + "owner": "hyprwm", + "repo": "xdg-desktop-portal-hyprland", + "rev": "fb9c8d665af0588bb087f97d0f673ddf0d501787", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "xdg-desktop-portal-hyprland", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..b308364 --- /dev/null +++ b/flake.nix @@ -0,0 +1,70 @@ +{ + description = "Emile's Nix Dotfiles"; + + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + + home-manager = { + url = "github:nix-community/home-manager"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + hyprland.url = "github:hyprwm/Hyprland"; + }; + + outputs = { + self, + nixpkgs, + home-manager, + hyprland, + ... + }@inputs: + let + system = "x86_64-linux"; + #system = pkgs.stdenv.hostPlatform.system; + + pkgs = import nixpkgs { + inherit system; + + #config = { + # allowUnfree = true; + #}; + }; + + # this is just something I'm experimenting with + PROJECT_ROOT = builtins.toString ./.; + + in { + nixosConfigurations = { + # i be on my puter fr + myputer = nixpkgs.lib.nixosSystem { + modules = [ + ./hosts/myputer + ]; + specialArgs = { + inherit inputs system; # inherit inputs outputs; + }; + }; + + # my laptop 0w0 + #lolcathost = nixpkgs.lib.nixosSystem { + # modules = [ + # ./hosts/lolcathost + # ]; + # specialArgs = { + # inherit system; # inherit inputs outputs; + # }; + #}; + }; + + homeConfigurations = { + me = home-manager.lib.homeManagerConfiguration { + inherit pkgs; + + modules = [ + ./home/emile # ./home/me + ]; + }; + }; + }; +} diff --git a/homes/me/default.nix b/homes/me/default.nix new file mode 100644 index 0000000..e69de29 diff --git a/hosts/lolcathost/default.nix b/hosts/lolcathost/default.nix new file mode 100644 index 0000000..93ee8e1 --- /dev/null +++ b/hosts/lolcathost/default.nix @@ -0,0 +1,112 @@ +{ + pkgs, + inputs, + ... +}: { + imports = [ + ./hardware-configuration.nix + ]; + + # Use the systemd-boot EFI boot loader. + # TODO: use GRUB2 instead + boot.loader.systemd-boot.enable = true; + boot.loader.efi.canTouchEfiVariables = true; + #boot.loader = { + # efi = { + # canTouchEfiVariables = true; + # efiSysMountPoint = "/boot/efi"; + # }; + # grub = { + # efiSupport = true; + # #efiInstallAsRemovable = true; # in case canTouchEfiVariables doesn't work on this system + # device = "nodev"; + # }; + #}; + + networking.hostName = "myputer"; + # Pick only one of the below networking options. + # networking.wireless.enable = true; # Enables wireless support via wpa_supplicant. + networking.networkmanager.enable = true; # Easiest to use and most distros use this by default. + + # Set your time zone. + time.timeZone = "Australia/Brisbane"; + + # Select internationalisation properties. + i18n.defaultLocale = "en_US.UTF-8"; + console = { + font = "Lat2-Terminus16"; + keyMap = "us"; + #useXkbConfig = true; # use xkb.options in tty. + }; + + # Enable sound. + #services.pipewire = { + # enable = true; + # pulse.enable = true; + #}; + + # Enable touchpad support (enabled default in most desktopManager). + # services.libinput.enable = true; + + # Define a user account. Don't forget to set a password with ‘passwd’. + users.users.emile = { + isNormalUser = true; + extraGroups = [ "wheel" ]; # Enable ‘sudo’ for the user. + packages = with pkgs; [ + #firefox + tree + ]; + }; + + # List packages installed in system profile. To search, run: + # $ nix search wget + environment.systemPackages = with pkgs; [ + vim + wget + ]; + + # Some programs need SUID wrappers, can be configured further or are + # started in user sessions. + # programs.mtr.enable = true; + # programs.gnupg.agent = { + # enable = true; + # enableSSHSupport = true; + # }; + + # List services that you want to enable: + + # Enable the OpenSSH daemon. + # services.openssh.enable = true; + + # Open ports in the firewall. + # networking.firewall.allowedTCPPorts = [ ... ]; + # networking.firewall.allowedUDPPorts = [ ... ]; + # Or disable the firewall altogether. + # networking.firewall.enable = false; + + # Copy the NixOS configuration file and link it from the resulting system + # (/run/current-system/configuration.nix). This is useful in case you + # accidentally delete configuration.nix. + # system.copySystemConfiguration = true; + + # This option defines the first version of NixOS you have installed on this particular machine, + # and is used to maintain compatibility with application data (e.g. databases) created on older NixOS versions. + # + # Most users should NEVER change this value after the initial install, for any reason, + # even if you've upgraded your system to a new NixOS release. + # + # This value does NOT affect the Nixpkgs version your packages and OS are pulled from, + # so changing it will NOT upgrade your system - see https://nixos.org/manual/nixos/stable/#sec-upgrading for how + # to actually do that. + # + # This value being lower than the current NixOS release does NOT mean your system is + # out of date, out of support, or vulnerable. + # + # Do NOT change this value unless you have manually inspected all the changes it would make to your configuration, + # and migrated your data accordingly. + # + # For more information, see `man configuration.nix` or https://nixos.org/manual/nixos/stable/options#opt-system.stateVersion . + system.stateVersion = "24.05"; # Did you read the comment? + +} + diff --git a/hosts/lolcathost/hardware-configuration.nix b/hosts/lolcathost/hardware-configuration.nix new file mode 100644 index 0000000..9892c37 --- /dev/null +++ b/hosts/lolcathost/hardware-configuration.nix @@ -0,0 +1 @@ +# TODO: (i haven't put NixOS on lolcathost yet) diff --git a/hosts/myputer/default.nix b/hosts/myputer/default.nix new file mode 100644 index 0000000..6475c09 --- /dev/null +++ b/hosts/myputer/default.nix @@ -0,0 +1,147 @@ +{ + pkgs, + inputs, + ... +}: { + imports = [ + ./hardware-configuration.nix + ]; + + # Use the systemd-boot EFI boot loader. + # TODO: use GRUB2 instead + boot.loader.systemd-boot.enable = true; + boot.loader.efi.canTouchEfiVariables = true; + #boot.loader = { + # efi = { + # canTouchEfiVariables = true; + # efiSysMountPoint = "/boot/efi"; + # }; + # grub = { + # efiSupport = true; + # #efiInstallAsRemovable = true; # in case canTouchEfiVariables doesn't work on this system + # device = "nodev"; + # }; + #}; + + # Set your time zone. + time.timeZone = "Australia/Brisbane"; + + # Select internationalisation properties. + i18n.defaultLocale = "en_US.UTF-8"; + console = { + font = "Lat2-Terminus16"; + keyMap = "us"; + #useXkbConfig = true; # use xkb.options in tty. + }; + + + # ----- NETWORKING SECTION ----- + networking.hostName = "myputer"; + # Pick only one of the below networking options. + # networking.wireless.enable = true; # Enables wireless support via wpa_supplicant. + networking.networkmanager.enable = true; # Easiest to use and most distros use this by default. + + # Open ports in the firewall. + # networking.firewall.allowedTCPPorts = [ ... ]; + # networking.firewall.allowedUDPPorts = [ ... ]; + # Or disable the firewall altogether. + networking.firewall.enable = true; + + + # ----- SERVICES ----- + services = { + # Set display manager (login screen) + displayManager = { + sddm = { + enable = true; + theme = "${import ./sddm-theme.nix { inherit pkgs; }}"; + # enable experimental sddm support for wayland + wayland.enable = true; + }; + defaultSession = "hyprland"; + }; + + # Enable sound + # TODO: use the modules/core/pipewire.nix module instead :) + pipewire = { + enable = true; + pulse.enable = true; + }; + }; + + users.users = { + # just me fr (personal account) + me = { + isNormalUser = true; + extraGroups = [ "wheel" ]; + shell = pkgs.fish; + packages = with pkgs; [ + firefox + nitch + tldr + tree + ]; + }; + + # programming/development account + dev = { + isNormalUser = true; + extraGroups = [ "wheel" ]; + shell = pkgs.zsh; + packages = with pkgs; [ + tree + ]; + }; + + # user for my professional jobs and stuff + pro = { + isNormalUser = true; + extraGroups = [ "wheel" ]; + shell = pkgs.fish; + packages = with pkgs; [ + tree + ]; + }; + }; + # new users will use zsh by default + users.defaultUserShell = pkgs.bash; + + # ---- SYSTEM PACKAGES ----- + environment.systemPackages = with pkgs; [ + vim + wget + kitty + git + ]; + + + # Enable the use of certain programs + programs = { + hyprland.enable = true; + fish.enable = true; + zsh.enable = true; + }; + + # Enable the new CLI commands and the flakes as experimental features + nix.settings.experimental-features = [ + "nix-command" + "flakes" + ]; + + # Some programs need SUID wrappers, can be configured further or are + # started in user sessions. + # programs.mtr.enable = true; + # programs.gnupg.agent = { + # enable = true; + # enableSSHSupport = true; + # }; + + # Enable the OpenSSH daemon. + # services.openssh.enable = true; + + + # DO NOT MODIFY + system.stateVersion = "24.05"; # Did you read the comment? + +} + diff --git a/hosts/myputer/hardware-configuration.nix b/hosts/myputer/hardware-configuration.nix new file mode 100644 index 0000000..46551ec --- /dev/null +++ b/hosts/myputer/hardware-configuration.nix @@ -0,0 +1,41 @@ +# 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, ... }: + +{ + imports = + [ (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "ahci" "usb_storage" "usbhid" "sd_mod" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-amd" ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = + { device = "/dev/disk/by-uuid/ff19e1b0-cacc-4270-a94b-7922f7224ae2"; + fsType = "ext4"; + }; + + fileSystems."/boot" = + { device = "/dev/disk/by-uuid/7046-177A"; + fsType = "vfat"; + options = [ "fmask=0077" "dmask=0077" ]; + }; + + swapDevices = + [ { device = "/dev/disk/by-uuid/7f7e9d69-78e0-49f1-b792-6be26ed8e040"; } + ]; + + # Enables DHCP on each ethernet and wireless interface. In case of scripted networking + # (the default) this is the recommended approach. When using systemd-networkd it's + # still possible to use this option, but it's recommended to use it in conjunction + # with explicit per-interface declarations with `networking.interfaces..useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.enp34s0.useDHCP = lib.mkDefault true; + # networking.interfaces.wlp38s0.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/hosts/myputer/sddm-theme.nix b/hosts/myputer/sddm-theme.nix new file mode 100644 index 0000000..d60c046 --- /dev/null +++ b/hosts/myputer/sddm-theme.nix @@ -0,0 +1,35 @@ +{ pkgs }: + +let + #image = pkgs.fetchurl { + # url = "https://"; + # sha256 = ""; + #}; +in +pkgs.stdenv.mkDerivation { + name = "sddm-theme"; + src = pkgs.fetchFromGitHub { + owner = "MarianArlt"; + repo = "sddm-sugar-dark"; + rev = "ceb2c455663429be03ba62d9f898c571650ef7fe"; + sha256 = "0153z1kylbhc9d12nxy9vpn0spxgrhgy36wy37pk6ysq7akaqlvy"; + }; + # dependencies + buildInputs = with pkgs.libsForQt5; [ + qt5.qtbase + qt5.qtx11extras + qt5.qtquickcontrols2 + qt5.qtgraphicaleffects + qt5.wrapQtAppsHook + #libsForQt5.qt5.qtquickcontrols2 + #libsForQt5.qt5.qtgraphicaleffects + ]; + installPhase = '' + # move necessary files + mkdir -p $out + cp -R ./* $out/ + ''; + # set background + #rm $out/Background.jpg + #mv ${image} $out/Background.jpg +} diff --git a/modules/core/bluetooth.nix b/modules/core/bluetooth.nix new file mode 100644 index 0000000..400abfc --- /dev/null +++ b/modules/core/bluetooth.nix @@ -0,0 +1,12 @@ +{ pkgs, ... }: + +{ + # Enable Bluetooth + hardware.bluetooth.enable = true; + hardware.bluetooth.powerOnBoot = false; + + # TODO: this should be managed by home-manager + environment.systemPackages = with pkgs; [ + overskride + ]; +} diff --git a/modules/core/garbage-collector.nix b/modules/core/garbage-collector.nix new file mode 100644 index 0000000..683602b --- /dev/null +++ b/modules/core/garbage-collector.nix @@ -0,0 +1,16 @@ +{ ... }: + +{ + # Optimize storage and automatic scheduled GC running + # If you want to run GC manually, use commands: + # `nix-store --optimize` for finding and eliminating redundant copies of identical store paths + # `nix-store --gc` for optimizing the nix store and removing unreferenced and obsolete store paths + # `nix-collect-garbage -d` for deleting old generations of user profiles + nix.settings.auto-optimise-store = true; + nix.optimise.automatic = true; + nix.gc = { + automatic = true; + dates = "weekly"; + options = "--delete-older-than 14d"; + }; +} diff --git a/modules/core/pipewire.nix b/modules/core/pipewire.nix new file mode 100644 index 0000000..d3d1852 --- /dev/null +++ b/modules/core/pipewire.nix @@ -0,0 +1,29 @@ +# Credit: https://github.com/XNM1/linux-nixos-hyprland-config-dotfiles/ +{ pkgs, ... }: + +{ + # Enable sound with pipewire. + hardware.pulseaudio.enable = false; + security.rtkit.enable = true; + services.pipewire = { + enable = true; + + alsa.enable = true; + alsa.support32Bit = true; + pulse.enable = true; + jack.enable = true; + + wireplumber.enable = true; + + # use the example session manager (no others are packaged yet so this is enabled by default, + # no need to redefine it in your config for now) + # media-session.enable = true; + }; + + # TODO: these should instead be manager but home-manager + environment.systemPackages = with pkgs; [ + helvum + easyeffects + ]; +} + From 045f346d3c3af74bc41982e8ec99daa9e1668e30 Mon Sep 17 00:00:00 2001 From: Emile Clark-Boman Date: Wed, 30 Oct 2024 17:35:16 +1000 Subject: [PATCH 003/328] font config & assorted goodies --- README | 33 ++++++ flake.nix | 8 +- homes/me/home.nix | 123 +++++++++++++++++++++++ hosts/myputer/default.nix | 51 +++++++++- modules/core/bootloader/default.nix | 0 modules/core/bootloader/grub.nix | 0 modules/core/bootloader/systemd-boot.nix | 0 modules/core/sound/default.nix | 0 modules/core/{ => sound}/pipewire.nix | 0 modules/hyprland/default.nix | 30 ++++++ 10 files changed, 236 insertions(+), 9 deletions(-) create mode 100644 homes/me/home.nix create mode 100644 modules/core/bootloader/default.nix create mode 100644 modules/core/bootloader/grub.nix create mode 100644 modules/core/bootloader/systemd-boot.nix create mode 100644 modules/core/sound/default.nix rename modules/core/{ => sound}/pipewire.nix (100%) create mode 100644 modules/hyprland/default.nix diff --git a/README b/README index 0068d79..385d0c8 100644 --- a/README +++ b/README @@ -5,6 +5,14 @@ another user level package management method was baffling. Obviously I understan it can be useful (so I do use it). But where possible I will instead use the functionality of Nix rather than Home Manager. +###### Structuring Modules +Modules are organised into groups (ie "Core"), from here a module is structured as either: +1. a single `.nix` file (ie bluetooth.nix). I do this when I won't implement an alternative +2. a directory (ie `sound`) containing a set of alternative implementations and a `default.nix` +that simply imports one of the implementations. For the `sound` example I currently have it structured +to default to `pipewire.nix`. I haven't made alternatives yet but the idea is that it is HIGHLY likely +I do in future. + ### TODO There are a lot of `TODO` items in this repository. To improve these dotfiles @@ -13,7 +21,32 @@ recommendation I left behind :) +##### Small Explanation of Fonts +There are four types of fonts (to my knowledge at least): +1. serif (funny squigles / small elegant strokes included) +2. sans-serif (meaning "without serifs") +3. monospace (all glyphs are of a uniform size) +4. emoji (cute lil faces) + +Fun fact: on Android, the emojis you are seeing are part of the noto-emoji font :) + +For finding a font for programming I highly recommend trying https://www.codingfont.com/ + + +### My config + +Font: +Iosevka nerd font set as default/prefered font +Terminal uses IosevkaTerm nerd font + + + + ### Credits 1. https://github.com/XNM1/linux-nixos-hyprland-config-dotfiles The simplicity of their layout is amazing, was really good to pick out small modules and learn how something works / is configured. +2. https://github.com/Misterio77/nix-starter-configs +Really great starter config for learning how parts interact and how to generally structure flakes +3. https://nixos.wiki/wiki/Fonts +Wiki page explaining how to install fonts and nerd fonts on NixOS diff --git a/flake.nix b/flake.nix index b308364..7dc4640 100644 --- a/flake.nix +++ b/flake.nix @@ -26,9 +26,9 @@ pkgs = import nixpkgs { inherit system; - #config = { - # allowUnfree = true; - #}; + config = { + allowUnfree = false; + }; }; # this is just something I'm experimenting with @@ -62,7 +62,7 @@ inherit pkgs; modules = [ - ./home/emile # ./home/me + ./home/me ]; }; }; diff --git a/homes/me/home.nix b/homes/me/home.nix new file mode 100644 index 0000000..9cea35c --- /dev/null +++ b/homes/me/home.nix @@ -0,0 +1,123 @@ +{ + inputs, + outputs, + lib, + config, + pkgs, + ... +}: + +{ + imports = [ + # ./nvim.nix + ]; + + nixpkgs = { + config.allowUnfree = false; + }; + + home = { + username = "me"; + homeDirectory = "/home/me"; + }; + + programs = { + # Required for home-manager + home-manager.enable = true; + git.enable = true; + + # The terminal I use + # TODO: this is dependent on nvim being installed + # TODO: make this into a module with a configurable editor option + rio = { + enable = true; + # Rio Config Docs: https://raphamorim.io/rio/docs/config + settings = { + theme = "dracula"; + hide-mouse-cursor-when-typing = true; + + use-fork = true; # fork (dont spawn) Rio + + fonts = { + size = 18; + features = []; + + regular = { + family = "IosevkaTerm"; + style = "normal"; + weight = 400; + }; + + bold = { + family = "IosevkaTerm"; + style = "normal"; + weight = 800; + }; + + italic = { + family = "IosevkaTerm"; + style = "italic"; + weight = 400; + }; + + bold-italic = { + family = "IosevkaTerm"; + style = "italic"; + weight = 800; + }; + }; + + # Run when the `OpenConfigEditor` keybinding is triggered + editor = { + program = "nvim"; + args = []; + }; + }; + }; + }; + + # Nicely reload system units when changing configs + systemd.user.startServices = "sd-switch"; + + home.stateVersion = "24.05"; # don't change this + + /* + services = { + # Change monitor positions + # TODO: find a way to make this modular (ie put something different for my laptop) + # my idea is to have a "monitors" module and use kanshi for wayland + kanshi = { + enable = true; + systemdTarget = "hyprland-session.target"; + # You can find your monitors in hyprland by using `hyprctl monitors all` + settings = [ + { # 1920x1080@144 gaming monitor + output.criteria = "HDMI-A-1"; + output.mode = "1920x1080@119.98Hz"; + output.scale = 1.0; + output.adaptiveSync = false; # Variable Refresh Rate (this can be changed for gaming) + } + { # 4k side monitor + output.criteria = "DP-2"; + output.mode = "3840x2160@60.00Hz"; + output.scale = 2.0; + } + + { # This is my default setup + profile.name = "default"; + profile.outputs = [ + { + criteria = "DP-2"; + position = "0,0"; + } + { + criteria = "HDMI-A-1"; + position = "3840,0"; + } + ]; + } + ]; + }; + }; + */ +} diff --git a/hosts/myputer/default.nix b/hosts/myputer/default.nix index 6475c09..b28950a 100644 --- a/hosts/myputer/default.nix +++ b/hosts/myputer/default.nix @@ -78,8 +78,8 @@ packages = with pkgs; [ firefox nitch + starfetch tldr - tree ]; }; @@ -89,7 +89,6 @@ extraGroups = [ "wheel" ]; shell = pkgs.zsh; packages = with pkgs; [ - tree ]; }; @@ -99,7 +98,6 @@ extraGroups = [ "wheel" ]; shell = pkgs.fish; packages = with pkgs; [ - tree ]; }; }; @@ -108,10 +106,16 @@ # ---- SYSTEM PACKAGES ----- environment.systemPackages = with pkgs; [ - vim - wget + # Personally I think these kitty + + # Pretty necessary + #vim git + + # Super duper necessary + wget + tree ]; @@ -120,8 +124,45 @@ hyprland.enable = true; fish.enable = true; zsh.enable = true; + + neovim = { + enable = true; + defaultEditor = true; + viAlias = true; + vimAlias = true; + configure = { + customRC = '' + set number + set tabstop=4 + set shiftwidth=4 + ''; + # set cc=80 + }; + }; }; + + # ----- FONTS ----- + fonts = { + enableDefaultPackages = true; # no clue what this line does tbh + fonts = with pkgs; [ + (nerdfonts.override { fonts = [ "Cousine" "Iosevka" "IosevkaTerm" ]; }) + + # texlive maintains a noto-emoji flake + texlivePackages.noto-emoji + ]; + + fontconfig = { + defaultFonts = { + serif = [ "Iosevka" ]; # TODO: package Iosevka Etoile since Iosevka isn't a serif font + sansSerif = [ "Iosevka "]; + monospace = [ "Cousine" ]; + emoji = [ "Noto Emoji" ]; + }; + }; + }; + + # Enable the new CLI commands and the flakes as experimental features nix.settings.experimental-features = [ "nix-command" diff --git a/modules/core/bootloader/default.nix b/modules/core/bootloader/default.nix new file mode 100644 index 0000000..e69de29 diff --git a/modules/core/bootloader/grub.nix b/modules/core/bootloader/grub.nix new file mode 100644 index 0000000..e69de29 diff --git a/modules/core/bootloader/systemd-boot.nix b/modules/core/bootloader/systemd-boot.nix new file mode 100644 index 0000000..e69de29 diff --git a/modules/core/sound/default.nix b/modules/core/sound/default.nix new file mode 100644 index 0000000..e69de29 diff --git a/modules/core/pipewire.nix b/modules/core/sound/pipewire.nix similarity index 100% rename from modules/core/pipewire.nix rename to modules/core/sound/pipewire.nix diff --git a/modules/hyprland/default.nix b/modules/hyprland/default.nix new file mode 100644 index 0000000..71ee559 --- /dev/null +++ b/modules/hyprland/default.nix @@ -0,0 +1,30 @@ +{ + pkgs, + inputs, + config, + lib, + ... +}: + +{ + options.hyprland = { + enable = lib.mkEnableOption "Hyprland"; + }; + + config = lib.mkIf config.hyprland.enable { + programs.hyprland = { + enable = true; + #package = inputs.hyprland.packages.${pkgs.system}.hyprland; + xwayland.enable = true; + }; + + xdg.portal = { + enable = true; + extraPortals = with pkgs; [ + xdg-desktop-portal-gtk + ]; + }; + + # TODO: finish this (I didn't like the dotfiles I was getting inspo from and stopped) + }; +} From 0ad389ae9e1e5a78278234f34617f36fac0814b0 Mon Sep 17 00:00:00 2001 From: _cry64 Date: Wed, 30 Oct 2024 17:35:16 +1000 Subject: [PATCH 004/328] font config & assorted goodies --- README | 33 ++++++ flake.nix | 8 +- homes/me/home.nix | 123 +++++++++++++++++++++++ hosts/myputer/default.nix | 51 +++++++++- modules/core/bootloader/default.nix | 0 modules/core/bootloader/grub.nix | 0 modules/core/bootloader/systemd-boot.nix | 0 modules/core/sound/default.nix | 0 modules/core/{ => sound}/pipewire.nix | 0 modules/hyprland/default.nix | 30 ++++++ 10 files changed, 236 insertions(+), 9 deletions(-) create mode 100644 homes/me/home.nix create mode 100644 modules/core/bootloader/default.nix create mode 100644 modules/core/bootloader/grub.nix create mode 100644 modules/core/bootloader/systemd-boot.nix create mode 100644 modules/core/sound/default.nix rename modules/core/{ => sound}/pipewire.nix (100%) create mode 100644 modules/hyprland/default.nix diff --git a/README b/README index 0068d79..385d0c8 100644 --- a/README +++ b/README @@ -5,6 +5,14 @@ another user level package management method was baffling. Obviously I understan it can be useful (so I do use it). But where possible I will instead use the functionality of Nix rather than Home Manager. +###### Structuring Modules +Modules are organised into groups (ie "Core"), from here a module is structured as either: +1. a single `.nix` file (ie bluetooth.nix). I do this when I won't implement an alternative +2. a directory (ie `sound`) containing a set of alternative implementations and a `default.nix` +that simply imports one of the implementations. For the `sound` example I currently have it structured +to default to `pipewire.nix`. I haven't made alternatives yet but the idea is that it is HIGHLY likely +I do in future. + ### TODO There are a lot of `TODO` items in this repository. To improve these dotfiles @@ -13,7 +21,32 @@ recommendation I left behind :) +##### Small Explanation of Fonts +There are four types of fonts (to my knowledge at least): +1. serif (funny squigles / small elegant strokes included) +2. sans-serif (meaning "without serifs") +3. monospace (all glyphs are of a uniform size) +4. emoji (cute lil faces) + +Fun fact: on Android, the emojis you are seeing are part of the noto-emoji font :) + +For finding a font for programming I highly recommend trying https://www.codingfont.com/ + + +### My config + +Font: +Iosevka nerd font set as default/prefered font +Terminal uses IosevkaTerm nerd font + + + + ### Credits 1. https://github.com/XNM1/linux-nixos-hyprland-config-dotfiles The simplicity of their layout is amazing, was really good to pick out small modules and learn how something works / is configured. +2. https://github.com/Misterio77/nix-starter-configs +Really great starter config for learning how parts interact and how to generally structure flakes +3. https://nixos.wiki/wiki/Fonts +Wiki page explaining how to install fonts and nerd fonts on NixOS diff --git a/flake.nix b/flake.nix index b308364..7dc4640 100644 --- a/flake.nix +++ b/flake.nix @@ -26,9 +26,9 @@ pkgs = import nixpkgs { inherit system; - #config = { - # allowUnfree = true; - #}; + config = { + allowUnfree = false; + }; }; # this is just something I'm experimenting with @@ -62,7 +62,7 @@ inherit pkgs; modules = [ - ./home/emile # ./home/me + ./home/me ]; }; }; diff --git a/homes/me/home.nix b/homes/me/home.nix new file mode 100644 index 0000000..9cea35c --- /dev/null +++ b/homes/me/home.nix @@ -0,0 +1,123 @@ +{ + inputs, + outputs, + lib, + config, + pkgs, + ... +}: + +{ + imports = [ + # ./nvim.nix + ]; + + nixpkgs = { + config.allowUnfree = false; + }; + + home = { + username = "me"; + homeDirectory = "/home/me"; + }; + + programs = { + # Required for home-manager + home-manager.enable = true; + git.enable = true; + + # The terminal I use + # TODO: this is dependent on nvim being installed + # TODO: make this into a module with a configurable editor option + rio = { + enable = true; + # Rio Config Docs: https://raphamorim.io/rio/docs/config + settings = { + theme = "dracula"; + hide-mouse-cursor-when-typing = true; + + use-fork = true; # fork (dont spawn) Rio + + fonts = { + size = 18; + features = []; + + regular = { + family = "IosevkaTerm"; + style = "normal"; + weight = 400; + }; + + bold = { + family = "IosevkaTerm"; + style = "normal"; + weight = 800; + }; + + italic = { + family = "IosevkaTerm"; + style = "italic"; + weight = 400; + }; + + bold-italic = { + family = "IosevkaTerm"; + style = "italic"; + weight = 800; + }; + }; + + # Run when the `OpenConfigEditor` keybinding is triggered + editor = { + program = "nvim"; + args = []; + }; + }; + }; + }; + + # Nicely reload system units when changing configs + systemd.user.startServices = "sd-switch"; + + home.stateVersion = "24.05"; # don't change this + + /* + services = { + # Change monitor positions + # TODO: find a way to make this modular (ie put something different for my laptop) + # my idea is to have a "monitors" module and use kanshi for wayland + kanshi = { + enable = true; + systemdTarget = "hyprland-session.target"; + # You can find your monitors in hyprland by using `hyprctl monitors all` + settings = [ + { # 1920x1080@144 gaming monitor + output.criteria = "HDMI-A-1"; + output.mode = "1920x1080@119.98Hz"; + output.scale = 1.0; + output.adaptiveSync = false; # Variable Refresh Rate (this can be changed for gaming) + } + { # 4k side monitor + output.criteria = "DP-2"; + output.mode = "3840x2160@60.00Hz"; + output.scale = 2.0; + } + + { # This is my default setup + profile.name = "default"; + profile.outputs = [ + { + criteria = "DP-2"; + position = "0,0"; + } + { + criteria = "HDMI-A-1"; + position = "3840,0"; + } + ]; + } + ]; + }; + }; + */ +} diff --git a/hosts/myputer/default.nix b/hosts/myputer/default.nix index 6475c09..b28950a 100644 --- a/hosts/myputer/default.nix +++ b/hosts/myputer/default.nix @@ -78,8 +78,8 @@ packages = with pkgs; [ firefox nitch + starfetch tldr - tree ]; }; @@ -89,7 +89,6 @@ extraGroups = [ "wheel" ]; shell = pkgs.zsh; packages = with pkgs; [ - tree ]; }; @@ -99,7 +98,6 @@ extraGroups = [ "wheel" ]; shell = pkgs.fish; packages = with pkgs; [ - tree ]; }; }; @@ -108,10 +106,16 @@ # ---- SYSTEM PACKAGES ----- environment.systemPackages = with pkgs; [ - vim - wget + # Personally I think these kitty + + # Pretty necessary + #vim git + + # Super duper necessary + wget + tree ]; @@ -120,8 +124,45 @@ hyprland.enable = true; fish.enable = true; zsh.enable = true; + + neovim = { + enable = true; + defaultEditor = true; + viAlias = true; + vimAlias = true; + configure = { + customRC = '' + set number + set tabstop=4 + set shiftwidth=4 + ''; + # set cc=80 + }; + }; }; + + # ----- FONTS ----- + fonts = { + enableDefaultPackages = true; # no clue what this line does tbh + fonts = with pkgs; [ + (nerdfonts.override { fonts = [ "Cousine" "Iosevka" "IosevkaTerm" ]; }) + + # texlive maintains a noto-emoji flake + texlivePackages.noto-emoji + ]; + + fontconfig = { + defaultFonts = { + serif = [ "Iosevka" ]; # TODO: package Iosevka Etoile since Iosevka isn't a serif font + sansSerif = [ "Iosevka "]; + monospace = [ "Cousine" ]; + emoji = [ "Noto Emoji" ]; + }; + }; + }; + + # Enable the new CLI commands and the flakes as experimental features nix.settings.experimental-features = [ "nix-command" diff --git a/modules/core/bootloader/default.nix b/modules/core/bootloader/default.nix new file mode 100644 index 0000000..e69de29 diff --git a/modules/core/bootloader/grub.nix b/modules/core/bootloader/grub.nix new file mode 100644 index 0000000..e69de29 diff --git a/modules/core/bootloader/systemd-boot.nix b/modules/core/bootloader/systemd-boot.nix new file mode 100644 index 0000000..e69de29 diff --git a/modules/core/sound/default.nix b/modules/core/sound/default.nix new file mode 100644 index 0000000..e69de29 diff --git a/modules/core/pipewire.nix b/modules/core/sound/pipewire.nix similarity index 100% rename from modules/core/pipewire.nix rename to modules/core/sound/pipewire.nix diff --git a/modules/hyprland/default.nix b/modules/hyprland/default.nix new file mode 100644 index 0000000..71ee559 --- /dev/null +++ b/modules/hyprland/default.nix @@ -0,0 +1,30 @@ +{ + pkgs, + inputs, + config, + lib, + ... +}: + +{ + options.hyprland = { + enable = lib.mkEnableOption "Hyprland"; + }; + + config = lib.mkIf config.hyprland.enable { + programs.hyprland = { + enable = true; + #package = inputs.hyprland.packages.${pkgs.system}.hyprland; + xwayland.enable = true; + }; + + xdg.portal = { + enable = true; + extraPortals = with pkgs; [ + xdg-desktop-portal-gtk + ]; + }; + + # TODO: finish this (I didn't like the dotfiles I was getting inspo from and stopped) + }; +} From 48fb5e798c0f66e581352f0d9bbe3893c6401667 Mon Sep 17 00:00:00 2001 From: Emile Clark-Boman Date: Wed, 30 Oct 2024 19:45:26 +1000 Subject: [PATCH 005/328] added home manager --- README | 4 +- deploy | 2 + deploy.sh | 1 - flake.nix | 31 ++++++---- homes/me/default.nix | 123 ++++++++++++++++++++++++++++++++++++++ homes/me/home.nix | 123 -------------------------------------- hosts/myputer/default.nix | 94 +++++++++++++++++------------ 7 files changed, 203 insertions(+), 175 deletions(-) create mode 100755 deploy delete mode 100755 deploy.sh delete mode 100644 homes/me/home.nix diff --git a/README b/README index 385d0c8..c09a31b 100644 --- a/README +++ b/README @@ -39,7 +39,9 @@ Font: Iosevka nerd font set as default/prefered font Terminal uses IosevkaTerm nerd font - +Home-Manager: +I just to use home-manager standalone and not as a NixOS module, thus allowing +my dotfiles to also work on non-NixOS systems. diff --git a/deploy b/deploy new file mode 100755 index 0000000..7e49259 --- /dev/null +++ b/deploy @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +sudo nixos-rebuild switch --flake . diff --git a/deploy.sh b/deploy.sh deleted file mode 100755 index 6fe9c3f..0000000 --- a/deploy.sh +++ /dev/null @@ -1 +0,0 @@ -sudo nixos-rebuild switch --flake ./ diff --git a/flake.nix b/flake.nix index 7dc4640..a33d49a 100644 --- a/flake.nix +++ b/flake.nix @@ -9,6 +9,7 @@ inputs.nixpkgs.follows = "nixpkgs"; }; + # is this necessary? (aren't I enabling it in `configuration.nix` anyways?) hyprland.url = "github:hyprwm/Hyprland"; }; @@ -38,28 +39,34 @@ nixosConfigurations = { # i be on my puter fr myputer = nixpkgs.lib.nixosSystem { + # nix passes these to every single module above + specialArgs = { + inherit inputs; + }; + modules = [ ./hosts/myputer + #home-manager.nixosModules.default ]; - specialArgs = { - inherit inputs system; # inherit inputs outputs; - }; }; # my laptop 0w0 - #lolcathost = nixpkgs.lib.nixosSystem { - # modules = [ - # ./hosts/lolcathost - # ]; - # specialArgs = { - # inherit system; # inherit inputs outputs; - # }; - #}; + lolcathost = nixpkgs.lib.nixosSystem { + specialArgs = { + inherit inputs; + }; + + modules = [ + ./hosts/lolcathost + ]; + }; }; homeConfigurations = { me = home-manager.lib.homeManagerConfiguration { - inherit pkgs; + specialArgs = { + inherit inputs; + }; modules = [ ./home/me diff --git a/homes/me/default.nix b/homes/me/default.nix index e69de29..e2c5c58 100644 --- a/homes/me/default.nix +++ b/homes/me/default.nix @@ -0,0 +1,123 @@ +{ + inputs, + outputs, + lib, + config, + pkgs, + ... +}: + +{ + #imports = [ + # ./nvim.nix + #]; + + nixpkgs = { + config.allowUnfree = false; + }; + + home = { + username = "me"; + homeDirectory = "/home/me"; + }; + + programs = { + # these are both required for home-manager to work + home-manager.enable = true; + git.enable = true; + + # The terminal I use + # TODO: this is dependent on nvim being installed + # TODO: make this into a module with a configurable editor option + rio = { + enable = true; + # Rio Config Docs: https://raphamorim.io/rio/docs/config + settings = { + theme = "dracula"; + hide-mouse-cursor-when-typing = true; + + use-fork = true; # fork (dont spawn) Rio + + fonts = { + size = 18; + features = []; + + regular = { + family = "IosevkaTerm Nerd Font"; + style = "Normal"; + weight = 400; + }; + + bold = { + family = "IosevkaTerm Nerd Font"; + style = "Normal"; + weight = 800; + }; + + italic = { + family = "IosevkaTerm Nerd Font"; + style = "Italic"; + weight = 400; + }; + + bold-italic = { + family = "IosevkaTerm Nerd Font"; + style = "Italic"; + weight = 800; + }; + }; + + # Run when the `OpenConfigEditor` keybinding is triggered + editor = { + program = "nvim"; + args = []; + }; + }; + }; + }; + + # Nicely reload system units when changing configs + systemd.user.startServices = "sd-switch"; + + home.stateVersion = "24.05"; # don't change this + + /* + services = { + # Change monitor positions + # TODO: find a way to make this modular (ie put something different for my laptop) + # my idea is to have a "monitors" module and use kanshi for wayland + kanshi = { + enable = true; + systemdTarget = "hyprland-session.target"; + # You can find your monitors in hyprland by using `hyprctl monitors all` + settings = [ + { # 1920x1080@144 gaming monitor + output.criteria = "HDMI-A-1"; + output.mode = "1920x1080@119.98Hz"; + output.scale = 1.0; + output.adaptiveSync = false; # Variable Refresh Rate (this can be changed for gaming) + } + { # 4k side monitor + output.criteria = "DP-2"; + output.mode = "3840x2160@60.00Hz"; + output.scale = 2.0; + } + + { # This is my default setup + profile.name = "default"; + profile.outputs = [ + { + criteria = "DP-2"; + position = "0,0"; + } + { + criteria = "HDMI-A-1"; + position = "3840,0"; + } + ]; + } + ]; + }; + }; + */ +} diff --git a/homes/me/home.nix b/homes/me/home.nix deleted file mode 100644 index 9cea35c..0000000 --- a/homes/me/home.nix +++ /dev/null @@ -1,123 +0,0 @@ -{ - inputs, - outputs, - lib, - config, - pkgs, - ... -}: - -{ - imports = [ - # ./nvim.nix - ]; - - nixpkgs = { - config.allowUnfree = false; - }; - - home = { - username = "me"; - homeDirectory = "/home/me"; - }; - - programs = { - # Required for home-manager - home-manager.enable = true; - git.enable = true; - - # The terminal I use - # TODO: this is dependent on nvim being installed - # TODO: make this into a module with a configurable editor option - rio = { - enable = true; - # Rio Config Docs: https://raphamorim.io/rio/docs/config - settings = { - theme = "dracula"; - hide-mouse-cursor-when-typing = true; - - use-fork = true; # fork (dont spawn) Rio - - fonts = { - size = 18; - features = []; - - regular = { - family = "IosevkaTerm"; - style = "normal"; - weight = 400; - }; - - bold = { - family = "IosevkaTerm"; - style = "normal"; - weight = 800; - }; - - italic = { - family = "IosevkaTerm"; - style = "italic"; - weight = 400; - }; - - bold-italic = { - family = "IosevkaTerm"; - style = "italic"; - weight = 800; - }; - }; - - # Run when the `OpenConfigEditor` keybinding is triggered - editor = { - program = "nvim"; - args = []; - }; - }; - }; - }; - - # Nicely reload system units when changing configs - systemd.user.startServices = "sd-switch"; - - home.stateVersion = "24.05"; # don't change this - - /* - services = { - # Change monitor positions - # TODO: find a way to make this modular (ie put something different for my laptop) - # my idea is to have a "monitors" module and use kanshi for wayland - kanshi = { - enable = true; - systemdTarget = "hyprland-session.target"; - # You can find your monitors in hyprland by using `hyprctl monitors all` - settings = [ - { # 1920x1080@144 gaming monitor - output.criteria = "HDMI-A-1"; - output.mode = "1920x1080@119.98Hz"; - output.scale = 1.0; - output.adaptiveSync = false; # Variable Refresh Rate (this can be changed for gaming) - } - { # 4k side monitor - output.criteria = "DP-2"; - output.mode = "3840x2160@60.00Hz"; - output.scale = 2.0; - } - - { # This is my default setup - profile.name = "default"; - profile.outputs = [ - { - criteria = "DP-2"; - position = "0,0"; - } - { - criteria = "HDMI-A-1"; - position = "3840,0"; - } - ]; - } - ]; - }; - }; - */ -} diff --git a/hosts/myputer/default.nix b/hosts/myputer/default.nix index b28950a..18437f3 100644 --- a/hosts/myputer/default.nix +++ b/hosts/myputer/default.nix @@ -2,10 +2,19 @@ pkgs, inputs, ... -}: { +}: + +let + home-manager = builtins.fetchTarball { + url = "https://github.com/nix-community/home-manager/archive/master.tar.gz"; + sha256 = "0kg9iaixqygpncw7avgh1grwyjgnfc9i7k9pk8hc4xrvr8jv2l3c"; + }; +in +{ imports = [ - ./hardware-configuration.nix - ]; + ./hardware-configuration.nix + (import "${home-manager}/nixos") + ]; # Use the systemd-boot EFI boot loader. # TODO: use GRUB2 instead @@ -69,41 +78,45 @@ }; }; - users.users = { - # just me fr (personal account) - me = { - isNormalUser = true; - extraGroups = [ "wheel" ]; - shell = pkgs.fish; - packages = with pkgs; [ - firefox - nitch - starfetch - tldr - ]; - }; - - # programming/development account - dev = { - isNormalUser = true; - extraGroups = [ "wheel" ]; - shell = pkgs.zsh; - packages = with pkgs; [ - ]; - }; - - # user for my professional jobs and stuff - pro = { - isNormalUser = true; - extraGroups = [ "wheel" ]; - shell = pkgs.fish; - packages = with pkgs; [ - ]; - }; - }; - # new users will use zsh by default - users.defaultUserShell = pkgs.bash; + users = { + defaultUserShell = pkgs.bash; + users = { + # just me fr (personal account) + me = { + isNormalUser = true; + extraGroups = [ "wheel" ]; + shell = pkgs.fish; + packages = with pkgs; [ + firefox + nitch + starfetch + tldr + ]; + }; + + # programming/development account + dev = { + isNormalUser = true; + extraGroups = [ "wheel" ]; + shell = pkgs.zsh; + packages = with pkgs; [ + ]; + }; + + # user for my professional jobs and stuff + ae = { + isNormalUser = true; + extraGroups = [ "wheel" ]; + shell = pkgs.fish; + packages = with pkgs; [ + ]; + }; + }; + }; + + home-manager.users.me = import ../../homes/me; + # ---- SYSTEM PACKAGES ----- environment.systemPackages = with pkgs; [ # Personally I think these @@ -125,6 +138,8 @@ fish.enable = true; zsh.enable = true; + git.enable = true; + neovim = { enable = true; defaultEditor = true; @@ -141,11 +156,12 @@ }; }; + # ----- FONTS ----- fonts = { enableDefaultPackages = true; # no clue what this line does tbh - fonts = with pkgs; [ + packages = with pkgs; [ (nerdfonts.override { fonts = [ "Cousine" "Iosevka" "IosevkaTerm" ]; }) # texlive maintains a noto-emoji flake @@ -163,6 +179,8 @@ }; + + # Enable the new CLI commands and the flakes as experimental features nix.settings.experimental-features = [ "nix-command" From 3581a1080946248315c3b24d1f51aa9800699b8a Mon Sep 17 00:00:00 2001 From: _cry64 Date: Wed, 30 Oct 2024 19:45:26 +1000 Subject: [PATCH 006/328] added home manager --- README | 4 +- deploy | 2 + deploy.sh | 1 - flake.nix | 31 ++++++---- homes/me/default.nix | 123 ++++++++++++++++++++++++++++++++++++++ homes/me/home.nix | 123 -------------------------------------- hosts/myputer/default.nix | 94 +++++++++++++++++------------ 7 files changed, 203 insertions(+), 175 deletions(-) create mode 100755 deploy delete mode 100755 deploy.sh delete mode 100644 homes/me/home.nix diff --git a/README b/README index 385d0c8..c09a31b 100644 --- a/README +++ b/README @@ -39,7 +39,9 @@ Font: Iosevka nerd font set as default/prefered font Terminal uses IosevkaTerm nerd font - +Home-Manager: +I just to use home-manager standalone and not as a NixOS module, thus allowing +my dotfiles to also work on non-NixOS systems. diff --git a/deploy b/deploy new file mode 100755 index 0000000..7e49259 --- /dev/null +++ b/deploy @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +sudo nixos-rebuild switch --flake . diff --git a/deploy.sh b/deploy.sh deleted file mode 100755 index 6fe9c3f..0000000 --- a/deploy.sh +++ /dev/null @@ -1 +0,0 @@ -sudo nixos-rebuild switch --flake ./ diff --git a/flake.nix b/flake.nix index 7dc4640..a33d49a 100644 --- a/flake.nix +++ b/flake.nix @@ -9,6 +9,7 @@ inputs.nixpkgs.follows = "nixpkgs"; }; + # is this necessary? (aren't I enabling it in `configuration.nix` anyways?) hyprland.url = "github:hyprwm/Hyprland"; }; @@ -38,28 +39,34 @@ nixosConfigurations = { # i be on my puter fr myputer = nixpkgs.lib.nixosSystem { + # nix passes these to every single module above + specialArgs = { + inherit inputs; + }; + modules = [ ./hosts/myputer + #home-manager.nixosModules.default ]; - specialArgs = { - inherit inputs system; # inherit inputs outputs; - }; }; # my laptop 0w0 - #lolcathost = nixpkgs.lib.nixosSystem { - # modules = [ - # ./hosts/lolcathost - # ]; - # specialArgs = { - # inherit system; # inherit inputs outputs; - # }; - #}; + lolcathost = nixpkgs.lib.nixosSystem { + specialArgs = { + inherit inputs; + }; + + modules = [ + ./hosts/lolcathost + ]; + }; }; homeConfigurations = { me = home-manager.lib.homeManagerConfiguration { - inherit pkgs; + specialArgs = { + inherit inputs; + }; modules = [ ./home/me diff --git a/homes/me/default.nix b/homes/me/default.nix index e69de29..e2c5c58 100644 --- a/homes/me/default.nix +++ b/homes/me/default.nix @@ -0,0 +1,123 @@ +{ + inputs, + outputs, + lib, + config, + pkgs, + ... +}: + +{ + #imports = [ + # ./nvim.nix + #]; + + nixpkgs = { + config.allowUnfree = false; + }; + + home = { + username = "me"; + homeDirectory = "/home/me"; + }; + + programs = { + # these are both required for home-manager to work + home-manager.enable = true; + git.enable = true; + + # The terminal I use + # TODO: this is dependent on nvim being installed + # TODO: make this into a module with a configurable editor option + rio = { + enable = true; + # Rio Config Docs: https://raphamorim.io/rio/docs/config + settings = { + theme = "dracula"; + hide-mouse-cursor-when-typing = true; + + use-fork = true; # fork (dont spawn) Rio + + fonts = { + size = 18; + features = []; + + regular = { + family = "IosevkaTerm Nerd Font"; + style = "Normal"; + weight = 400; + }; + + bold = { + family = "IosevkaTerm Nerd Font"; + style = "Normal"; + weight = 800; + }; + + italic = { + family = "IosevkaTerm Nerd Font"; + style = "Italic"; + weight = 400; + }; + + bold-italic = { + family = "IosevkaTerm Nerd Font"; + style = "Italic"; + weight = 800; + }; + }; + + # Run when the `OpenConfigEditor` keybinding is triggered + editor = { + program = "nvim"; + args = []; + }; + }; + }; + }; + + # Nicely reload system units when changing configs + systemd.user.startServices = "sd-switch"; + + home.stateVersion = "24.05"; # don't change this + + /* + services = { + # Change monitor positions + # TODO: find a way to make this modular (ie put something different for my laptop) + # my idea is to have a "monitors" module and use kanshi for wayland + kanshi = { + enable = true; + systemdTarget = "hyprland-session.target"; + # You can find your monitors in hyprland by using `hyprctl monitors all` + settings = [ + { # 1920x1080@144 gaming monitor + output.criteria = "HDMI-A-1"; + output.mode = "1920x1080@119.98Hz"; + output.scale = 1.0; + output.adaptiveSync = false; # Variable Refresh Rate (this can be changed for gaming) + } + { # 4k side monitor + output.criteria = "DP-2"; + output.mode = "3840x2160@60.00Hz"; + output.scale = 2.0; + } + + { # This is my default setup + profile.name = "default"; + profile.outputs = [ + { + criteria = "DP-2"; + position = "0,0"; + } + { + criteria = "HDMI-A-1"; + position = "3840,0"; + } + ]; + } + ]; + }; + }; + */ +} diff --git a/homes/me/home.nix b/homes/me/home.nix deleted file mode 100644 index 9cea35c..0000000 --- a/homes/me/home.nix +++ /dev/null @@ -1,123 +0,0 @@ -{ - inputs, - outputs, - lib, - config, - pkgs, - ... -}: - -{ - imports = [ - # ./nvim.nix - ]; - - nixpkgs = { - config.allowUnfree = false; - }; - - home = { - username = "me"; - homeDirectory = "/home/me"; - }; - - programs = { - # Required for home-manager - home-manager.enable = true; - git.enable = true; - - # The terminal I use - # TODO: this is dependent on nvim being installed - # TODO: make this into a module with a configurable editor option - rio = { - enable = true; - # Rio Config Docs: https://raphamorim.io/rio/docs/config - settings = { - theme = "dracula"; - hide-mouse-cursor-when-typing = true; - - use-fork = true; # fork (dont spawn) Rio - - fonts = { - size = 18; - features = []; - - regular = { - family = "IosevkaTerm"; - style = "normal"; - weight = 400; - }; - - bold = { - family = "IosevkaTerm"; - style = "normal"; - weight = 800; - }; - - italic = { - family = "IosevkaTerm"; - style = "italic"; - weight = 400; - }; - - bold-italic = { - family = "IosevkaTerm"; - style = "italic"; - weight = 800; - }; - }; - - # Run when the `OpenConfigEditor` keybinding is triggered - editor = { - program = "nvim"; - args = []; - }; - }; - }; - }; - - # Nicely reload system units when changing configs - systemd.user.startServices = "sd-switch"; - - home.stateVersion = "24.05"; # don't change this - - /* - services = { - # Change monitor positions - # TODO: find a way to make this modular (ie put something different for my laptop) - # my idea is to have a "monitors" module and use kanshi for wayland - kanshi = { - enable = true; - systemdTarget = "hyprland-session.target"; - # You can find your monitors in hyprland by using `hyprctl monitors all` - settings = [ - { # 1920x1080@144 gaming monitor - output.criteria = "HDMI-A-1"; - output.mode = "1920x1080@119.98Hz"; - output.scale = 1.0; - output.adaptiveSync = false; # Variable Refresh Rate (this can be changed for gaming) - } - { # 4k side monitor - output.criteria = "DP-2"; - output.mode = "3840x2160@60.00Hz"; - output.scale = 2.0; - } - - { # This is my default setup - profile.name = "default"; - profile.outputs = [ - { - criteria = "DP-2"; - position = "0,0"; - } - { - criteria = "HDMI-A-1"; - position = "3840,0"; - } - ]; - } - ]; - }; - }; - */ -} diff --git a/hosts/myputer/default.nix b/hosts/myputer/default.nix index b28950a..18437f3 100644 --- a/hosts/myputer/default.nix +++ b/hosts/myputer/default.nix @@ -2,10 +2,19 @@ pkgs, inputs, ... -}: { +}: + +let + home-manager = builtins.fetchTarball { + url = "https://github.com/nix-community/home-manager/archive/master.tar.gz"; + sha256 = "0kg9iaixqygpncw7avgh1grwyjgnfc9i7k9pk8hc4xrvr8jv2l3c"; + }; +in +{ imports = [ - ./hardware-configuration.nix - ]; + ./hardware-configuration.nix + (import "${home-manager}/nixos") + ]; # Use the systemd-boot EFI boot loader. # TODO: use GRUB2 instead @@ -69,41 +78,45 @@ }; }; - users.users = { - # just me fr (personal account) - me = { - isNormalUser = true; - extraGroups = [ "wheel" ]; - shell = pkgs.fish; - packages = with pkgs; [ - firefox - nitch - starfetch - tldr - ]; - }; - - # programming/development account - dev = { - isNormalUser = true; - extraGroups = [ "wheel" ]; - shell = pkgs.zsh; - packages = with pkgs; [ - ]; - }; - - # user for my professional jobs and stuff - pro = { - isNormalUser = true; - extraGroups = [ "wheel" ]; - shell = pkgs.fish; - packages = with pkgs; [ - ]; - }; - }; - # new users will use zsh by default - users.defaultUserShell = pkgs.bash; + users = { + defaultUserShell = pkgs.bash; + users = { + # just me fr (personal account) + me = { + isNormalUser = true; + extraGroups = [ "wheel" ]; + shell = pkgs.fish; + packages = with pkgs; [ + firefox + nitch + starfetch + tldr + ]; + }; + + # programming/development account + dev = { + isNormalUser = true; + extraGroups = [ "wheel" ]; + shell = pkgs.zsh; + packages = with pkgs; [ + ]; + }; + + # user for my professional jobs and stuff + ae = { + isNormalUser = true; + extraGroups = [ "wheel" ]; + shell = pkgs.fish; + packages = with pkgs; [ + ]; + }; + }; + }; + + home-manager.users.me = import ../../homes/me; + # ---- SYSTEM PACKAGES ----- environment.systemPackages = with pkgs; [ # Personally I think these @@ -125,6 +138,8 @@ fish.enable = true; zsh.enable = true; + git.enable = true; + neovim = { enable = true; defaultEditor = true; @@ -141,11 +156,12 @@ }; }; + # ----- FONTS ----- fonts = { enableDefaultPackages = true; # no clue what this line does tbh - fonts = with pkgs; [ + packages = with pkgs; [ (nerdfonts.override { fonts = [ "Cousine" "Iosevka" "IosevkaTerm" ]; }) # texlive maintains a noto-emoji flake @@ -163,6 +179,8 @@ }; + + # Enable the new CLI commands and the flakes as experimental features nix.settings.experimental-features = [ "nix-command" From b2a8645da1dc899df2b23bf6f173107580d1db32 Mon Sep 17 00:00:00 2001 From: Emile Clark-Boman Date: Wed, 30 Oct 2024 23:25:57 +1000 Subject: [PATCH 007/328] added wofi, spicetify, and fonts --- flake.lock | 40 +++++- flake.nix | 12 +- homes/me/default.nix | 259 ++++++++++++++++++++++++++++++++++++-- homes/me/wofi.nix | 192 ++++++++++++++++++++++++++++ hosts/myputer/default.nix | 26 +++- 5 files changed, 509 insertions(+), 20 deletions(-) create mode 100644 homes/me/wofi.nix diff --git a/flake.lock b/flake.lock index c2e5529..da8b556 100644 --- a/flake.lock +++ b/flake.lock @@ -49,6 +49,22 @@ "type": "github" } }, + "flake-compat_2": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, "gitignore": { "inputs": { "nixpkgs": [ @@ -327,7 +343,29 @@ "inputs": { "home-manager": "home-manager", "hyprland": "hyprland", - "nixpkgs": "nixpkgs_2" + "nixpkgs": "nixpkgs_2", + "spicetify-nix": "spicetify-nix" + } + }, + "spicetify-nix": { + "inputs": { + "flake-compat": "flake-compat_2", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1730261837, + "narHash": "sha256-syeN2dLFxJ9bhsG1YnwWpwMgCttBY1S60KUrqLIrmMo=", + "owner": "Gerg-L", + "repo": "spicetify-nix", + "rev": "1c482c8baffd494119b7f61735d35c62a0a22244", + "type": "github" + }, + "original": { + "owner": "Gerg-L", + "repo": "spicetify-nix", + "type": "github" } }, "systems": { diff --git a/flake.nix b/flake.nix index a33d49a..18ad9ae 100644 --- a/flake.nix +++ b/flake.nix @@ -9,6 +9,11 @@ inputs.nixpkgs.follows = "nixpkgs"; }; + spicetify-nix = { + url = "github:Gerg-L/spicetify-nix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + # is this necessary? (aren't I enabling it in `configuration.nix` anyways?) hyprland.url = "github:hyprwm/Hyprland"; }; @@ -26,10 +31,7 @@ pkgs = import nixpkgs { inherit system; - - config = { - allowUnfree = false; - }; + config.allowUnfree = true; }; # this is just something I'm experimenting with @@ -41,7 +43,7 @@ myputer = nixpkgs.lib.nixosSystem { # nix passes these to every single module above specialArgs = { - inherit inputs; + inherit inputs pkgs; }; modules = [ diff --git a/homes/me/default.nix b/homes/me/default.nix index e2c5c58..b943e09 100644 --- a/homes/me/default.nix +++ b/homes/me/default.nix @@ -8,14 +8,32 @@ }: { - #imports = [ - # ./nvim.nix - #]; - nixpkgs = { - config.allowUnfree = false; + config.allowUnfree = true; }; + imports = [ + # inputs.spicetify-nix.homeManagerModules.default + #./wofi.nix + ]; + + /* + programs.spicetify = + let + spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; + in + { + enable = true; + enabledExtensions = with spicePkgs.extensions; [ + adblock + hidePodcasts + shuffle # shuffle+ (special characters are sanitized out of extension names) + ]; + theme = spicePkgs.themes.catppuccin; + colorScheme = "mocha"; + }; + */ + home = { username = "me"; homeDirectory = "/home/me"; @@ -25,6 +43,33 @@ # these are both required for home-manager to work home-manager.enable = true; git.enable = true; + + # like `/bin/cat` but with syntax highlighting + # TODO: change the pager (maybe use Github:sachaos/viddy instead) + bat = { + enable = true; + config = { + pager = "less -FR"; + theme = "Dracula"; + }; + }; + + /* + spicetify = + let + spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; + in + { + enable = true; + enabledExtensions = with spicePkgs.extensions; [ + adblock + hidePodcasts + #shuffle + ]; + theme = spicePkgs.themes.catppuccin; + colorScheme = "mocha"; + }; + */ # The terminal I use # TODO: this is dependent on nvim being installed @@ -38,30 +83,39 @@ use-fork = true; # fork (dont spawn) Rio + padding-x = 10; + padding-y = [ 15 10 ]; # top, left + + # lines = (accumulated scroll * multiplier / divider) + scroll = { + multiplier = 1.0; + divider = 1.0; + }; + fonts = { - size = 18; - features = []; + size = 15; + features = []; regular = { - family = "IosevkaTerm Nerd Font"; + family = "FiraCode Nerd Font"; # "IosevkaTerm Nerd Font" style = "Normal"; weight = 400; }; bold = { - family = "IosevkaTerm Nerd Font"; + family = "FiraCode Nerd Font"; style = "Normal"; weight = 800; }; italic = { - family = "IosevkaTerm Nerd Font"; + family = "FiraCode Nerd Font"; style = "Italic"; weight = 400; }; bold-italic = { - family = "IosevkaTerm Nerd Font"; + family = "FiraCode Nerd Font"; style = "Italic"; weight = 800; }; @@ -72,8 +126,189 @@ program = "nvim"; args = []; }; + + renderer = { + performance = "High"; + backend = "Automatic"; # Vulkan + }; }; }; + + wofi = { + enable = true; + settings = { + location = "center"; + allow_markup = true; + width = 250; + }; + style = '' + @define-color rosewater #f2d5cf; + @define-color rosewater-rgb rgb(242, 213, 207); + @define-color flamingo #eebebe; + @define-color flamingo-rgb rgb(238, 190, 190); + @define-color pink #f4b8e4; + @define-color pink-rgb rgb(244, 184, 228); + @define-color mauve #ca9ee6; + @define-color mauve-rgb rgb(202, 158, 230); + @define-color red #e78284; + @define-color red-rgb rgb(231, 130, 132); + @define-color maroon #ea999c; + @define-color maroon-rgb rgb(234, 153, 156); + @define-color peach #ef9f76; + @define-color peach-rgb rgb(239, 159, 118); + @define-color yellow #e5c890; + @define-color yellow-rgb rgb(229, 200, 144); + @define-color green #a6d189; + @define-color green-rgb rgb(166, 209, 137); + @define-color teal #81c8be; + @define-color teal-rgb rgb(129, 200, 190); + @define-color sky #99d1db; + @define-color sky-rgb rgb(153, 209, 219); + @define-color sapphire #85c1dc; + @define-color sapphire-rgb rgb(133, 193, 220); + @define-color blue #8caaee; + @define-color blue-rgb rgb(140, 170, 238); + @define-color lavender #babbf1; + @define-color lavender-rgb rgb(186, 187, 241); + @define-color text #c6d0f5; + @define-color text-rgb rgb(198, 208, 245); + @define-color subtext1 #b5bfe2; + @define-color subtext1-rgb rgb(181, 191, 226); + @define-color subtext0 #a5adce; + @define-color subtext0-rgb rgb(165, 173, 206); + @define-color overlay2 #949cbb; + @define-color overlay2-rgb rgb(148, 156, 187); + @define-color overlay1 #838ba7; + @define-color overlay1-rgb rgb(131, 139, 167); + @define-color overlay0 #737994; + @define-color overlay0-rgb rgb(115, 121, 148); + @define-color surface2 #626880; + @define-color surface2-rgb rgb(98, 104, 128); + @define-color surface1 #51576d; + @define-color surface1-rgb rgb(81, 87, 109); + @define-color surface0 #414559; + @define-color surface0-rgb rgb(65, 69, 89); + @define-color base #303446; + @define-color base-rgb rgb(48, 52, 70); + @define-color mantle #292c3c; + @define-color mantle-rgb rgb(41, 44, 60); + @define-color crust #232634; + @define-color crust-rgb rgb(35, 38, 52); + + * { + font-family: 'FiraCode Nerd Font'; + font-size: 16px; + } + + /* Window */ + window { + margin: 0px; + padding: 10px; + border: 0.16em solid @teal; + border-radius: 0.5em; + background-color: @base; + animation: slideIn 0.25s ease-in-out both; + } + + /* Slide In */ + @keyframes slideIn { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + /* Inner Box */ + #inner-box { + margin: 5px; + padding: 10px; + border: none; + background-color: @base; + /*animation: fadeIn 0.5s ease-in-out both;*/ + } + + /* Fade In */ + @keyframes fadeIn { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + /* Outer Box */ + #outer-box { + margin: 5px; + padding: 10px; + border: none; + background-color: @base; + } + + /* Scroll */ + #scroll { + margin: 0px; + padding: 10px; + border: none; + background-color: @base; + } + + /* Input */ + #input { + margin: 5px 20px; + padding: 10px; + border: none; + border-radius: 0.25em; + color: @text; + background-color: @base; + animation: fadeIn 0.25s ease-in-out both; + } + + #input image { + border: none; + color: @red; + } + + #input * { + outline: 4px solid @red!important; + } + + /* Text */ + #text { + margin: 5px; + border: none; + color: @text; + animation: fadeIn 0.5s ease-in-out both; + } + + #entry { + background-color: @base; + } + + #entry arrow { + border: none; + color: @teal; + } + + /* Selected Entry */ + #entry:selected { + border: 0.10em solid @teal; + border-radius: 0.25em; + } + + #entry:selected #text { + color: @teal; + } + + #entry:drop(active) { + background-color: @lavender!important; + } + ''; + }; }; # Nicely reload system units when changing configs @@ -81,7 +316,6 @@ home.stateVersion = "24.05"; # don't change this - /* services = { # Change monitor positions # TODO: find a way to make this modular (ie put something different for my laptop) @@ -119,5 +353,4 @@ ]; }; }; - */ } diff --git a/homes/me/wofi.nix b/homes/me/wofi.nix new file mode 100644 index 0000000..8613519 --- /dev/null +++ b/homes/me/wofi.nix @@ -0,0 +1,192 @@ +{ + lib, + config, + pkgs, + ... +}: + +{ + options = { + #enable = lib.mkEnableOption "Enable wofi and my configuration"; + }; + + config = { + programs = { + wofi = { + enable = true; + settings = { + location = "center"; + allow_markup = true; + width = 250; + }; + style = '' + @define-color rosewater #f2d5cf; + @define-color rosewater-rgb rgb(242, 213, 207); + @define-color flamingo #eebebe; + @define-color flamingo-rgb rgb(238, 190, 190); + @define-color pink #f4b8e4; + @define-color pink-rgb rgb(244, 184, 228); + @define-color mauve #ca9ee6; + @define-color mauve-rgb rgb(202, 158, 230); + @define-color red #e78284; + @define-color red-rgb rgb(231, 130, 132); + @define-color maroon #ea999c; + @define-color maroon-rgb rgb(234, 153, 156); + @define-color peach #ef9f76; + @define-color peach-rgb rgb(239, 159, 118); + @define-color yellow #e5c890; + @define-color yellow-rgb rgb(229, 200, 144); + @define-color green #a6d189; + @define-color green-rgb rgb(166, 209, 137); + @define-color teal #81c8be; + @define-color teal-rgb rgb(129, 200, 190); + @define-color sky #99d1db; + @define-color sky-rgb rgb(153, 209, 219); + @define-color sapphire #85c1dc; + @define-color sapphire-rgb rgb(133, 193, 220); + @define-color blue #8caaee; + @define-color blue-rgb rgb(140, 170, 238); + @define-color lavender #babbf1; + @define-color lavender-rgb rgb(186, 187, 241); + @define-color text #c6d0f5; + @define-color text-rgb rgb(198, 208, 245); + @define-color subtext1 #b5bfe2; + @define-color subtext1-rgb rgb(181, 191, 226); + @define-color subtext0 #a5adce; + @define-color subtext0-rgb rgb(165, 173, 206); + @define-color overlay2 #949cbb; + @define-color overlay2-rgb rgb(148, 156, 187); + @define-color overlay1 #838ba7; + @define-color overlay1-rgb rgb(131, 139, 167); + @define-color overlay0 #737994; + @define-color overlay0-rgb rgb(115, 121, 148); + @define-color surface2 #626880; + @define-color surface2-rgb rgb(98, 104, 128); + @define-color surface1 #51576d; + @define-color surface1-rgb rgb(81, 87, 109); + @define-color surface0 #414559; + @define-color surface0-rgb rgb(65, 69, 89); + @define-color base #303446; + @define-color base-rgb rgb(48, 52, 70); + @define-color mantle #292c3c; + @define-color mantle-rgb rgb(41, 44, 60); + @define-color crust #232634; + @define-color crust-rgb rgb(35, 38, 52); + + * { + font-family: 'FiraCode Nerd Font', monospace; + font-size: 16px; + } + + /* Window */ + window { + margin: 0px; + padding: 10px; + border: 0.16em solid @teal; + border-radius: 0.5em; + background-color: @base; + animation: slideIn 0.25s ease-in-out both; + } + + /* Slide In */ + @keyframes slideIn { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + /* Inner Box */ + #inner-box { + margin: 5px; + padding: 10px; + border: none; + background-color: @base; + /*animation: fadeIn 0.5s ease-in-out both;*/ + } + + /* Fade In */ + @keyframes fadeIn { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + /* Outer Box */ + #outer-box { + margin: 5px; + padding: 10px; + border: none; + background-color: @base; + } + + /* Scroll */ + #scroll { + margin: 0px; + padding: 10px; + border: none; + background-color: @base; + } + + /* Input */ + #input { + margin: 5px 20px; + padding: 10px; + border: none; + border-radius: 0.25em; + color: @text; + background-color: @base; + animation: fadeIn 0.25s ease-in-out both; + } + + #input image { + border: none; + color: @red; + } + + #input * { + outline: 4px solid @red!important; + } + + /* Text */ + #text { + margin: 5px; + border: none; + color: @text; + animation: fadeIn 0.5s ease-in-out both; + } + + #entry { + background-color: @base; + } + + #entry arrow { + border: none; + color: @teal; + } + + /* Selected Entry */ + #entry:selected { + border: 0.10em solid @teal; + border-radius: 0.25em; + } + + #entry:selected #text { + color: @teal; + } + + #entry:drop(active) { + background-color: @lavender!important; + } + '' + }; + }; + }; +} diff --git a/hosts/myputer/default.nix b/hosts/myputer/default.nix index 18437f3..1e3d8fa 100644 --- a/hosts/myputer/default.nix +++ b/hosts/myputer/default.nix @@ -14,8 +14,26 @@ in imports = [ ./hardware-configuration.nix (import "${home-manager}/nixos") + inputs.spicetify-nix.nixosModules.default ]; + programs.spicetify = + let + spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; + in + { + enable = true; + enabledExtensions = with spicePkgs.extensions; [ + adblock + hidePodcasts + shuffle # shuffle+ (special characters are sanitized out of extension names) + ]; + #theme = spicePkgs.themes.catppuccin; + #colorScheme = "mocha"; + }; + + + # Use the systemd-boot EFI boot loader. # TODO: use GRUB2 instead boot.loader.systemd-boot.enable = true; @@ -162,7 +180,13 @@ in fonts = { enableDefaultPackages = true; # no clue what this line does tbh packages = with pkgs; [ - (nerdfonts.override { fonts = [ "Cousine" "Iosevka" "IosevkaTerm" ]; }) + (nerdfonts.override { fonts = [ "Cousine" # its already i guess + "Iosevka" # nah nah + "IosevkaTerm" # big nah + "CascadiaCode" # potential + "FiraCode" # potential + "Hasklig" + "Hack"]; }) # texlive maintains a noto-emoji flake texlivePackages.noto-emoji From c55c3f1c3b75a38430a7c8439119e41040e5f931 Mon Sep 17 00:00:00 2001 From: _cry64 Date: Wed, 30 Oct 2024 23:25:57 +1000 Subject: [PATCH 008/328] added wofi, spicetify, and fonts --- flake.lock | 40 +++++- flake.nix | 12 +- homes/me/default.nix | 259 ++++++++++++++++++++++++++++++++++++-- homes/me/wofi.nix | 192 ++++++++++++++++++++++++++++ hosts/myputer/default.nix | 26 +++- 5 files changed, 509 insertions(+), 20 deletions(-) create mode 100644 homes/me/wofi.nix diff --git a/flake.lock b/flake.lock index c2e5529..da8b556 100644 --- a/flake.lock +++ b/flake.lock @@ -49,6 +49,22 @@ "type": "github" } }, + "flake-compat_2": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, "gitignore": { "inputs": { "nixpkgs": [ @@ -327,7 +343,29 @@ "inputs": { "home-manager": "home-manager", "hyprland": "hyprland", - "nixpkgs": "nixpkgs_2" + "nixpkgs": "nixpkgs_2", + "spicetify-nix": "spicetify-nix" + } + }, + "spicetify-nix": { + "inputs": { + "flake-compat": "flake-compat_2", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1730261837, + "narHash": "sha256-syeN2dLFxJ9bhsG1YnwWpwMgCttBY1S60KUrqLIrmMo=", + "owner": "Gerg-L", + "repo": "spicetify-nix", + "rev": "1c482c8baffd494119b7f61735d35c62a0a22244", + "type": "github" + }, + "original": { + "owner": "Gerg-L", + "repo": "spicetify-nix", + "type": "github" } }, "systems": { diff --git a/flake.nix b/flake.nix index a33d49a..18ad9ae 100644 --- a/flake.nix +++ b/flake.nix @@ -9,6 +9,11 @@ inputs.nixpkgs.follows = "nixpkgs"; }; + spicetify-nix = { + url = "github:Gerg-L/spicetify-nix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + # is this necessary? (aren't I enabling it in `configuration.nix` anyways?) hyprland.url = "github:hyprwm/Hyprland"; }; @@ -26,10 +31,7 @@ pkgs = import nixpkgs { inherit system; - - config = { - allowUnfree = false; - }; + config.allowUnfree = true; }; # this is just something I'm experimenting with @@ -41,7 +43,7 @@ myputer = nixpkgs.lib.nixosSystem { # nix passes these to every single module above specialArgs = { - inherit inputs; + inherit inputs pkgs; }; modules = [ diff --git a/homes/me/default.nix b/homes/me/default.nix index e2c5c58..b943e09 100644 --- a/homes/me/default.nix +++ b/homes/me/default.nix @@ -8,14 +8,32 @@ }: { - #imports = [ - # ./nvim.nix - #]; - nixpkgs = { - config.allowUnfree = false; + config.allowUnfree = true; }; + imports = [ + # inputs.spicetify-nix.homeManagerModules.default + #./wofi.nix + ]; + + /* + programs.spicetify = + let + spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; + in + { + enable = true; + enabledExtensions = with spicePkgs.extensions; [ + adblock + hidePodcasts + shuffle # shuffle+ (special characters are sanitized out of extension names) + ]; + theme = spicePkgs.themes.catppuccin; + colorScheme = "mocha"; + }; + */ + home = { username = "me"; homeDirectory = "/home/me"; @@ -25,6 +43,33 @@ # these are both required for home-manager to work home-manager.enable = true; git.enable = true; + + # like `/bin/cat` but with syntax highlighting + # TODO: change the pager (maybe use Github:sachaos/viddy instead) + bat = { + enable = true; + config = { + pager = "less -FR"; + theme = "Dracula"; + }; + }; + + /* + spicetify = + let + spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; + in + { + enable = true; + enabledExtensions = with spicePkgs.extensions; [ + adblock + hidePodcasts + #shuffle + ]; + theme = spicePkgs.themes.catppuccin; + colorScheme = "mocha"; + }; + */ # The terminal I use # TODO: this is dependent on nvim being installed @@ -38,30 +83,39 @@ use-fork = true; # fork (dont spawn) Rio + padding-x = 10; + padding-y = [ 15 10 ]; # top, left + + # lines = (accumulated scroll * multiplier / divider) + scroll = { + multiplier = 1.0; + divider = 1.0; + }; + fonts = { - size = 18; - features = []; + size = 15; + features = []; regular = { - family = "IosevkaTerm Nerd Font"; + family = "FiraCode Nerd Font"; # "IosevkaTerm Nerd Font" style = "Normal"; weight = 400; }; bold = { - family = "IosevkaTerm Nerd Font"; + family = "FiraCode Nerd Font"; style = "Normal"; weight = 800; }; italic = { - family = "IosevkaTerm Nerd Font"; + family = "FiraCode Nerd Font"; style = "Italic"; weight = 400; }; bold-italic = { - family = "IosevkaTerm Nerd Font"; + family = "FiraCode Nerd Font"; style = "Italic"; weight = 800; }; @@ -72,8 +126,189 @@ program = "nvim"; args = []; }; + + renderer = { + performance = "High"; + backend = "Automatic"; # Vulkan + }; }; }; + + wofi = { + enable = true; + settings = { + location = "center"; + allow_markup = true; + width = 250; + }; + style = '' + @define-color rosewater #f2d5cf; + @define-color rosewater-rgb rgb(242, 213, 207); + @define-color flamingo #eebebe; + @define-color flamingo-rgb rgb(238, 190, 190); + @define-color pink #f4b8e4; + @define-color pink-rgb rgb(244, 184, 228); + @define-color mauve #ca9ee6; + @define-color mauve-rgb rgb(202, 158, 230); + @define-color red #e78284; + @define-color red-rgb rgb(231, 130, 132); + @define-color maroon #ea999c; + @define-color maroon-rgb rgb(234, 153, 156); + @define-color peach #ef9f76; + @define-color peach-rgb rgb(239, 159, 118); + @define-color yellow #e5c890; + @define-color yellow-rgb rgb(229, 200, 144); + @define-color green #a6d189; + @define-color green-rgb rgb(166, 209, 137); + @define-color teal #81c8be; + @define-color teal-rgb rgb(129, 200, 190); + @define-color sky #99d1db; + @define-color sky-rgb rgb(153, 209, 219); + @define-color sapphire #85c1dc; + @define-color sapphire-rgb rgb(133, 193, 220); + @define-color blue #8caaee; + @define-color blue-rgb rgb(140, 170, 238); + @define-color lavender #babbf1; + @define-color lavender-rgb rgb(186, 187, 241); + @define-color text #c6d0f5; + @define-color text-rgb rgb(198, 208, 245); + @define-color subtext1 #b5bfe2; + @define-color subtext1-rgb rgb(181, 191, 226); + @define-color subtext0 #a5adce; + @define-color subtext0-rgb rgb(165, 173, 206); + @define-color overlay2 #949cbb; + @define-color overlay2-rgb rgb(148, 156, 187); + @define-color overlay1 #838ba7; + @define-color overlay1-rgb rgb(131, 139, 167); + @define-color overlay0 #737994; + @define-color overlay0-rgb rgb(115, 121, 148); + @define-color surface2 #626880; + @define-color surface2-rgb rgb(98, 104, 128); + @define-color surface1 #51576d; + @define-color surface1-rgb rgb(81, 87, 109); + @define-color surface0 #414559; + @define-color surface0-rgb rgb(65, 69, 89); + @define-color base #303446; + @define-color base-rgb rgb(48, 52, 70); + @define-color mantle #292c3c; + @define-color mantle-rgb rgb(41, 44, 60); + @define-color crust #232634; + @define-color crust-rgb rgb(35, 38, 52); + + * { + font-family: 'FiraCode Nerd Font'; + font-size: 16px; + } + + /* Window */ + window { + margin: 0px; + padding: 10px; + border: 0.16em solid @teal; + border-radius: 0.5em; + background-color: @base; + animation: slideIn 0.25s ease-in-out both; + } + + /* Slide In */ + @keyframes slideIn { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + /* Inner Box */ + #inner-box { + margin: 5px; + padding: 10px; + border: none; + background-color: @base; + /*animation: fadeIn 0.5s ease-in-out both;*/ + } + + /* Fade In */ + @keyframes fadeIn { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + /* Outer Box */ + #outer-box { + margin: 5px; + padding: 10px; + border: none; + background-color: @base; + } + + /* Scroll */ + #scroll { + margin: 0px; + padding: 10px; + border: none; + background-color: @base; + } + + /* Input */ + #input { + margin: 5px 20px; + padding: 10px; + border: none; + border-radius: 0.25em; + color: @text; + background-color: @base; + animation: fadeIn 0.25s ease-in-out both; + } + + #input image { + border: none; + color: @red; + } + + #input * { + outline: 4px solid @red!important; + } + + /* Text */ + #text { + margin: 5px; + border: none; + color: @text; + animation: fadeIn 0.5s ease-in-out both; + } + + #entry { + background-color: @base; + } + + #entry arrow { + border: none; + color: @teal; + } + + /* Selected Entry */ + #entry:selected { + border: 0.10em solid @teal; + border-radius: 0.25em; + } + + #entry:selected #text { + color: @teal; + } + + #entry:drop(active) { + background-color: @lavender!important; + } + ''; + }; }; # Nicely reload system units when changing configs @@ -81,7 +316,6 @@ home.stateVersion = "24.05"; # don't change this - /* services = { # Change monitor positions # TODO: find a way to make this modular (ie put something different for my laptop) @@ -119,5 +353,4 @@ ]; }; }; - */ } diff --git a/homes/me/wofi.nix b/homes/me/wofi.nix new file mode 100644 index 0000000..8613519 --- /dev/null +++ b/homes/me/wofi.nix @@ -0,0 +1,192 @@ +{ + lib, + config, + pkgs, + ... +}: + +{ + options = { + #enable = lib.mkEnableOption "Enable wofi and my configuration"; + }; + + config = { + programs = { + wofi = { + enable = true; + settings = { + location = "center"; + allow_markup = true; + width = 250; + }; + style = '' + @define-color rosewater #f2d5cf; + @define-color rosewater-rgb rgb(242, 213, 207); + @define-color flamingo #eebebe; + @define-color flamingo-rgb rgb(238, 190, 190); + @define-color pink #f4b8e4; + @define-color pink-rgb rgb(244, 184, 228); + @define-color mauve #ca9ee6; + @define-color mauve-rgb rgb(202, 158, 230); + @define-color red #e78284; + @define-color red-rgb rgb(231, 130, 132); + @define-color maroon #ea999c; + @define-color maroon-rgb rgb(234, 153, 156); + @define-color peach #ef9f76; + @define-color peach-rgb rgb(239, 159, 118); + @define-color yellow #e5c890; + @define-color yellow-rgb rgb(229, 200, 144); + @define-color green #a6d189; + @define-color green-rgb rgb(166, 209, 137); + @define-color teal #81c8be; + @define-color teal-rgb rgb(129, 200, 190); + @define-color sky #99d1db; + @define-color sky-rgb rgb(153, 209, 219); + @define-color sapphire #85c1dc; + @define-color sapphire-rgb rgb(133, 193, 220); + @define-color blue #8caaee; + @define-color blue-rgb rgb(140, 170, 238); + @define-color lavender #babbf1; + @define-color lavender-rgb rgb(186, 187, 241); + @define-color text #c6d0f5; + @define-color text-rgb rgb(198, 208, 245); + @define-color subtext1 #b5bfe2; + @define-color subtext1-rgb rgb(181, 191, 226); + @define-color subtext0 #a5adce; + @define-color subtext0-rgb rgb(165, 173, 206); + @define-color overlay2 #949cbb; + @define-color overlay2-rgb rgb(148, 156, 187); + @define-color overlay1 #838ba7; + @define-color overlay1-rgb rgb(131, 139, 167); + @define-color overlay0 #737994; + @define-color overlay0-rgb rgb(115, 121, 148); + @define-color surface2 #626880; + @define-color surface2-rgb rgb(98, 104, 128); + @define-color surface1 #51576d; + @define-color surface1-rgb rgb(81, 87, 109); + @define-color surface0 #414559; + @define-color surface0-rgb rgb(65, 69, 89); + @define-color base #303446; + @define-color base-rgb rgb(48, 52, 70); + @define-color mantle #292c3c; + @define-color mantle-rgb rgb(41, 44, 60); + @define-color crust #232634; + @define-color crust-rgb rgb(35, 38, 52); + + * { + font-family: 'FiraCode Nerd Font', monospace; + font-size: 16px; + } + + /* Window */ + window { + margin: 0px; + padding: 10px; + border: 0.16em solid @teal; + border-radius: 0.5em; + background-color: @base; + animation: slideIn 0.25s ease-in-out both; + } + + /* Slide In */ + @keyframes slideIn { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + /* Inner Box */ + #inner-box { + margin: 5px; + padding: 10px; + border: none; + background-color: @base; + /*animation: fadeIn 0.5s ease-in-out both;*/ + } + + /* Fade In */ + @keyframes fadeIn { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + /* Outer Box */ + #outer-box { + margin: 5px; + padding: 10px; + border: none; + background-color: @base; + } + + /* Scroll */ + #scroll { + margin: 0px; + padding: 10px; + border: none; + background-color: @base; + } + + /* Input */ + #input { + margin: 5px 20px; + padding: 10px; + border: none; + border-radius: 0.25em; + color: @text; + background-color: @base; + animation: fadeIn 0.25s ease-in-out both; + } + + #input image { + border: none; + color: @red; + } + + #input * { + outline: 4px solid @red!important; + } + + /* Text */ + #text { + margin: 5px; + border: none; + color: @text; + animation: fadeIn 0.5s ease-in-out both; + } + + #entry { + background-color: @base; + } + + #entry arrow { + border: none; + color: @teal; + } + + /* Selected Entry */ + #entry:selected { + border: 0.10em solid @teal; + border-radius: 0.25em; + } + + #entry:selected #text { + color: @teal; + } + + #entry:drop(active) { + background-color: @lavender!important; + } + '' + }; + }; + }; +} diff --git a/hosts/myputer/default.nix b/hosts/myputer/default.nix index 18437f3..1e3d8fa 100644 --- a/hosts/myputer/default.nix +++ b/hosts/myputer/default.nix @@ -14,8 +14,26 @@ in imports = [ ./hardware-configuration.nix (import "${home-manager}/nixos") + inputs.spicetify-nix.nixosModules.default ]; + programs.spicetify = + let + spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; + in + { + enable = true; + enabledExtensions = with spicePkgs.extensions; [ + adblock + hidePodcasts + shuffle # shuffle+ (special characters are sanitized out of extension names) + ]; + #theme = spicePkgs.themes.catppuccin; + #colorScheme = "mocha"; + }; + + + # Use the systemd-boot EFI boot loader. # TODO: use GRUB2 instead boot.loader.systemd-boot.enable = true; @@ -162,7 +180,13 @@ in fonts = { enableDefaultPackages = true; # no clue what this line does tbh packages = with pkgs; [ - (nerdfonts.override { fonts = [ "Cousine" "Iosevka" "IosevkaTerm" ]; }) + (nerdfonts.override { fonts = [ "Cousine" # its already i guess + "Iosevka" # nah nah + "IosevkaTerm" # big nah + "CascadiaCode" # potential + "FiraCode" # potential + "Hasklig" + "Hack"]; }) # texlive maintains a noto-emoji flake texlivePackages.noto-emoji From c4449191dd16d15b787177a4c0bd8fba28eee2b9 Mon Sep 17 00:00:00 2001 From: Emile Clark-Boman Date: Wed, 30 Oct 2024 23:34:23 +1000 Subject: [PATCH 009/328] added vesktop --- hosts/myputer/default.nix | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/hosts/myputer/default.nix b/hosts/myputer/default.nix index 1e3d8fa..6ea3aba 100644 --- a/hosts/myputer/default.nix +++ b/hosts/myputer/default.nix @@ -137,9 +137,12 @@ in # ---- SYSTEM PACKAGES ----- environment.systemPackages = with pkgs; [ - # Personally I think these - kitty - + # Applications + #kitty (switched to Rio) + vesktop + helvum + easyeffects + # Pretty necessary #vim git From 501ae624e67fd8f4e102b6c752031471ada72ee1 Mon Sep 17 00:00:00 2001 From: _cry64 Date: Wed, 30 Oct 2024 23:34:23 +1000 Subject: [PATCH 010/328] added vesktop --- hosts/myputer/default.nix | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/hosts/myputer/default.nix b/hosts/myputer/default.nix index 1e3d8fa..6ea3aba 100644 --- a/hosts/myputer/default.nix +++ b/hosts/myputer/default.nix @@ -137,9 +137,12 @@ in # ---- SYSTEM PACKAGES ----- environment.systemPackages = with pkgs; [ - # Personally I think these - kitty - + # Applications + #kitty (switched to Rio) + vesktop + helvum + easyeffects + # Pretty necessary #vim git From 2a0373dc7365cb4361de7e527b531961d5c60821 Mon Sep 17 00:00:00 2001 From: Emile Clark-Boman Date: Mon, 4 Nov 2024 11:59:14 +1000 Subject: [PATCH 011/328] more incomprehensible changes :) --- README => README.md | 22 ++ flake.lock | 187 ++++++++++- flake.nix | 18 +- homes/me/default.nix | 91 ++++- homes/me/default.nix.bak | 207 ++++++++++++ homes/me/default.nix.bak13 | 410 +++++++++++++++++++++++ homes/me/theme.rasi | 209 ++++++++++++ hosts/myputer/default.nix | 108 ++++-- hosts/myputer/hardware-configuration.nix | 3 +- modules/core/bootloader/default.nix | 0 modules/core/bootloader/grub.nix | 15 + modules/core/bootloader/systemd-boot.nix | 8 + modules/discord/nixcord.nix | 29 ++ typescript | 7 + 14 files changed, 1267 insertions(+), 47 deletions(-) rename README => README.md (65%) create mode 100644 homes/me/default.nix.bak create mode 100644 homes/me/default.nix.bak13 create mode 100644 homes/me/theme.rasi delete mode 100644 modules/core/bootloader/default.nix create mode 100644 modules/discord/nixcord.nix create mode 100644 typescript diff --git a/README b/README.md similarity index 65% rename from README rename to README.md index c09a31b..7a3953a 100644 --- a/README +++ b/README.md @@ -45,6 +45,26 @@ my dotfiles to also work on non-NixOS systems. +### Explaining my Vision with r/unixporn posts +I want the side panel from https://www.reddit.com/r/unixporn/comments/12wpvyf/hyprland_eww_is_all_i_need/ +but not the colour scheme and I'm 50/50 on the bar being on th eleft side lol. Also I love the volume bar on the right! + +https://www.reddit.com/r/unixporn/comments/12uy6q6/hyprland_first_time_trying_a_wm_ended_up/ +I love love love their rofi theme, everything else is eh (except the background switching is cool) + +https://www.reddit.com/r/unixporn/comments/1avnfjn/hyprland_animations_theme_generation_settings/ +I love their settings apps + +https://www.reddit.com/r/unixporn/comments/u7vgej/desktop_endeavouros_gnome_42/ +I like to imagine they have the ability to have nothing but apps on their screen (like a do not disturb / focus mode) + +https://www.reddit.com/r/unixporn/comments/xkvmhy/hyprland_dreamy/ +Their window decorations and bar are great, also being able to hide everything upwards is so cool + +https://www.reddit.com/r/unixporn/comments/vkcasz/i3gaps_i_prefer_light_mode/ +If their colour scheme was a little less white I'd love it but overall one of my favourites every + + ### Credits 1. https://github.com/XNM1/linux-nixos-hyprland-config-dotfiles The simplicity of their layout is amazing, was really good to pick out small modules and learn how something works / is configured. @@ -52,3 +72,5 @@ The simplicity of their layout is amazing, was really good to pick out small mod Really great starter config for learning how parts interact and how to generally structure flakes 3. https://nixos.wiki/wiki/Fonts Wiki page explaining how to install fonts and nerd fonts on NixOS +4. https://github.com/adi1090x/rofi +For the Rofi theme diff --git a/flake.lock b/flake.lock index da8b556..eb4fc3d 100644 --- a/flake.lock +++ b/flake.lock @@ -50,6 +50,36 @@ } }, "flake-compat_2": { + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "revCount": 57, + "type": "tarball", + "url": "https://api.flakehub.com/f/pinned/edolstra/flake-compat/1.0.1/018afb31-abd1-7bff-a5e4-cff7e18efb7a/source.tar.gz" + }, + "original": { + "type": "tarball", + "url": "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz" + } + }, + "flake-compat_3": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_4": { "flake": false, "locked": { "lastModified": 1696426674, @@ -87,6 +117,24 @@ "type": "github" } }, + "grub2-themes": { + "inputs": { + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1730004881, + "narHash": "sha256-8xVIqIW25o2uCL0fxAmP4Sj9sdebarQXmd1+64yMe8o=", + "owner": "vinceliuice", + "repo": "grub2-themes", + "rev": "42c232dfb46bf93c17506cbc1a574e5e89b5e09f", + "type": "github" + }, + "original": { + "owner": "vinceliuice", + "repo": "grub2-themes", + "type": "github" + } + }, "home-manager": { "inputs": { "nixpkgs": [ @@ -144,7 +192,7 @@ "hyprlang": "hyprlang", "hyprutils": "hyprutils", "hyprwayland-scanner": "hyprwayland-scanner", - "nixpkgs": "nixpkgs", + "nixpkgs": "nixpkgs_2", "pre-commit-hooks": "pre-commit-hooks", "systems": "systems", "xdph": "xdph" @@ -267,18 +315,37 @@ "type": "github" } }, + "nixcord": { + "inputs": { + "flake-compat": "flake-compat_2", + "nixpkgs": "nixpkgs_3" + }, + "locked": { + "lastModified": 1730107956, + "narHash": "sha256-Ohwk5/RGhGjDXaD4v0Yc40J/79gHRcD92mKWY+6qHJU=", + "owner": "kaylorben", + "repo": "nixcord", + "rev": "5dcb476b924ad08ffd8521cca812052605cb5974", + "type": "github" + }, + "original": { + "owner": "kaylorben", + "repo": "nixcord", + "type": "github" + } + }, "nixpkgs": { "locked": { - "lastModified": 1729413321, - "narHash": "sha256-I4tuhRpZFa6Fu6dcH9Dlo5LlH17peT79vx1y1SpeKt0=", + "lastModified": 1730370246, + "narHash": "sha256-UD2XmS6IWT+G/scUpPItb0dNijT5Dxa7WMuVqRhiaxU=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "1997e4aa514312c1af7e2bda7fad1644e778ff26", + "rev": "88f31ac8837ab15748102da8bbc6e96a9330be0d", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixos-unstable", + "ref": "master", "repo": "nixpkgs", "type": "github" } @@ -300,6 +367,38 @@ } }, "nixpkgs_2": { + "locked": { + "lastModified": 1729413321, + "narHash": "sha256-I4tuhRpZFa6Fu6dcH9Dlo5LlH17peT79vx1y1SpeKt0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "1997e4aa514312c1af7e2bda7fad1644e778ff26", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1730170245, + "narHash": "sha256-PRq4vJjDa+m1mNwkV9H7zVzMhuMqsHJrTGx0iJZ0e0w=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "30c9efeef01e2ad4880bff6a01a61dd99536b3c9", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_4": { "locked": { "lastModified": 1729413321, "narHash": "sha256-I4tuhRpZFa6Fu6dcH9Dlo5LlH17peT79vx1y1SpeKt0=", @@ -315,6 +414,22 @@ "type": "github" } }, + "nixpkgs_5": { + "locked": { + "lastModified": 1727634051, + "narHash": "sha256-S5kVU7U82LfpEukbn/ihcyNt2+EvG7Z5unsKW9H/yFA=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "06cf0e1da4208d3766d898b7fdab6513366d45b9", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, "pre-commit-hooks": { "inputs": { "flake-compat": "flake-compat", @@ -341,15 +456,18 @@ }, "root": { "inputs": { + "grub2-themes": "grub2-themes", "home-manager": "home-manager", "hyprland": "hyprland", - "nixpkgs": "nixpkgs_2", - "spicetify-nix": "spicetify-nix" + "nixcord": "nixcord", + "nixpkgs": "nixpkgs_4", + "spicetify-nix": "spicetify-nix", + "swww": "swww" } }, "spicetify-nix": { "inputs": { - "flake-compat": "flake-compat_2", + "flake-compat": "flake-compat_3", "nixpkgs": [ "nixpkgs" ] @@ -368,6 +486,26 @@ "type": "github" } }, + "swww": { + "inputs": { + "flake-compat": "flake-compat_4", + "nixpkgs": "nixpkgs_5", + "utils": "utils" + }, + "locked": { + "lastModified": 1730050836, + "narHash": "sha256-6xCp6rTJ5MWxfUXUYxWRZz1CA5V9/gGqgb0+34BMF6U=", + "owner": "LGFae", + "repo": "swww", + "rev": "36808dfd90223e648fcc45075ca57392b3d6a297", + "type": "github" + }, + "original": { + "owner": "LGFae", + "repo": "swww", + "type": "github" + } + }, "systems": { "locked": { "lastModified": 1689347949, @@ -383,6 +521,39 @@ "type": "github" } }, + "systems_2": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "utils": { + "inputs": { + "systems": "systems_2" + }, + "locked": { + "lastModified": 1726560853, + "narHash": "sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, "xdph": { "inputs": { "hyprland-protocols": [ diff --git a/flake.nix b/flake.nix index 18ad9ae..3f56093 100644 --- a/flake.nix +++ b/flake.nix @@ -13,9 +13,21 @@ url = "github:Gerg-L/spicetify-nix"; inputs.nixpkgs.follows = "nixpkgs"; }; + + #stylix.url = "github:danth/stylix"; + + nixcord = { + url = "github:kaylorben/nixcord"; + }; + + grub2-themes = { + url = "github:vinceliuice/grub2-themes"; + }; # is this necessary? (aren't I enabling it in `configuration.nix` anyways?) hyprland.url = "github:hyprwm/Hyprland"; + + swww.url = "github:LGFae/swww"; }; outputs = { @@ -23,11 +35,12 @@ nixpkgs, home-manager, hyprland, + grub2-themes, + #stylix, ... }@inputs: let system = "x86_64-linux"; - #system = pkgs.stdenv.hostPlatform.system; pkgs = import nixpkgs { inherit system; @@ -48,7 +61,8 @@ modules = [ ./hosts/myputer - #home-manager.nixosModules.default + grub2-themes.nixosModules.default + #stylix.nixosModules.stylix ]; }; diff --git a/homes/me/default.nix b/homes/me/default.nix index b943e09..806471c 100644 --- a/homes/me/default.nix +++ b/homes/me/default.nix @@ -13,8 +13,9 @@ }; imports = [ + # inputs.nixcord.homeManagerModules.nixcord # inputs.spicetify-nix.homeManagerModules.default - #./wofi.nix + # ./wofi.nix ]; /* @@ -34,6 +35,25 @@ }; */ + # ----- STYLIX ----- + + #stylix = { + # enable = true; + # + # image = pkgs.fetchurl { + # url = "https://www.pixelstalk.net/wp-content/uploads/2016/05/Epic-Anime-Awesome-Wallpapers.jpg"; + # sha256 = "enQo3wqhgf0FEPHj2coOCvo7DuZv+x5rL/WIo4qPI50="; + # }; + # + # # Stylix will automatically theme applications + # autoEnable = true; + # targets = { + # # disable Stylix's themes for ones I will theme manually + # firefox.enable = false; + # wofi.enable = false; + # }; + #}; + home = { username = "me"; homeDirectory = "/home/me"; @@ -42,18 +62,58 @@ programs = { # these are both required for home-manager to work home-manager.enable = true; - git.enable = true; + git = { + enable = true; + userName = "emileclarkb"; + userEmail = "eclarkboman@gmail.com"; + }; + # like `/bin/cat` but with syntax highlighting # TODO: change the pager (maybe use Github:sachaos/viddy instead) bat = { enable = true; config = { pager = "less -FR"; - theme = "Dracula"; + # let Stylix control the theme + #theme = "Dracula"; }; }; + firefox = { + enable = true; + policies = { + #BlockAboutConfig = true; + DefaultDownloadDirectory = "\${home}/downloads"; + }; + }; + + # I want to use fish as my login shell but it always + # goes terrible cause it isn't POSIX compliant, so + # instead Bash is my login and it will just exec fish + #bash = { + # interactiveShellInit = '' + # if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]] + # then + # shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION="" + # exec ${pkgs.fish}/bin/fish $LOGIN_OPTION + # fi + # ''; + #}; + + fish = { + enable = true; + interactiveShellInit = '' + set -g fish_greeting "Welcome weary traveler to my shop" + ''; + plugins = [ + { + name = "grc"; + src = pkgs.fishPlugins.grc.src; + } + ]; + }; + /* spicetify = let @@ -88,7 +148,7 @@ # lines = (accumulated scroll * multiplier / divider) scroll = { - multiplier = 1.0; + multiplier = 3.0; divider = 1.0; }; @@ -141,7 +201,8 @@ allow_markup = true; width = 250; }; - style = '' + # Force the style to stop Stylix being a bitch and overwriting it + style = lib.mkForce '' @define-color rosewater #f2d5cf; @define-color rosewater-rgb rgb(242, 213, 207); @define-color flamingo #eebebe; @@ -309,13 +370,19 @@ } ''; }; + + rofi = { + enable = true; + package = pkgs.rofi-wayland; + font = "JetBrains Mono Nerd Font 10"; + location = "center"; + terminal = "${pkgs.rio}/bin/rio"; + }; + }; - # Nicely reload system units when changing configs - systemd.user.startServices = "sd-switch"; - - home.stateVersion = "24.05"; # don't change this + # ----- SERVICES ----- services = { # Change monitor positions # TODO: find a way to make this modular (ie put something different for my laptop) @@ -353,4 +420,10 @@ ]; }; }; + + + # Nicely reload system units when changing configs + systemd.user.startServices = "sd-switch"; + + home.stateVersion = "24.05"; # don't change this } diff --git a/homes/me/default.nix.bak b/homes/me/default.nix.bak new file mode 100644 index 0000000..3573995 --- /dev/null +++ b/homes/me/default.nix.bak @@ -0,0 +1,207 @@ +{ + inputs, + outputs, + lib, + config, + pkgs, + ... +}: + +{ + nixpkgs = { + config.allowUnfree = true; + }; + + imports = [ + # inputs.spicetify-nix.homeManagerModules.default + #./wofi.nix + ]; + + /* + programs.spicetify = + let + spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; + in + { + enable = true; + enabledExtensions = with spicePkgs.extensions; [ + adblock + hidePodcasts + shuffle # shuffle+ (special characters are sanitized out of extension names) + ]; + theme = spicePkgs.themes.catppuccin; + colorScheme = "mocha"; + }; + */ + + #wayland.windowManager.hyprland.enable = true; + + home = { + username = "me"; + homeDirectory = "/home/me"; + }; + + programs = { + # these are both required for home-manager to work + home-manager.enable = true; + git.enable = true; + + # like `/bin/cat` but with syntax highlighting + # TODO: change the pager (maybe use Github:sachaos/viddy instead) + bat = { + enable = true; + config = { + pager = "less -FR"; + #theme = "Dracula"; + }; + }; + + /* + spicetify = + let + spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; + in + { + enable = true; + enabledExtensions = with spicePkgs.extensions; [ + adblock + hidePodcasts + #shuffle + ]; + theme = spicePkgs.themes.catppuccin; + colorScheme = "mocha"; + }; + */ + + # The terminal I use + # TODO: this is dependent on nvim being installed + # TODO: make this into a module with a configurable editor option + rio = { + enable = true; + # Rio Config Docs: https://raphamorim.io/rio/docs/config + settings = { + theme = "dracula"; + hide-mouse-cursor-when-typing = true; + + use-fork = true; # fork (dont spawn) Rio + + padding-x = 10; + padding-y = [ 15 10 ]; # top, left + + # lines = (accumulated scroll * multiplier / divider) + scroll = { + multiplier = 1.0; + divider = 1.0; + }; + + fonts = { + size = 15; + features = []; + + regular = { + family = "FiraCode Nerd Font"; # "IosevkaTerm Nerd Font" + style = "Normal"; + weight = 400; + }; + + bold = { + family = "FiraCode Nerd Font"; + style = "Normal"; + weight = 800; + }; + + italic = { + family = "FiraCode Nerd Font"; + style = "Italic"; + weight = 400; + }; + + bold-italic = { + family = "FiraCode Nerd Font"; + style = "Italic"; + weight = 800; + }; + }; + + # Run when the `OpenConfigEditor` keybinding is triggered + editor = { + program = "nvim"; + args = []; + }; + + renderer = { + performance = "High"; + backend = "Automatic"; # Vulkan + }; + }; + }; + + wofi = { + enable = true; + settings = { + location = "center"; + allow_markup = true; + width = 250; + }; + }; + }; + + # ----- SERVICES ----- + services = { + # Hyprland Wallpaper + #hyprpaper = { + # enable = true; + # settings = { + # preload = [ "~/nixdots/wallpapers/ghibli-esque-valley.png" ]; + # wallpaper = [ + # "DP-2,~/nixdots/wallpapers/ghibli-esque-valley.png" + # "HDMI-A-1,~/nixdots/wallpapers/ghibli-esque-valley.png" + # ]; + # }; + #}; + + hyprpaper.enable = true; # so stylix can see it + + # Change monitor positions + # TODO: find a way to make this modular (ie put something different for my laptop) + # my idea is to have a "monitors" module and use kanshi for wayland + kanshi = { + enable = true; + systemdTarget = "hyprland-session.target"; + # You can find your monitors in hyprland by using `hyprctl monitors all` + settings = [ + { # 1920x1080@144 gaming monitor + output.criteria = "HDMI-A-1"; + output.mode = "1920x1080@119.98Hz"; + output.scale = 1.0; + output.adaptiveSync = false; # Variable Refresh Rate (this can be changed for gaming) + } + { # 4k side monitor + output.criteria = "DP-2"; + output.mode = "3840x2160@60.00Hz"; + output.scale = 2.0; + } + + { # This is my default setup + profile.name = "default"; + profile.outputs = [ + { + criteria = "DP-2"; + position = "0,0"; + } + { + criteria = "HDMI-A-1"; + position = "3840,0"; + } + ]; + } + ]; + }; + }; + + + # Nicely reload system units when changing configs + systemd.user.startServices = "sd-switch"; + + home.stateVersion = "24.05"; # don't change this +} diff --git a/homes/me/default.nix.bak13 b/homes/me/default.nix.bak13 new file mode 100644 index 0000000..f5b3589 --- /dev/null +++ b/homes/me/default.nix.bak13 @@ -0,0 +1,410 @@ +{ + inputs, + outputs, + lib, + config, + pkgs, + ... +}: + +{ + nixpkgs = { + config.allowUnfree = true; + }; + + imports = [ + #inputs.nixcord.homeManagerModules.nixcord + # inputs.spicetify-nix.homeManagerModules.default + #./wofi.nix + ]; + + /* + programs.spicetify = + let + spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; + in + { + enable = true; + enabledExtensions = with spicePkgs.extensions; [ + adblock + hidePodcasts + shuffle # shuffle+ (special characters are sanitized out of extension names) + ]; + theme = spicePkgs.themes.catppuccin; + colorScheme = "mocha"; + }; + */ + + # ----- STYLIX ----- + + #stylix = { + # enable = true; + # + # image = pkgs.fetchurl { + # url = "https://www.pixelstalk.net/wp-content/uploads/2016/05/Epic-Anime-Awesome-Wallpapers.jpg"; + # sha256 = "enQo3wqhgf0FEPHj2coOCvo7DuZv+x5rL/WIo4qPI50="; + # }; + # + # # Stylix will automatically theme applications + # autoEnable = true; + # targets = { + # # disable Stylix's themes for ones I will theme manually + # firefox.enable = false; + # wofi.enable = false; + # }; + #}; + + home = { + username = "me"; + homeDirectory = "/home/me"; + }; + + programs = { + # these are both required for home-manager to work + home-manager.enable = true; + git.enable = true; + + # like `/bin/cat` but with syntax highlighting + # TODO: change the pager (maybe use Github:sachaos/viddy instead) + bat = { + enable = true; + config = { + pager = "less -FR"; + # let Stylix control the theme + #theme = "Dracula"; + }; + }; + + firefox = { + enable = true; + policies = { + #BlockAboutConfig = true; + DefaultDownloadDirectory = "\${home}/downloads"; + }; + }; + + /* + spicetify = + let + spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; + in + { + enable = true; + enabledExtensions = with spicePkgs.extensions; [ + adblock + hidePodcasts + #shuffle + ]; + theme = spicePkgs.themes.catppuccin; + colorScheme = "mocha"; + }; + */ + + # The terminal I use + # TODO: this is dependent on nvim being installed + # TODO: make this into a module with a configurable editor option + rio = { + enable = true; + # Rio Config Docs: https://raphamorim.io/rio/docs/config + settings = { + theme = "dracula"; + hide-mouse-cursor-when-typing = true; + + use-fork = true; # fork (dont spawn) Rio + + padding-x = 10; + padding-y = [ 15 10 ]; # top, left + + # lines = (accumulated scroll * multiplier / divider) + scroll = { + multiplier = 3.0; + divider = 1.0; + }; + + fonts = { + size = 15; + features = []; + + regular = { + family = "FiraCode Nerd Font"; # "IosevkaTerm Nerd Font" + style = "Normal"; + weight = 400; + }; + + bold = { + family = "FiraCode Nerd Font"; + style = "Normal"; + weight = 800; + }; + + italic = { + family = "FiraCode Nerd Font"; + style = "Italic"; + weight = 400; + }; + + bold-italic = { + family = "FiraCode Nerd Font"; + style = "Italic"; + weight = 800; + }; + }; + + # Run when the `OpenConfigEditor` keybinding is triggered + editor = { + program = "nvim"; + args = []; + }; + + renderer = { + performance = "High"; + backend = "Automatic"; # Vulkan + }; + }; + }; + + wofi = { + enable = true; + settings = { + location = "center"; + allow_markup = true; + width = 250; + }; + # Force the style to stop Stylix being a bitch and overwriting it + style = lib.mkForce '' + @define-color rosewater #f2d5cf; + @define-color rosewater-rgb rgb(242, 213, 207); + @define-color flamingo #eebebe; + @define-color flamingo-rgb rgb(238, 190, 190); + @define-color pink #f4b8e4; + @define-color pink-rgb rgb(244, 184, 228); + @define-color mauve #ca9ee6; + @define-color mauve-rgb rgb(202, 158, 230); + @define-color red #e78284; + @define-color red-rgb rgb(231, 130, 132); + @define-color maroon #ea999c; + @define-color maroon-rgb rgb(234, 153, 156); + @define-color peach #ef9f76; + @define-color peach-rgb rgb(239, 159, 118); + @define-color yellow #e5c890; + @define-color yellow-rgb rgb(229, 200, 144); + @define-color green #a6d189; + @define-color green-rgb rgb(166, 209, 137); + @define-color teal #81c8be; + @define-color teal-rgb rgb(129, 200, 190); + @define-color sky #99d1db; + @define-color sky-rgb rgb(153, 209, 219); + @define-color sapphire #85c1dc; + @define-color sapphire-rgb rgb(133, 193, 220); + @define-color blue #8caaee; + @define-color blue-rgb rgb(140, 170, 238); + @define-color lavender #babbf1; + @define-color lavender-rgb rgb(186, 187, 241); + @define-color text #c6d0f5; + @define-color text-rgb rgb(198, 208, 245); + @define-color subtext1 #b5bfe2; + @define-color subtext1-rgb rgb(181, 191, 226); + @define-color subtext0 #a5adce; + @define-color subtext0-rgb rgb(165, 173, 206); + @define-color overlay2 #949cbb; + @define-color overlay2-rgb rgb(148, 156, 187); + @define-color overlay1 #838ba7; + @define-color overlay1-rgb rgb(131, 139, 167); + @define-color overlay0 #737994; + @define-color overlay0-rgb rgb(115, 121, 148); + @define-color surface2 #626880; + @define-color surface2-rgb rgb(98, 104, 128); + @define-color surface1 #51576d; + @define-color surface1-rgb rgb(81, 87, 109); + @define-color surface0 #414559; + @define-color surface0-rgb rgb(65, 69, 89); + @define-color base #303446; + @define-color base-rgb rgb(48, 52, 70); + @define-color mantle #292c3c; + @define-color mantle-rgb rgb(41, 44, 60); + @define-color crust #232634; + @define-color crust-rgb rgb(35, 38, 52); + + * { + font-family: 'FiraCode Nerd Font'; + font-size: 16px; + } + + /* Window */ + window { + margin: 0px; + padding: 10px; + border: 0.16em solid @teal; + border-radius: 0.5em; + background-color: @base; + animation: slideIn 0.25s ease-in-out both; + } + + /* Slide In */ + @keyframes slideIn { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + /* Inner Box */ + #inner-box { + margin: 5px; + padding: 10px; + border: none; + background-color: @base; + /*animation: fadeIn 0.5s ease-in-out both;*/ + } + + /* Fade In */ + @keyframes fadeIn { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + /* Outer Box */ + #outer-box { + margin: 5px; + padding: 10px; + border: none; + background-color: @base; + } + + /* Scroll */ + #scroll { + margin: 0px; + padding: 10px; + border: none; + background-color: @base; + } + + /* Input */ + #input { + margin: 5px 20px; + padding: 10px; + border: none; + border-radius: 0.25em; + color: @text; + background-color: @base; + animation: fadeIn 0.25s ease-in-out both; + } + + #input image { + border: none; + color: @red; + } + + #input * { + outline: 4px solid @red!important; + } + + /* Text */ + #text { + margin: 5px; + border: none; + color: @text; + animation: fadeIn 0.5s ease-in-out both; + } + + #entry { + background-color: @base; + } + + #entry arrow { + border: none; + color: @teal; + } + + /* Selected Entry */ + #entry:selected { + border: 0.10em solid @teal; + border-radius: 0.25em; + } + + #entry:selected #text { + color: @teal; + } + + #entry:drop(active) { + background-color: @lavender!important; + } + ''; + }; + + rofi = { + enable = true; + package = pkgs.rofi-wayland; + font = "JetBrains Mono Nerd Font 10"; + location = "center"; + terminal = "${pkgs.rio}/bin/rio"; + }; + + }; + + + # ----- SERVICES ----- + services = { + # Hyprland Wallpaper + #hyprpaper = { + # enable = true; + # settings = { + # preload = [ "/home/me/nixdots/wallpapers/wall.png" ]; + # wallpaper = [ + # "DP-2,/home/me/nixdots/wallpapers/wall.png" + # "HDMI-A-1,/home/me/nixdots/wallpapers/wall.png" + # ]; + # }; + #}; + + # Change monitor positions + # TODO: find a way to make this modular (ie put something different for my laptop) + # my idea is to have a "monitors" module and use kanshi for wayland + kanshi = { + enable = true; + systemdTarget = "hyprland-session.target"; + # You can find your monitors in hyprland by using `hyprctl monitors all` + settings = [ + { # 1920x1080@144 gaming monitor + output.criteria = "HDMI-A-1"; + output.mode = "1920x1080@119.98Hz"; + output.scale = 1.0; + output.adaptiveSync = false; # Variable Refresh Rate (this can be changed for gaming) + } + { # 4k side monitor + output.criteria = "DP-2"; + output.mode = "3840x2160@60.00Hz"; + output.scale = 2.0; + } + + { # This is my default setup + profile.name = "default"; + profile.outputs = [ + { + criteria = "DP-2"; + position = "0,0"; + } + { + criteria = "HDMI-A-1"; + position = "3840,0"; + } + ]; + } + ]; + }; + }; + + + # Nicely reload system units when changing configs + systemd.user.startServices = "sd-switch"; + + home.stateVersion = "24.05"; # don't change this +} diff --git a/homes/me/theme.rasi b/homes/me/theme.rasi new file mode 100644 index 0000000..07c375d --- /dev/null +++ b/homes/me/theme.rasi @@ -0,0 +1,209 @@ +/** + * + * Author : Aditya Shakya (adi1090x) + * Github : @adi1090x + * + * Rofi Theme File + * Rofi Version: 1.7.3 + **/ + +/*****----- Configuration -----*****/ +configuration { + modi: "drun,run,filebrowser,window"; + show-icons: true; + display-drun: "APPS"; + display-run: "RUN"; + display-filebrowser: "FILES"; + display-window: "WINDOW"; + drun-display-format: "{name}"; + window-format: "{w} · {c} · {t}"; +} + +/*****----- Global Properties -----*****/ +* { + font: "JetBrains Mono Nerd Font 10"; + background: #11092D; + background-alt: #281657; + foreground: #FFFFFF; + selected: #DF5296; + active: #6E77FF; + urgent: #8E3596; +} + +/*****----- Main Window -----*****/ +window { + /* properties for window widget */ + transparency: "real"; + location: center; + anchor: center; + fullscreen: false; + width: 1000px; + x-offset: 0px; + y-offset: 0px; + + /* properties for all widgets */ + enabled: true; + border-radius: 15px; + cursor: "default"; + background-color: @background; +} + +/*****----- Main Box -----*****/ +mainbox { + enabled: true; + spacing: 0px; + background-color: transparent; + orientation: horizontal; + children: [ "imagebox", "listbox" ]; +} + +imagebox { + padding: 20px; + background-color: transparent; + background-image: url("~/.config/rofi/images/j.jpg", height); + orientation: vertical; + children: [ "inputbar", "dummy", "mode-switcher" ]; +} + +listbox { + spacing: 20px; + padding: 20px; + background-color: transparent; + orientation: vertical; + children: [ "message", "listview" ]; +} + +dummy { + background-color: transparent; +} + +/*****----- Inputbar -----*****/ +inputbar { + enabled: true; + spacing: 10px; + padding: 15px; + border-radius: 10px; + background-color: @background-alt; + text-color: @foreground; + children: [ "textbox-prompt-colon", "entry" ]; +} +textbox-prompt-colon { + enabled: true; + expand: false; + str: ""; + background-color: inherit; + text-color: inherit; +} +entry { + enabled: true; + background-color: inherit; + text-color: inherit; + cursor: text; + placeholder: "Search"; + placeholder-color: inherit; +} + +/*****----- Mode Switcher -----*****/ +mode-switcher{ + enabled: true; + spacing: 20px; + background-color: transparent; + text-color: @foreground; +} +button { + padding: 15px; + border-radius: 10px; + background-color: @background-alt; + text-color: inherit; + cursor: pointer; +} +button selected { + background-color: @selected; + text-color: @foreground; +} + +/*****----- Listview -----*****/ +listview { + enabled: true; + columns: 1; + lines: 8; + cycle: true; + dynamic: true; + scrollbar: false; + layout: vertical; + reverse: false; + fixed-height: true; + fixed-columns: true; + + spacing: 10px; + background-color: transparent; + text-color: @foreground; + cursor: "default"; +} + +/*****----- Elements -----*****/ +element { + enabled: true; + spacing: 15px; + padding: 8px; + border-radius: 10px; + background-color: transparent; + text-color: @foreground; + cursor: pointer; +} +element normal.normal { + background-color: inherit; + text-color: inherit; +} +element normal.urgent { + background-color: @urgent; + text-color: @foreground; +} +element normal.active { + background-color: @active; + text-color: @foreground; +} +element selected.normal { + background-color: @selected; + text-color: @foreground; +} +element selected.urgent { + background-color: @urgent; + text-color: @foreground; +} +element selected.active { + background-color: @urgent; + text-color: @foreground; +} +element-icon { + background-color: transparent; + text-color: inherit; + size: 32px; + cursor: inherit; +} +element-text { + background-color: transparent; + text-color: inherit; + cursor: inherit; + vertical-align: 0.5; + horizontal-align: 0.0; +} + +/*****----- Message -----*****/ +message { + background-color: transparent; +} +textbox { + padding: 15px; + border-radius: 10px; + background-color: @background-alt; + text-color: @foreground; + vertical-align: 0.5; + horizontal-align: 0.0; +} +error-message { + padding: 15px; + border-radius: 20px; + background-color: @background; + text-color: @foreground; +} diff --git a/hosts/myputer/default.nix b/hosts/myputer/default.nix index 6ea3aba..a4e6f6a 100644 --- a/hosts/myputer/default.nix +++ b/hosts/myputer/default.nix @@ -36,19 +36,19 @@ in # Use the systemd-boot EFI boot loader. # TODO: use GRUB2 instead - boot.loader.systemd-boot.enable = true; - boot.loader.efi.canTouchEfiVariables = true; - #boot.loader = { - # efi = { - # canTouchEfiVariables = true; - # efiSysMountPoint = "/boot/efi"; - # }; - # grub = { - # efiSupport = true; - # #efiInstallAsRemovable = true; # in case canTouchEfiVariables doesn't work on this system - # device = "nodev"; - # }; - #}; + #boot.loader.systemd-boot.enable = true; + #boot.loader.efi.canTouchEfiVariables = true; + boot.loader = { + efi = { + canTouchEfiVariables = true; + efiSysMountPoint = "/boot/efi"; + }; + grub = { + efiSupport = true; + #efiInstallAsRemovable = true; # in case canTouchEfiVariables doesn't work on this system + device = "nodev"; + }; + }; # Set your time zone. time.timeZone = "Australia/Brisbane"; @@ -97,6 +97,10 @@ in }; users = { + # using fish as the login shell tends + # to go very poorly because it isn't + # POSIX compliant, so we'll just use + # simple Bash then :) defaultUserShell = pkgs.bash; users = { @@ -104,7 +108,7 @@ in me = { isNormalUser = true; extraGroups = [ "wheel" ]; - shell = pkgs.fish; + shell = pkgs.bash; #pkgs.fish packages = with pkgs; [ firefox nitch @@ -117,7 +121,7 @@ in dev = { isNormalUser = true; extraGroups = [ "wheel" ]; - shell = pkgs.zsh; + shell = pkgs.bash; #pkgs.zsh packages = with pkgs; [ ]; }; @@ -126,7 +130,7 @@ in ae = { isNormalUser = true; extraGroups = [ "wheel" ]; - shell = pkgs.fish; + shell = pkgs.bash; #pkgs.fish packages = with pkgs; [ ]; }; @@ -137,29 +141,44 @@ in # ---- SYSTEM PACKAGES ----- environment.systemPackages = with pkgs; [ - # Applications - #kitty (switched to Rio) - vesktop + # User Environment + inputs.swww.packages.${pkgs.system}.swww + #vesktop helvum easyeffects + ani-cli + + wl-clipboard # clipboard for wayland + + python310 # I use 3.10 since it's in a pretty stable state now + + # fish plugins + grc # colorise command outputs # Pretty necessary - #vim git - # Super duper necessary + # Unix Commands wget tree ]; - # Enable the use of certain programs programs = { - hyprland.enable = true; - fish.enable = true; - zsh.enable = true; + hyprland = { + enable = true; + # set the flake package + package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland; + # make sure to also set the portal package, so that they are in sync + portalPackage = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland; - git.enable = true; + xwayland.enable = true; + #systemd.enable = true; + }; + + + zsh.enable = true; + fish.enable = true; neovim = { enable = true; @@ -172,9 +191,21 @@ in set tabstop=4 set shiftwidth=4 ''; - # set cc=80 }; }; + + # I want to use fish as my login shell but it always goes terrible + # cause it isn't POSIX compliant, so instead Bash is my login and + # will just exec fish (^-^) + bash = { + interactiveShellInit = '' + if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]] + then + shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION="" + exec ${pkgs.fish}/bin/fish $LOGIN_OPTION + fi + ''; + }; }; @@ -188,6 +219,7 @@ in "IosevkaTerm" # big nah "CascadiaCode" # potential "FiraCode" # potential + "JetBrainsMono" # for my rofi theme "Hasklig" "Hack"]; }) @@ -206,6 +238,21 @@ in }; + # ----- STYLIX ----- + + #stylix = { + # enable = true; + # image = pkgs.fetchurl { + # url = "https://www.pixelstalk.net/wp-content/uploads/2016/05/Epic-Anime-Awesome-Wallpapers.jpg"; + # sha256 = "enQo3wqhgf0FEPHj2coOCvo7DuZv+x5rL/WIo4qPI50="; + # }; + # + # # Stylix will automatically theme applications + # #autoEnable = true; + # #image = ../../wallpapers/wall.png; + # #image = "/home/me/nixdots/wallpapers/ghibli-esque-valley.png"; + #}; + # Enable the new CLI commands and the flakes as experimental features @@ -225,6 +272,13 @@ in # Enable the OpenSSH daemon. # services.openssh.enable = true; + + # Enable OpenGL + hardware = { + graphics.enable = true; + }; + + # DO NOT MODIFY system.stateVersion = "24.05"; # Did you read the comment? diff --git a/hosts/myputer/hardware-configuration.nix b/hosts/myputer/hardware-configuration.nix index 46551ec..9eb2faf 100644 --- a/hosts/myputer/hardware-configuration.nix +++ b/hosts/myputer/hardware-configuration.nix @@ -18,7 +18,8 @@ fsType = "ext4"; }; - fileSystems."/boot" = + #fileSystems."/boot" = # BIOS + fileSystems."/boot" = # UEFI { device = "/dev/disk/by-uuid/7046-177A"; fsType = "vfat"; options = [ "fmask=0077" "dmask=0077" ]; diff --git a/modules/core/bootloader/default.nix b/modules/core/bootloader/default.nix deleted file mode 100644 index e69de29..0000000 diff --git a/modules/core/bootloader/grub.nix b/modules/core/bootloader/grub.nix index e69de29..5d63dff 100644 --- a/modules/core/bootloader/grub.nix +++ b/modules/core/bootloader/grub.nix @@ -0,0 +1,15 @@ +{...}: + +{ + boot.loader = { + efi = { + canTouchEfiVariables = true; + efiSysMountPoint = "/boot/efi"; + }; + grub = { + efiSupport = true; + #efiInstallAsRemovable = true; # in case canTouchEfiVariables doesn't work on your system + device = "nodev"; + }; + }; +} diff --git a/modules/core/bootloader/systemd-boot.nix b/modules/core/bootloader/systemd-boot.nix index e69de29..8557dec 100644 --- a/modules/core/bootloader/systemd-boot.nix +++ b/modules/core/bootloader/systemd-boot.nix @@ -0,0 +1,8 @@ +{...}: + +{ + boot.loader = { + systemd-boot.enable = true; + efi.canTouchEfiVariables = true; + }; +} diff --git a/modules/discord/nixcord.nix b/modules/discord/nixcord.nix new file mode 100644 index 0000000..6f65281 --- /dev/null +++ b/modules/discord/nixcord.nix @@ -0,0 +1,29 @@ +{ + lib, + pkgs, + config, + inputs, + outputs, + ... +}: + +{ + imports = [ + inputs.nixcord.homeManagerModules.nixcord + ]; + + programs.nixcord = { + enable = true; + config = { + themeLinks = [ + "" + ]; + + # no surrounding window frame + frameless = true; + + plugins = { + }; + }; + }; +} diff --git a/typescript b/typescript new file mode 100644 index 0000000..c149333 --- /dev/null +++ b/typescript @@ -0,0 +1,7 @@ +Script started on 2024-11-02 18:26:40+10:00 [TERM="rio" TTY="/dev/pts/1" COLUMNS="162" LINES="70"] +You need to install grc! +Welcome weary traveler mmm mm mmm to my shop +[?2004h]0;~/nixdots(B me(B@myputer(B:~/nixdots(B|main⚡*(B?(B +➤ (B e xit exit xit it t  exit   +(B[?2004l]0;exit ~/nixdots(B (B(B[?2004l +Script done on 2024-11-02 18:26:46+10:00 [COMMAND_EXIT_CODE="0"] From 7d8729cda245de143feeae6e1f429b5c76d1da1e Mon Sep 17 00:00:00 2001 From: _cry64 Date: Mon, 4 Nov 2024 11:59:14 +1000 Subject: [PATCH 012/328] more incomprehensible changes :) --- README => README.md | 22 ++ flake.lock | 187 ++++++++++- flake.nix | 18 +- homes/me/default.nix | 91 ++++- homes/me/default.nix.bak | 207 ++++++++++++ homes/me/default.nix.bak13 | 410 +++++++++++++++++++++++ homes/me/theme.rasi | 209 ++++++++++++ hosts/myputer/default.nix | 108 ++++-- hosts/myputer/hardware-configuration.nix | 3 +- modules/core/bootloader/default.nix | 0 modules/core/bootloader/grub.nix | 15 + modules/core/bootloader/systemd-boot.nix | 8 + modules/discord/nixcord.nix | 29 ++ typescript | 7 + 14 files changed, 1267 insertions(+), 47 deletions(-) rename README => README.md (65%) create mode 100644 homes/me/default.nix.bak create mode 100644 homes/me/default.nix.bak13 create mode 100644 homes/me/theme.rasi delete mode 100644 modules/core/bootloader/default.nix create mode 100644 modules/discord/nixcord.nix create mode 100644 typescript diff --git a/README b/README.md similarity index 65% rename from README rename to README.md index c09a31b..7a3953a 100644 --- a/README +++ b/README.md @@ -45,6 +45,26 @@ my dotfiles to also work on non-NixOS systems. +### Explaining my Vision with r/unixporn posts +I want the side panel from https://www.reddit.com/r/unixporn/comments/12wpvyf/hyprland_eww_is_all_i_need/ +but not the colour scheme and I'm 50/50 on the bar being on th eleft side lol. Also I love the volume bar on the right! + +https://www.reddit.com/r/unixporn/comments/12uy6q6/hyprland_first_time_trying_a_wm_ended_up/ +I love love love their rofi theme, everything else is eh (except the background switching is cool) + +https://www.reddit.com/r/unixporn/comments/1avnfjn/hyprland_animations_theme_generation_settings/ +I love their settings apps + +https://www.reddit.com/r/unixporn/comments/u7vgej/desktop_endeavouros_gnome_42/ +I like to imagine they have the ability to have nothing but apps on their screen (like a do not disturb / focus mode) + +https://www.reddit.com/r/unixporn/comments/xkvmhy/hyprland_dreamy/ +Their window decorations and bar are great, also being able to hide everything upwards is so cool + +https://www.reddit.com/r/unixporn/comments/vkcasz/i3gaps_i_prefer_light_mode/ +If their colour scheme was a little less white I'd love it but overall one of my favourites every + + ### Credits 1. https://github.com/XNM1/linux-nixos-hyprland-config-dotfiles The simplicity of their layout is amazing, was really good to pick out small modules and learn how something works / is configured. @@ -52,3 +72,5 @@ The simplicity of their layout is amazing, was really good to pick out small mod Really great starter config for learning how parts interact and how to generally structure flakes 3. https://nixos.wiki/wiki/Fonts Wiki page explaining how to install fonts and nerd fonts on NixOS +4. https://github.com/adi1090x/rofi +For the Rofi theme diff --git a/flake.lock b/flake.lock index da8b556..eb4fc3d 100644 --- a/flake.lock +++ b/flake.lock @@ -50,6 +50,36 @@ } }, "flake-compat_2": { + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "revCount": 57, + "type": "tarball", + "url": "https://api.flakehub.com/f/pinned/edolstra/flake-compat/1.0.1/018afb31-abd1-7bff-a5e4-cff7e18efb7a/source.tar.gz" + }, + "original": { + "type": "tarball", + "url": "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz" + } + }, + "flake-compat_3": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_4": { "flake": false, "locked": { "lastModified": 1696426674, @@ -87,6 +117,24 @@ "type": "github" } }, + "grub2-themes": { + "inputs": { + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1730004881, + "narHash": "sha256-8xVIqIW25o2uCL0fxAmP4Sj9sdebarQXmd1+64yMe8o=", + "owner": "vinceliuice", + "repo": "grub2-themes", + "rev": "42c232dfb46bf93c17506cbc1a574e5e89b5e09f", + "type": "github" + }, + "original": { + "owner": "vinceliuice", + "repo": "grub2-themes", + "type": "github" + } + }, "home-manager": { "inputs": { "nixpkgs": [ @@ -144,7 +192,7 @@ "hyprlang": "hyprlang", "hyprutils": "hyprutils", "hyprwayland-scanner": "hyprwayland-scanner", - "nixpkgs": "nixpkgs", + "nixpkgs": "nixpkgs_2", "pre-commit-hooks": "pre-commit-hooks", "systems": "systems", "xdph": "xdph" @@ -267,18 +315,37 @@ "type": "github" } }, + "nixcord": { + "inputs": { + "flake-compat": "flake-compat_2", + "nixpkgs": "nixpkgs_3" + }, + "locked": { + "lastModified": 1730107956, + "narHash": "sha256-Ohwk5/RGhGjDXaD4v0Yc40J/79gHRcD92mKWY+6qHJU=", + "owner": "kaylorben", + "repo": "nixcord", + "rev": "5dcb476b924ad08ffd8521cca812052605cb5974", + "type": "github" + }, + "original": { + "owner": "kaylorben", + "repo": "nixcord", + "type": "github" + } + }, "nixpkgs": { "locked": { - "lastModified": 1729413321, - "narHash": "sha256-I4tuhRpZFa6Fu6dcH9Dlo5LlH17peT79vx1y1SpeKt0=", + "lastModified": 1730370246, + "narHash": "sha256-UD2XmS6IWT+G/scUpPItb0dNijT5Dxa7WMuVqRhiaxU=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "1997e4aa514312c1af7e2bda7fad1644e778ff26", + "rev": "88f31ac8837ab15748102da8bbc6e96a9330be0d", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixos-unstable", + "ref": "master", "repo": "nixpkgs", "type": "github" } @@ -300,6 +367,38 @@ } }, "nixpkgs_2": { + "locked": { + "lastModified": 1729413321, + "narHash": "sha256-I4tuhRpZFa6Fu6dcH9Dlo5LlH17peT79vx1y1SpeKt0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "1997e4aa514312c1af7e2bda7fad1644e778ff26", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1730170245, + "narHash": "sha256-PRq4vJjDa+m1mNwkV9H7zVzMhuMqsHJrTGx0iJZ0e0w=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "30c9efeef01e2ad4880bff6a01a61dd99536b3c9", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_4": { "locked": { "lastModified": 1729413321, "narHash": "sha256-I4tuhRpZFa6Fu6dcH9Dlo5LlH17peT79vx1y1SpeKt0=", @@ -315,6 +414,22 @@ "type": "github" } }, + "nixpkgs_5": { + "locked": { + "lastModified": 1727634051, + "narHash": "sha256-S5kVU7U82LfpEukbn/ihcyNt2+EvG7Z5unsKW9H/yFA=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "06cf0e1da4208d3766d898b7fdab6513366d45b9", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, "pre-commit-hooks": { "inputs": { "flake-compat": "flake-compat", @@ -341,15 +456,18 @@ }, "root": { "inputs": { + "grub2-themes": "grub2-themes", "home-manager": "home-manager", "hyprland": "hyprland", - "nixpkgs": "nixpkgs_2", - "spicetify-nix": "spicetify-nix" + "nixcord": "nixcord", + "nixpkgs": "nixpkgs_4", + "spicetify-nix": "spicetify-nix", + "swww": "swww" } }, "spicetify-nix": { "inputs": { - "flake-compat": "flake-compat_2", + "flake-compat": "flake-compat_3", "nixpkgs": [ "nixpkgs" ] @@ -368,6 +486,26 @@ "type": "github" } }, + "swww": { + "inputs": { + "flake-compat": "flake-compat_4", + "nixpkgs": "nixpkgs_5", + "utils": "utils" + }, + "locked": { + "lastModified": 1730050836, + "narHash": "sha256-6xCp6rTJ5MWxfUXUYxWRZz1CA5V9/gGqgb0+34BMF6U=", + "owner": "LGFae", + "repo": "swww", + "rev": "36808dfd90223e648fcc45075ca57392b3d6a297", + "type": "github" + }, + "original": { + "owner": "LGFae", + "repo": "swww", + "type": "github" + } + }, "systems": { "locked": { "lastModified": 1689347949, @@ -383,6 +521,39 @@ "type": "github" } }, + "systems_2": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "utils": { + "inputs": { + "systems": "systems_2" + }, + "locked": { + "lastModified": 1726560853, + "narHash": "sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, "xdph": { "inputs": { "hyprland-protocols": [ diff --git a/flake.nix b/flake.nix index 18ad9ae..3f56093 100644 --- a/flake.nix +++ b/flake.nix @@ -13,9 +13,21 @@ url = "github:Gerg-L/spicetify-nix"; inputs.nixpkgs.follows = "nixpkgs"; }; + + #stylix.url = "github:danth/stylix"; + + nixcord = { + url = "github:kaylorben/nixcord"; + }; + + grub2-themes = { + url = "github:vinceliuice/grub2-themes"; + }; # is this necessary? (aren't I enabling it in `configuration.nix` anyways?) hyprland.url = "github:hyprwm/Hyprland"; + + swww.url = "github:LGFae/swww"; }; outputs = { @@ -23,11 +35,12 @@ nixpkgs, home-manager, hyprland, + grub2-themes, + #stylix, ... }@inputs: let system = "x86_64-linux"; - #system = pkgs.stdenv.hostPlatform.system; pkgs = import nixpkgs { inherit system; @@ -48,7 +61,8 @@ modules = [ ./hosts/myputer - #home-manager.nixosModules.default + grub2-themes.nixosModules.default + #stylix.nixosModules.stylix ]; }; diff --git a/homes/me/default.nix b/homes/me/default.nix index b943e09..806471c 100644 --- a/homes/me/default.nix +++ b/homes/me/default.nix @@ -13,8 +13,9 @@ }; imports = [ + # inputs.nixcord.homeManagerModules.nixcord # inputs.spicetify-nix.homeManagerModules.default - #./wofi.nix + # ./wofi.nix ]; /* @@ -34,6 +35,25 @@ }; */ + # ----- STYLIX ----- + + #stylix = { + # enable = true; + # + # image = pkgs.fetchurl { + # url = "https://www.pixelstalk.net/wp-content/uploads/2016/05/Epic-Anime-Awesome-Wallpapers.jpg"; + # sha256 = "enQo3wqhgf0FEPHj2coOCvo7DuZv+x5rL/WIo4qPI50="; + # }; + # + # # Stylix will automatically theme applications + # autoEnable = true; + # targets = { + # # disable Stylix's themes for ones I will theme manually + # firefox.enable = false; + # wofi.enable = false; + # }; + #}; + home = { username = "me"; homeDirectory = "/home/me"; @@ -42,18 +62,58 @@ programs = { # these are both required for home-manager to work home-manager.enable = true; - git.enable = true; + git = { + enable = true; + userName = "emileclarkb"; + userEmail = "eclarkboman@gmail.com"; + }; + # like `/bin/cat` but with syntax highlighting # TODO: change the pager (maybe use Github:sachaos/viddy instead) bat = { enable = true; config = { pager = "less -FR"; - theme = "Dracula"; + # let Stylix control the theme + #theme = "Dracula"; }; }; + firefox = { + enable = true; + policies = { + #BlockAboutConfig = true; + DefaultDownloadDirectory = "\${home}/downloads"; + }; + }; + + # I want to use fish as my login shell but it always + # goes terrible cause it isn't POSIX compliant, so + # instead Bash is my login and it will just exec fish + #bash = { + # interactiveShellInit = '' + # if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]] + # then + # shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION="" + # exec ${pkgs.fish}/bin/fish $LOGIN_OPTION + # fi + # ''; + #}; + + fish = { + enable = true; + interactiveShellInit = '' + set -g fish_greeting "Welcome weary traveler to my shop" + ''; + plugins = [ + { + name = "grc"; + src = pkgs.fishPlugins.grc.src; + } + ]; + }; + /* spicetify = let @@ -88,7 +148,7 @@ # lines = (accumulated scroll * multiplier / divider) scroll = { - multiplier = 1.0; + multiplier = 3.0; divider = 1.0; }; @@ -141,7 +201,8 @@ allow_markup = true; width = 250; }; - style = '' + # Force the style to stop Stylix being a bitch and overwriting it + style = lib.mkForce '' @define-color rosewater #f2d5cf; @define-color rosewater-rgb rgb(242, 213, 207); @define-color flamingo #eebebe; @@ -309,13 +370,19 @@ } ''; }; + + rofi = { + enable = true; + package = pkgs.rofi-wayland; + font = "JetBrains Mono Nerd Font 10"; + location = "center"; + terminal = "${pkgs.rio}/bin/rio"; + }; + }; - # Nicely reload system units when changing configs - systemd.user.startServices = "sd-switch"; - - home.stateVersion = "24.05"; # don't change this + # ----- SERVICES ----- services = { # Change monitor positions # TODO: find a way to make this modular (ie put something different for my laptop) @@ -353,4 +420,10 @@ ]; }; }; + + + # Nicely reload system units when changing configs + systemd.user.startServices = "sd-switch"; + + home.stateVersion = "24.05"; # don't change this } diff --git a/homes/me/default.nix.bak b/homes/me/default.nix.bak new file mode 100644 index 0000000..3573995 --- /dev/null +++ b/homes/me/default.nix.bak @@ -0,0 +1,207 @@ +{ + inputs, + outputs, + lib, + config, + pkgs, + ... +}: + +{ + nixpkgs = { + config.allowUnfree = true; + }; + + imports = [ + # inputs.spicetify-nix.homeManagerModules.default + #./wofi.nix + ]; + + /* + programs.spicetify = + let + spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; + in + { + enable = true; + enabledExtensions = with spicePkgs.extensions; [ + adblock + hidePodcasts + shuffle # shuffle+ (special characters are sanitized out of extension names) + ]; + theme = spicePkgs.themes.catppuccin; + colorScheme = "mocha"; + }; + */ + + #wayland.windowManager.hyprland.enable = true; + + home = { + username = "me"; + homeDirectory = "/home/me"; + }; + + programs = { + # these are both required for home-manager to work + home-manager.enable = true; + git.enable = true; + + # like `/bin/cat` but with syntax highlighting + # TODO: change the pager (maybe use Github:sachaos/viddy instead) + bat = { + enable = true; + config = { + pager = "less -FR"; + #theme = "Dracula"; + }; + }; + + /* + spicetify = + let + spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; + in + { + enable = true; + enabledExtensions = with spicePkgs.extensions; [ + adblock + hidePodcasts + #shuffle + ]; + theme = spicePkgs.themes.catppuccin; + colorScheme = "mocha"; + }; + */ + + # The terminal I use + # TODO: this is dependent on nvim being installed + # TODO: make this into a module with a configurable editor option + rio = { + enable = true; + # Rio Config Docs: https://raphamorim.io/rio/docs/config + settings = { + theme = "dracula"; + hide-mouse-cursor-when-typing = true; + + use-fork = true; # fork (dont spawn) Rio + + padding-x = 10; + padding-y = [ 15 10 ]; # top, left + + # lines = (accumulated scroll * multiplier / divider) + scroll = { + multiplier = 1.0; + divider = 1.0; + }; + + fonts = { + size = 15; + features = []; + + regular = { + family = "FiraCode Nerd Font"; # "IosevkaTerm Nerd Font" + style = "Normal"; + weight = 400; + }; + + bold = { + family = "FiraCode Nerd Font"; + style = "Normal"; + weight = 800; + }; + + italic = { + family = "FiraCode Nerd Font"; + style = "Italic"; + weight = 400; + }; + + bold-italic = { + family = "FiraCode Nerd Font"; + style = "Italic"; + weight = 800; + }; + }; + + # Run when the `OpenConfigEditor` keybinding is triggered + editor = { + program = "nvim"; + args = []; + }; + + renderer = { + performance = "High"; + backend = "Automatic"; # Vulkan + }; + }; + }; + + wofi = { + enable = true; + settings = { + location = "center"; + allow_markup = true; + width = 250; + }; + }; + }; + + # ----- SERVICES ----- + services = { + # Hyprland Wallpaper + #hyprpaper = { + # enable = true; + # settings = { + # preload = [ "~/nixdots/wallpapers/ghibli-esque-valley.png" ]; + # wallpaper = [ + # "DP-2,~/nixdots/wallpapers/ghibli-esque-valley.png" + # "HDMI-A-1,~/nixdots/wallpapers/ghibli-esque-valley.png" + # ]; + # }; + #}; + + hyprpaper.enable = true; # so stylix can see it + + # Change monitor positions + # TODO: find a way to make this modular (ie put something different for my laptop) + # my idea is to have a "monitors" module and use kanshi for wayland + kanshi = { + enable = true; + systemdTarget = "hyprland-session.target"; + # You can find your monitors in hyprland by using `hyprctl monitors all` + settings = [ + { # 1920x1080@144 gaming monitor + output.criteria = "HDMI-A-1"; + output.mode = "1920x1080@119.98Hz"; + output.scale = 1.0; + output.adaptiveSync = false; # Variable Refresh Rate (this can be changed for gaming) + } + { # 4k side monitor + output.criteria = "DP-2"; + output.mode = "3840x2160@60.00Hz"; + output.scale = 2.0; + } + + { # This is my default setup + profile.name = "default"; + profile.outputs = [ + { + criteria = "DP-2"; + position = "0,0"; + } + { + criteria = "HDMI-A-1"; + position = "3840,0"; + } + ]; + } + ]; + }; + }; + + + # Nicely reload system units when changing configs + systemd.user.startServices = "sd-switch"; + + home.stateVersion = "24.05"; # don't change this +} diff --git a/homes/me/default.nix.bak13 b/homes/me/default.nix.bak13 new file mode 100644 index 0000000..f5b3589 --- /dev/null +++ b/homes/me/default.nix.bak13 @@ -0,0 +1,410 @@ +{ + inputs, + outputs, + lib, + config, + pkgs, + ... +}: + +{ + nixpkgs = { + config.allowUnfree = true; + }; + + imports = [ + #inputs.nixcord.homeManagerModules.nixcord + # inputs.spicetify-nix.homeManagerModules.default + #./wofi.nix + ]; + + /* + programs.spicetify = + let + spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; + in + { + enable = true; + enabledExtensions = with spicePkgs.extensions; [ + adblock + hidePodcasts + shuffle # shuffle+ (special characters are sanitized out of extension names) + ]; + theme = spicePkgs.themes.catppuccin; + colorScheme = "mocha"; + }; + */ + + # ----- STYLIX ----- + + #stylix = { + # enable = true; + # + # image = pkgs.fetchurl { + # url = "https://www.pixelstalk.net/wp-content/uploads/2016/05/Epic-Anime-Awesome-Wallpapers.jpg"; + # sha256 = "enQo3wqhgf0FEPHj2coOCvo7DuZv+x5rL/WIo4qPI50="; + # }; + # + # # Stylix will automatically theme applications + # autoEnable = true; + # targets = { + # # disable Stylix's themes for ones I will theme manually + # firefox.enable = false; + # wofi.enable = false; + # }; + #}; + + home = { + username = "me"; + homeDirectory = "/home/me"; + }; + + programs = { + # these are both required for home-manager to work + home-manager.enable = true; + git.enable = true; + + # like `/bin/cat` but with syntax highlighting + # TODO: change the pager (maybe use Github:sachaos/viddy instead) + bat = { + enable = true; + config = { + pager = "less -FR"; + # let Stylix control the theme + #theme = "Dracula"; + }; + }; + + firefox = { + enable = true; + policies = { + #BlockAboutConfig = true; + DefaultDownloadDirectory = "\${home}/downloads"; + }; + }; + + /* + spicetify = + let + spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; + in + { + enable = true; + enabledExtensions = with spicePkgs.extensions; [ + adblock + hidePodcasts + #shuffle + ]; + theme = spicePkgs.themes.catppuccin; + colorScheme = "mocha"; + }; + */ + + # The terminal I use + # TODO: this is dependent on nvim being installed + # TODO: make this into a module with a configurable editor option + rio = { + enable = true; + # Rio Config Docs: https://raphamorim.io/rio/docs/config + settings = { + theme = "dracula"; + hide-mouse-cursor-when-typing = true; + + use-fork = true; # fork (dont spawn) Rio + + padding-x = 10; + padding-y = [ 15 10 ]; # top, left + + # lines = (accumulated scroll * multiplier / divider) + scroll = { + multiplier = 3.0; + divider = 1.0; + }; + + fonts = { + size = 15; + features = []; + + regular = { + family = "FiraCode Nerd Font"; # "IosevkaTerm Nerd Font" + style = "Normal"; + weight = 400; + }; + + bold = { + family = "FiraCode Nerd Font"; + style = "Normal"; + weight = 800; + }; + + italic = { + family = "FiraCode Nerd Font"; + style = "Italic"; + weight = 400; + }; + + bold-italic = { + family = "FiraCode Nerd Font"; + style = "Italic"; + weight = 800; + }; + }; + + # Run when the `OpenConfigEditor` keybinding is triggered + editor = { + program = "nvim"; + args = []; + }; + + renderer = { + performance = "High"; + backend = "Automatic"; # Vulkan + }; + }; + }; + + wofi = { + enable = true; + settings = { + location = "center"; + allow_markup = true; + width = 250; + }; + # Force the style to stop Stylix being a bitch and overwriting it + style = lib.mkForce '' + @define-color rosewater #f2d5cf; + @define-color rosewater-rgb rgb(242, 213, 207); + @define-color flamingo #eebebe; + @define-color flamingo-rgb rgb(238, 190, 190); + @define-color pink #f4b8e4; + @define-color pink-rgb rgb(244, 184, 228); + @define-color mauve #ca9ee6; + @define-color mauve-rgb rgb(202, 158, 230); + @define-color red #e78284; + @define-color red-rgb rgb(231, 130, 132); + @define-color maroon #ea999c; + @define-color maroon-rgb rgb(234, 153, 156); + @define-color peach #ef9f76; + @define-color peach-rgb rgb(239, 159, 118); + @define-color yellow #e5c890; + @define-color yellow-rgb rgb(229, 200, 144); + @define-color green #a6d189; + @define-color green-rgb rgb(166, 209, 137); + @define-color teal #81c8be; + @define-color teal-rgb rgb(129, 200, 190); + @define-color sky #99d1db; + @define-color sky-rgb rgb(153, 209, 219); + @define-color sapphire #85c1dc; + @define-color sapphire-rgb rgb(133, 193, 220); + @define-color blue #8caaee; + @define-color blue-rgb rgb(140, 170, 238); + @define-color lavender #babbf1; + @define-color lavender-rgb rgb(186, 187, 241); + @define-color text #c6d0f5; + @define-color text-rgb rgb(198, 208, 245); + @define-color subtext1 #b5bfe2; + @define-color subtext1-rgb rgb(181, 191, 226); + @define-color subtext0 #a5adce; + @define-color subtext0-rgb rgb(165, 173, 206); + @define-color overlay2 #949cbb; + @define-color overlay2-rgb rgb(148, 156, 187); + @define-color overlay1 #838ba7; + @define-color overlay1-rgb rgb(131, 139, 167); + @define-color overlay0 #737994; + @define-color overlay0-rgb rgb(115, 121, 148); + @define-color surface2 #626880; + @define-color surface2-rgb rgb(98, 104, 128); + @define-color surface1 #51576d; + @define-color surface1-rgb rgb(81, 87, 109); + @define-color surface0 #414559; + @define-color surface0-rgb rgb(65, 69, 89); + @define-color base #303446; + @define-color base-rgb rgb(48, 52, 70); + @define-color mantle #292c3c; + @define-color mantle-rgb rgb(41, 44, 60); + @define-color crust #232634; + @define-color crust-rgb rgb(35, 38, 52); + + * { + font-family: 'FiraCode Nerd Font'; + font-size: 16px; + } + + /* Window */ + window { + margin: 0px; + padding: 10px; + border: 0.16em solid @teal; + border-radius: 0.5em; + background-color: @base; + animation: slideIn 0.25s ease-in-out both; + } + + /* Slide In */ + @keyframes slideIn { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + /* Inner Box */ + #inner-box { + margin: 5px; + padding: 10px; + border: none; + background-color: @base; + /*animation: fadeIn 0.5s ease-in-out both;*/ + } + + /* Fade In */ + @keyframes fadeIn { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + /* Outer Box */ + #outer-box { + margin: 5px; + padding: 10px; + border: none; + background-color: @base; + } + + /* Scroll */ + #scroll { + margin: 0px; + padding: 10px; + border: none; + background-color: @base; + } + + /* Input */ + #input { + margin: 5px 20px; + padding: 10px; + border: none; + border-radius: 0.25em; + color: @text; + background-color: @base; + animation: fadeIn 0.25s ease-in-out both; + } + + #input image { + border: none; + color: @red; + } + + #input * { + outline: 4px solid @red!important; + } + + /* Text */ + #text { + margin: 5px; + border: none; + color: @text; + animation: fadeIn 0.5s ease-in-out both; + } + + #entry { + background-color: @base; + } + + #entry arrow { + border: none; + color: @teal; + } + + /* Selected Entry */ + #entry:selected { + border: 0.10em solid @teal; + border-radius: 0.25em; + } + + #entry:selected #text { + color: @teal; + } + + #entry:drop(active) { + background-color: @lavender!important; + } + ''; + }; + + rofi = { + enable = true; + package = pkgs.rofi-wayland; + font = "JetBrains Mono Nerd Font 10"; + location = "center"; + terminal = "${pkgs.rio}/bin/rio"; + }; + + }; + + + # ----- SERVICES ----- + services = { + # Hyprland Wallpaper + #hyprpaper = { + # enable = true; + # settings = { + # preload = [ "/home/me/nixdots/wallpapers/wall.png" ]; + # wallpaper = [ + # "DP-2,/home/me/nixdots/wallpapers/wall.png" + # "HDMI-A-1,/home/me/nixdots/wallpapers/wall.png" + # ]; + # }; + #}; + + # Change monitor positions + # TODO: find a way to make this modular (ie put something different for my laptop) + # my idea is to have a "monitors" module and use kanshi for wayland + kanshi = { + enable = true; + systemdTarget = "hyprland-session.target"; + # You can find your monitors in hyprland by using `hyprctl monitors all` + settings = [ + { # 1920x1080@144 gaming monitor + output.criteria = "HDMI-A-1"; + output.mode = "1920x1080@119.98Hz"; + output.scale = 1.0; + output.adaptiveSync = false; # Variable Refresh Rate (this can be changed for gaming) + } + { # 4k side monitor + output.criteria = "DP-2"; + output.mode = "3840x2160@60.00Hz"; + output.scale = 2.0; + } + + { # This is my default setup + profile.name = "default"; + profile.outputs = [ + { + criteria = "DP-2"; + position = "0,0"; + } + { + criteria = "HDMI-A-1"; + position = "3840,0"; + } + ]; + } + ]; + }; + }; + + + # Nicely reload system units when changing configs + systemd.user.startServices = "sd-switch"; + + home.stateVersion = "24.05"; # don't change this +} diff --git a/homes/me/theme.rasi b/homes/me/theme.rasi new file mode 100644 index 0000000..07c375d --- /dev/null +++ b/homes/me/theme.rasi @@ -0,0 +1,209 @@ +/** + * + * Author : Aditya Shakya (adi1090x) + * Github : @adi1090x + * + * Rofi Theme File + * Rofi Version: 1.7.3 + **/ + +/*****----- Configuration -----*****/ +configuration { + modi: "drun,run,filebrowser,window"; + show-icons: true; + display-drun: "APPS"; + display-run: "RUN"; + display-filebrowser: "FILES"; + display-window: "WINDOW"; + drun-display-format: "{name}"; + window-format: "{w} · {c} · {t}"; +} + +/*****----- Global Properties -----*****/ +* { + font: "JetBrains Mono Nerd Font 10"; + background: #11092D; + background-alt: #281657; + foreground: #FFFFFF; + selected: #DF5296; + active: #6E77FF; + urgent: #8E3596; +} + +/*****----- Main Window -----*****/ +window { + /* properties for window widget */ + transparency: "real"; + location: center; + anchor: center; + fullscreen: false; + width: 1000px; + x-offset: 0px; + y-offset: 0px; + + /* properties for all widgets */ + enabled: true; + border-radius: 15px; + cursor: "default"; + background-color: @background; +} + +/*****----- Main Box -----*****/ +mainbox { + enabled: true; + spacing: 0px; + background-color: transparent; + orientation: horizontal; + children: [ "imagebox", "listbox" ]; +} + +imagebox { + padding: 20px; + background-color: transparent; + background-image: url("~/.config/rofi/images/j.jpg", height); + orientation: vertical; + children: [ "inputbar", "dummy", "mode-switcher" ]; +} + +listbox { + spacing: 20px; + padding: 20px; + background-color: transparent; + orientation: vertical; + children: [ "message", "listview" ]; +} + +dummy { + background-color: transparent; +} + +/*****----- Inputbar -----*****/ +inputbar { + enabled: true; + spacing: 10px; + padding: 15px; + border-radius: 10px; + background-color: @background-alt; + text-color: @foreground; + children: [ "textbox-prompt-colon", "entry" ]; +} +textbox-prompt-colon { + enabled: true; + expand: false; + str: ""; + background-color: inherit; + text-color: inherit; +} +entry { + enabled: true; + background-color: inherit; + text-color: inherit; + cursor: text; + placeholder: "Search"; + placeholder-color: inherit; +} + +/*****----- Mode Switcher -----*****/ +mode-switcher{ + enabled: true; + spacing: 20px; + background-color: transparent; + text-color: @foreground; +} +button { + padding: 15px; + border-radius: 10px; + background-color: @background-alt; + text-color: inherit; + cursor: pointer; +} +button selected { + background-color: @selected; + text-color: @foreground; +} + +/*****----- Listview -----*****/ +listview { + enabled: true; + columns: 1; + lines: 8; + cycle: true; + dynamic: true; + scrollbar: false; + layout: vertical; + reverse: false; + fixed-height: true; + fixed-columns: true; + + spacing: 10px; + background-color: transparent; + text-color: @foreground; + cursor: "default"; +} + +/*****----- Elements -----*****/ +element { + enabled: true; + spacing: 15px; + padding: 8px; + border-radius: 10px; + background-color: transparent; + text-color: @foreground; + cursor: pointer; +} +element normal.normal { + background-color: inherit; + text-color: inherit; +} +element normal.urgent { + background-color: @urgent; + text-color: @foreground; +} +element normal.active { + background-color: @active; + text-color: @foreground; +} +element selected.normal { + background-color: @selected; + text-color: @foreground; +} +element selected.urgent { + background-color: @urgent; + text-color: @foreground; +} +element selected.active { + background-color: @urgent; + text-color: @foreground; +} +element-icon { + background-color: transparent; + text-color: inherit; + size: 32px; + cursor: inherit; +} +element-text { + background-color: transparent; + text-color: inherit; + cursor: inherit; + vertical-align: 0.5; + horizontal-align: 0.0; +} + +/*****----- Message -----*****/ +message { + background-color: transparent; +} +textbox { + padding: 15px; + border-radius: 10px; + background-color: @background-alt; + text-color: @foreground; + vertical-align: 0.5; + horizontal-align: 0.0; +} +error-message { + padding: 15px; + border-radius: 20px; + background-color: @background; + text-color: @foreground; +} diff --git a/hosts/myputer/default.nix b/hosts/myputer/default.nix index 6ea3aba..a4e6f6a 100644 --- a/hosts/myputer/default.nix +++ b/hosts/myputer/default.nix @@ -36,19 +36,19 @@ in # Use the systemd-boot EFI boot loader. # TODO: use GRUB2 instead - boot.loader.systemd-boot.enable = true; - boot.loader.efi.canTouchEfiVariables = true; - #boot.loader = { - # efi = { - # canTouchEfiVariables = true; - # efiSysMountPoint = "/boot/efi"; - # }; - # grub = { - # efiSupport = true; - # #efiInstallAsRemovable = true; # in case canTouchEfiVariables doesn't work on this system - # device = "nodev"; - # }; - #}; + #boot.loader.systemd-boot.enable = true; + #boot.loader.efi.canTouchEfiVariables = true; + boot.loader = { + efi = { + canTouchEfiVariables = true; + efiSysMountPoint = "/boot/efi"; + }; + grub = { + efiSupport = true; + #efiInstallAsRemovable = true; # in case canTouchEfiVariables doesn't work on this system + device = "nodev"; + }; + }; # Set your time zone. time.timeZone = "Australia/Brisbane"; @@ -97,6 +97,10 @@ in }; users = { + # using fish as the login shell tends + # to go very poorly because it isn't + # POSIX compliant, so we'll just use + # simple Bash then :) defaultUserShell = pkgs.bash; users = { @@ -104,7 +108,7 @@ in me = { isNormalUser = true; extraGroups = [ "wheel" ]; - shell = pkgs.fish; + shell = pkgs.bash; #pkgs.fish packages = with pkgs; [ firefox nitch @@ -117,7 +121,7 @@ in dev = { isNormalUser = true; extraGroups = [ "wheel" ]; - shell = pkgs.zsh; + shell = pkgs.bash; #pkgs.zsh packages = with pkgs; [ ]; }; @@ -126,7 +130,7 @@ in ae = { isNormalUser = true; extraGroups = [ "wheel" ]; - shell = pkgs.fish; + shell = pkgs.bash; #pkgs.fish packages = with pkgs; [ ]; }; @@ -137,29 +141,44 @@ in # ---- SYSTEM PACKAGES ----- environment.systemPackages = with pkgs; [ - # Applications - #kitty (switched to Rio) - vesktop + # User Environment + inputs.swww.packages.${pkgs.system}.swww + #vesktop helvum easyeffects + ani-cli + + wl-clipboard # clipboard for wayland + + python310 # I use 3.10 since it's in a pretty stable state now + + # fish plugins + grc # colorise command outputs # Pretty necessary - #vim git - # Super duper necessary + # Unix Commands wget tree ]; - # Enable the use of certain programs programs = { - hyprland.enable = true; - fish.enable = true; - zsh.enable = true; + hyprland = { + enable = true; + # set the flake package + package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland; + # make sure to also set the portal package, so that they are in sync + portalPackage = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland; - git.enable = true; + xwayland.enable = true; + #systemd.enable = true; + }; + + + zsh.enable = true; + fish.enable = true; neovim = { enable = true; @@ -172,9 +191,21 @@ in set tabstop=4 set shiftwidth=4 ''; - # set cc=80 }; }; + + # I want to use fish as my login shell but it always goes terrible + # cause it isn't POSIX compliant, so instead Bash is my login and + # will just exec fish (^-^) + bash = { + interactiveShellInit = '' + if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]] + then + shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION="" + exec ${pkgs.fish}/bin/fish $LOGIN_OPTION + fi + ''; + }; }; @@ -188,6 +219,7 @@ in "IosevkaTerm" # big nah "CascadiaCode" # potential "FiraCode" # potential + "JetBrainsMono" # for my rofi theme "Hasklig" "Hack"]; }) @@ -206,6 +238,21 @@ in }; + # ----- STYLIX ----- + + #stylix = { + # enable = true; + # image = pkgs.fetchurl { + # url = "https://www.pixelstalk.net/wp-content/uploads/2016/05/Epic-Anime-Awesome-Wallpapers.jpg"; + # sha256 = "enQo3wqhgf0FEPHj2coOCvo7DuZv+x5rL/WIo4qPI50="; + # }; + # + # # Stylix will automatically theme applications + # #autoEnable = true; + # #image = ../../wallpapers/wall.png; + # #image = "/home/me/nixdots/wallpapers/ghibli-esque-valley.png"; + #}; + # Enable the new CLI commands and the flakes as experimental features @@ -225,6 +272,13 @@ in # Enable the OpenSSH daemon. # services.openssh.enable = true; + + # Enable OpenGL + hardware = { + graphics.enable = true; + }; + + # DO NOT MODIFY system.stateVersion = "24.05"; # Did you read the comment? diff --git a/hosts/myputer/hardware-configuration.nix b/hosts/myputer/hardware-configuration.nix index 46551ec..9eb2faf 100644 --- a/hosts/myputer/hardware-configuration.nix +++ b/hosts/myputer/hardware-configuration.nix @@ -18,7 +18,8 @@ fsType = "ext4"; }; - fileSystems."/boot" = + #fileSystems."/boot" = # BIOS + fileSystems."/boot" = # UEFI { device = "/dev/disk/by-uuid/7046-177A"; fsType = "vfat"; options = [ "fmask=0077" "dmask=0077" ]; diff --git a/modules/core/bootloader/default.nix b/modules/core/bootloader/default.nix deleted file mode 100644 index e69de29..0000000 diff --git a/modules/core/bootloader/grub.nix b/modules/core/bootloader/grub.nix index e69de29..5d63dff 100644 --- a/modules/core/bootloader/grub.nix +++ b/modules/core/bootloader/grub.nix @@ -0,0 +1,15 @@ +{...}: + +{ + boot.loader = { + efi = { + canTouchEfiVariables = true; + efiSysMountPoint = "/boot/efi"; + }; + grub = { + efiSupport = true; + #efiInstallAsRemovable = true; # in case canTouchEfiVariables doesn't work on your system + device = "nodev"; + }; + }; +} diff --git a/modules/core/bootloader/systemd-boot.nix b/modules/core/bootloader/systemd-boot.nix index e69de29..8557dec 100644 --- a/modules/core/bootloader/systemd-boot.nix +++ b/modules/core/bootloader/systemd-boot.nix @@ -0,0 +1,8 @@ +{...}: + +{ + boot.loader = { + systemd-boot.enable = true; + efi.canTouchEfiVariables = true; + }; +} diff --git a/modules/discord/nixcord.nix b/modules/discord/nixcord.nix new file mode 100644 index 0000000..6f65281 --- /dev/null +++ b/modules/discord/nixcord.nix @@ -0,0 +1,29 @@ +{ + lib, + pkgs, + config, + inputs, + outputs, + ... +}: + +{ + imports = [ + inputs.nixcord.homeManagerModules.nixcord + ]; + + programs.nixcord = { + enable = true; + config = { + themeLinks = [ + "" + ]; + + # no surrounding window frame + frameless = true; + + plugins = { + }; + }; + }; +} diff --git a/typescript b/typescript new file mode 100644 index 0000000..c149333 --- /dev/null +++ b/typescript @@ -0,0 +1,7 @@ +Script started on 2024-11-02 18:26:40+10:00 [TERM="rio" TTY="/dev/pts/1" COLUMNS="162" LINES="70"] +You need to install grc! +Welcome weary traveler mmm mm mmm to my shop +[?2004h]0;~/nixdots(B me(B@myputer(B:~/nixdots(B|main⚡*(B?(B +➤ (B e xit exit xit it t  exit   +(B[?2004l]0;exit ~/nixdots(B (B(B[?2004l +Script done on 2024-11-02 18:26:46+10:00 [COMMAND_EXIT_CODE="0"] From be6926fb0fdda21c026c7b30f653fa970936d378 Mon Sep 17 00:00:00 2001 From: Emile Clark-Boman Date: Thu, 7 Nov 2024 17:37:15 +1000 Subject: [PATCH 013/328] added host: lolcathost --- .gitignore | 0 README.md | 6 + flake.lock | 370 +++++++-- flake.nix | 64 +- homes/me/TODO | 31 + homes/me/default.nix | 782 ++++++++++++-------- homes/me/default.nix.bak | 207 ------ homes/me/default.nix.bak13 | 410 ---------- homes/me/theme.rasi | 0 homes/me/wofi.nix | 0 hosts/lolcathost/default.nix | 315 ++++++-- hosts/lolcathost/hardware-configuration.nix | 41 +- hosts/myputer/default.nix | 25 +- hosts/myputer/hardware-configuration.nix | 0 hosts/myputer/sddm-theme.nix | 0 modules/core/bluetooth.nix | 0 modules/core/bootloader/grub.nix | 0 modules/core/bootloader/systemd-boot.nix | 0 modules/core/garbage-collector.nix | 0 modules/core/sound/default.nix | 0 modules/core/sound/pipewire.nix | 0 modules/discord/nixcord.nix | 8 +- modules/hyprland/default.nix | 0 typescript | 7 - 24 files changed, 1176 insertions(+), 1090 deletions(-) mode change 100644 => 100755 .gitignore mode change 100644 => 100755 README.md mode change 100644 => 100755 flake.lock mode change 100644 => 100755 flake.nix create mode 100644 homes/me/TODO mode change 100644 => 100755 homes/me/default.nix delete mode 100644 homes/me/default.nix.bak delete mode 100644 homes/me/default.nix.bak13 mode change 100644 => 100755 homes/me/theme.rasi mode change 100644 => 100755 homes/me/wofi.nix mode change 100644 => 100755 hosts/lolcathost/default.nix mode change 100644 => 100755 hosts/lolcathost/hardware-configuration.nix mode change 100644 => 100755 hosts/myputer/default.nix mode change 100644 => 100755 hosts/myputer/hardware-configuration.nix mode change 100644 => 100755 hosts/myputer/sddm-theme.nix mode change 100644 => 100755 modules/core/bluetooth.nix mode change 100644 => 100755 modules/core/bootloader/grub.nix mode change 100644 => 100755 modules/core/bootloader/systemd-boot.nix mode change 100644 => 100755 modules/core/garbage-collector.nix mode change 100644 => 100755 modules/core/sound/default.nix mode change 100644 => 100755 modules/core/sound/pipewire.nix mode change 100644 => 100755 modules/discord/nixcord.nix mode change 100644 => 100755 modules/hyprland/default.nix delete mode 100644 typescript diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 index 7a3953a..50c9053 --- a/README.md +++ b/README.md @@ -65,6 +65,12 @@ https://www.reddit.com/r/unixporn/comments/vkcasz/i3gaps_i_prefer_light_mode/ If their colour scheme was a little less white I'd love it but overall one of my favourites every +### Wallpaper Sources +1. https://www.wallpaperflare.com/ +2. https://alphacoders.com + specifically: https://alphacoders.com/lofi + + ### Credits 1. https://github.com/XNM1/linux-nixos-hyprland-config-dotfiles The simplicity of their layout is amazing, was really good to pick out small modules and learn how something works / is configured. diff --git a/flake.lock b/flake.lock old mode 100644 new mode 100755 index eb4fc3d..adee7a7 --- a/flake.lock +++ b/flake.lock @@ -33,6 +33,27 @@ "type": "github" } }, + "devshell": { + "inputs": { + "nixpkgs": [ + "nixvim", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1728330715, + "narHash": "sha256-xRJ2nPOXb//u1jaBnDP56M7v5ldavjbtR6lfGqSvcKg=", + "owner": "numtide", + "repo": "devshell", + "rev": "dd6b80932022cea34a019e2bb32f6fa9e494dfef", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, "flake-compat": { "flake": false, "locked": { @@ -64,19 +85,17 @@ } }, "flake-compat_3": { - "flake": false, "locked": { "lastModified": 1696426674, "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", - "owner": "edolstra", - "repo": "flake-compat", "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", - "type": "github" + "revCount": 57, + "type": "tarball", + "url": "https://api.flakehub.com/f/pinned/edolstra/flake-compat/1.0.1/018afb31-abd1-7bff-a5e4-cff7e18efb7a/source.tar.gz" }, "original": { - "owner": "edolstra", - "repo": "flake-compat", - "type": "github" + "type": "tarball", + "url": "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz" } }, "flake-compat_4": { @@ -95,6 +114,91 @@ "type": "github" } }, + "flake-compat_5": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": [ + "nixvim", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1730504689, + "narHash": "sha256-hgmguH29K2fvs9szpq2r3pz2/8cJd2LPS+b4tfNFCwE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "506278e768c2a08bec68eb62932193e341f55c90", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "inputs": { + "systems": "systems_2" + }, + "locked": { + "lastModified": 1726560853, + "narHash": "sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "git-hooks": { + "inputs": { + "flake-compat": [ + "nixvim", + "flake-compat" + ], + "gitignore": "gitignore_2", + "nixpkgs": [ + "nixvim", + "nixpkgs" + ], + "nixpkgs-stable": [ + "nixvim", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1730302582, + "narHash": "sha256-W1MIJpADXQCgosJZT8qBYLRuZls2KSiKdpnTVdKBuvU=", + "owner": "cachix", + "repo": "git-hooks.nix", + "rev": "af8a16fe5c264f5e9e18bcee2859b40a656876cf", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "git-hooks.nix", + "type": "github" + } + }, "gitignore": { "inputs": { "nixpkgs": [ @@ -117,6 +221,28 @@ "type": "github" } }, + "gitignore_2": { + "inputs": { + "nixpkgs": [ + "nixvim", + "git-hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1709087332, + "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, "grub2-themes": { "inputs": { "nixpkgs": "nixpkgs" @@ -142,11 +268,32 @@ ] }, "locked": { - "lastModified": 1729551526, - "narHash": "sha256-7LAGY32Xl14OVQp3y6M43/0AtHYYvV6pdyBcp3eoz0s=", + "lastModified": 1730633670, + "narHash": "sha256-ZFJqIXpvVKvzOVFKWNRDyIyAo+GYdmEPaYi1bZB6uf0=", "owner": "nix-community", "repo": "home-manager", - "rev": "5ec753a1fc4454df9285d8b3ec0809234defb975", + "rev": "8f6ca7855d409aeebe2a582c6fd6b6a8d0bf5661", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "home-manager", + "type": "github" + } + }, + "home-manager_2": { + "inputs": { + "nixpkgs": [ + "nixvim", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1730633670, + "narHash": "sha256-ZFJqIXpvVKvzOVFKWNRDyIyAo+GYdmEPaYi1bZB6uf0=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "8f6ca7855d409aeebe2a582c6fd6b6a8d0bf5661", "type": "github" }, "original": { @@ -198,11 +345,11 @@ "xdph": "xdph" }, "locked": { - "lastModified": 1729657195, - "narHash": "sha256-YGk7oeyyfvZs4d8qAyMBPg2J/euYK48hPiI6PLKEa30=", + "lastModified": 1730800743, + "narHash": "sha256-DmlaerjZowNAc/NCrVHKwvAMBJYPVFx4YLs0Ad2Jo5g=", "owner": "hyprwm", "repo": "Hyprland", - "rev": "6e0aadc585c6d9fdaaebfa5853adbf9610897c82", + "rev": "e3882b23d09aad7f5c3a708536c87b062f3b0d8d", "type": "github" }, "original": { @@ -315,17 +462,66 @@ "type": "github" } }, + "ixx": { + "inputs": { + "flake-utils": [ + "nixvim", + "nuschtosSearch", + "flake-utils" + ], + "nixpkgs": [ + "nixvim", + "nuschtosSearch", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1729544999, + "narHash": "sha256-YcyJLvTmN6uLEBGCvYoMLwsinblXMkoYkNLEO4WnKus=", + "owner": "NuschtOS", + "repo": "ixx", + "rev": "65c207c92befec93e22086da9456d3906a4e999c", + "type": "github" + }, + "original": { + "owner": "NuschtOS", + "ref": "v0.0.5", + "repo": "ixx", + "type": "github" + } + }, + "nix-darwin": { + "inputs": { + "nixpkgs": [ + "nixvim", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1730600078, + "narHash": "sha256-BoyFmE59HDF3uybBySsWVoyjNuHvz3Wv8row/mSb958=", + "owner": "lnl7", + "repo": "nix-darwin", + "rev": "4652874d014b82cb746173ffc64f6a70044daa7e", + "type": "github" + }, + "original": { + "owner": "lnl7", + "repo": "nix-darwin", + "type": "github" + } + }, "nixcord": { "inputs": { "flake-compat": "flake-compat_2", "nixpkgs": "nixpkgs_3" }, "locked": { - "lastModified": 1730107956, - "narHash": "sha256-Ohwk5/RGhGjDXaD4v0Yc40J/79gHRcD92mKWY+6qHJU=", + "lastModified": 1730720546, + "narHash": "sha256-5147A6X0MH6u/YDxLe+Nnva3oxfLQanC716LarG/uoo=", "owner": "kaylorben", "repo": "nixcord", - "rev": "5dcb476b924ad08ffd8521cca812052605cb5974", + "rev": "e3e27c77316f7526b1a846778ae9c759c9377611", "type": "github" }, "original": { @@ -336,11 +532,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1730370246, - "narHash": "sha256-UD2XmS6IWT+G/scUpPItb0dNijT5Dxa7WMuVqRhiaxU=", + "lastModified": 1730808093, + "narHash": "sha256-oOenwoxpzQsBNi7KltgnXqq6e0+CxlfNXKn3k27w6cQ=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "88f31ac8837ab15748102da8bbc6e96a9330be0d", + "rev": "c1a390f74b2c93f69a6805142f11a215a689cec1", "type": "github" }, "original": { @@ -368,11 +564,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1729413321, - "narHash": "sha256-I4tuhRpZFa6Fu6dcH9Dlo5LlH17peT79vx1y1SpeKt0=", + "lastModified": 1730531603, + "narHash": "sha256-Dqg6si5CqIzm87sp57j5nTaeBbWhHFaVyG7V6L8k3lY=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "1997e4aa514312c1af7e2bda7fad1644e778ff26", + "rev": "7ffd9ae656aec493492b44d0ddfb28e79a1ea25d", "type": "github" }, "original": { @@ -384,11 +580,11 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1730170245, - "narHash": "sha256-PRq4vJjDa+m1mNwkV9H7zVzMhuMqsHJrTGx0iJZ0e0w=", + "lastModified": 1730768919, + "narHash": "sha256-8AKquNnnSaJRXZxc5YmF/WfmxiHX6MMZZasRP6RRQkE=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "30c9efeef01e2ad4880bff6a01a61dd99536b3c9", + "rev": "a04d33c0c3f1a59a2c1cb0c6e34cd24500e5a1dc", "type": "github" }, "original": { @@ -400,11 +596,11 @@ }, "nixpkgs_4": { "locked": { - "lastModified": 1729413321, - "narHash": "sha256-I4tuhRpZFa6Fu6dcH9Dlo5LlH17peT79vx1y1SpeKt0=", + "lastModified": 1730531603, + "narHash": "sha256-Dqg6si5CqIzm87sp57j5nTaeBbWhHFaVyG7V6L8k3lY=", "owner": "nixos", "repo": "nixpkgs", - "rev": "1997e4aa514312c1af7e2bda7fad1644e778ff26", + "rev": "7ffd9ae656aec493492b44d0ddfb28e79a1ea25d", "type": "github" }, "original": { @@ -416,11 +612,11 @@ }, "nixpkgs_5": { "locked": { - "lastModified": 1727634051, - "narHash": "sha256-S5kVU7U82LfpEukbn/ihcyNt2+EvG7Z5unsKW9H/yFA=", + "lastModified": 1730200266, + "narHash": "sha256-l253w0XMT8nWHGXuXqyiIC/bMvh1VRszGXgdpQlfhvU=", "owner": "nixos", "repo": "nixpkgs", - "rev": "06cf0e1da4208d3766d898b7fdab6513366d45b9", + "rev": "807e9154dcb16384b1b765ebe9cd2bba2ac287fd", "type": "github" }, "original": { @@ -430,6 +626,57 @@ "type": "github" } }, + "nixvim": { + "inputs": { + "devshell": "devshell", + "flake-compat": "flake-compat_3", + "flake-parts": "flake-parts", + "git-hooks": "git-hooks", + "home-manager": "home-manager_2", + "nix-darwin": "nix-darwin", + "nixpkgs": [ + "nixpkgs" + ], + "nuschtosSearch": "nuschtosSearch", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1730792264, + "narHash": "sha256-Ue3iywjyaNOxXgw7esVSBX3bZzM2bSPubZamYsBKIG8=", + "owner": "nix-community", + "repo": "nixvim", + "rev": "3d24cb72618738130e6af9c644c81fe42aa34ebc", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixvim", + "type": "github" + } + }, + "nuschtosSearch": { + "inputs": { + "flake-utils": "flake-utils", + "ixx": "ixx", + "nixpkgs": [ + "nixvim", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1730515563, + "narHash": "sha256-8lklUZRV7nwkPLF3roxzi4C2oyLydDXyAzAnDvjkOms=", + "owner": "NuschtOS", + "repo": "search", + "rev": "9e22bd742480916ff5d0ab20ca2522eaa3fa061e", + "type": "github" + }, + "original": { + "owner": "NuschtOS", + "repo": "search", + "type": "github" + } + }, "pre-commit-hooks": { "inputs": { "flake-compat": "flake-compat", @@ -461,23 +708,24 @@ "hyprland": "hyprland", "nixcord": "nixcord", "nixpkgs": "nixpkgs_4", + "nixvim": "nixvim", "spicetify-nix": "spicetify-nix", "swww": "swww" } }, "spicetify-nix": { "inputs": { - "flake-compat": "flake-compat_3", + "flake-compat": "flake-compat_4", "nixpkgs": [ "nixpkgs" ] }, "locked": { - "lastModified": 1730261837, - "narHash": "sha256-syeN2dLFxJ9bhsG1YnwWpwMgCttBY1S60KUrqLIrmMo=", + "lastModified": 1730780158, + "narHash": "sha256-ZJkCFn4PL49rINz7xrjlBqw9nF8wWJE7fSVqbHlCWSA=", "owner": "Gerg-L", "repo": "spicetify-nix", - "rev": "1c482c8baffd494119b7f61735d35c62a0a22244", + "rev": "2791c6662002731d3dfc00312307aef547e1c8be", "type": "github" }, "original": { @@ -488,16 +736,16 @@ }, "swww": { "inputs": { - "flake-compat": "flake-compat_4", + "flake-compat": "flake-compat_5", "nixpkgs": "nixpkgs_5", "utils": "utils" }, "locked": { - "lastModified": 1730050836, - "narHash": "sha256-6xCp6rTJ5MWxfUXUYxWRZz1CA5V9/gGqgb0+34BMF6U=", + "lastModified": 1730424990, + "narHash": "sha256-+8YUJsNzvgAeZYLfbHYfYlad/iS+6Eec/LWzL1ZIGfY=", "owner": "LGFae", "repo": "swww", - "rev": "36808dfd90223e648fcc45075ca57392b3d6a297", + "rev": "0db3f4eb192f1c9bf914efcc1d2aba809da5d78a", "type": "github" }, "original": { @@ -536,9 +784,45 @@ "type": "github" } }, + "systems_3": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "nixvim", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1730321837, + "narHash": "sha256-vK+a09qq19QNu2MlLcvN4qcRctJbqWkX7ahgPZ/+maI=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "746901bb8dba96d154b66492a29f5db0693dbfcc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, "utils": { "inputs": { - "systems": "systems_2" + "systems": "systems_3" }, "locked": { "lastModified": 1726560853, @@ -582,11 +866,11 @@ ] }, "locked": { - "lastModified": 1728166987, - "narHash": "sha256-w6dVTguAn9zJ+7aPOhBQgDz8bn6YZ7b56cY8Kg5HJRI=", + "lastModified": 1730743262, + "narHash": "sha256-iTLqj3lU8kFehPm5tXpctzkD274t/k1nwSSq3qCWXeg=", "owner": "hyprwm", "repo": "xdg-desktop-portal-hyprland", - "rev": "fb9c8d665af0588bb087f97d0f673ddf0d501787", + "rev": "09b23cef06fe248e61cec8862c04b9bcb62f4b6d", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix old mode 100644 new mode 100755 index 3f56093..da2e087 --- a/flake.nix +++ b/flake.nix @@ -3,42 +3,38 @@ inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; - + home-manager = { url = "github:nix-community/home-manager"; inputs.nixpkgs.follows = "nixpkgs"; }; - spicetify-nix = { + spicetify-nix = { url = "github:Gerg-L/spicetify-nix"; inputs.nixpkgs.follows = "nixpkgs"; }; - - #stylix.url = "github:danth/stylix"; - nixcord = { - url = "github:kaylorben/nixcord"; - }; + #stylix.url = "github:danth/stylix"; - grub2-themes = { - url = "github:vinceliuice/grub2-themes"; - }; + nixcord = { url = "github:kaylorben/nixcord"; }; - # is this necessary? (aren't I enabling it in `configuration.nix` anyways?) + nixvim = { + url = "github:nix-community/nixvim"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + grub2-themes = { url = "github:vinceliuice/grub2-themes"; }; + + # is this necessary? (aren't I enabling it in `configuration.nix` anyways?) hyprland.url = "github:hyprwm/Hyprland"; - swww.url = "github:LGFae/swww"; + swww.url = "github:LGFae/swww"; }; - outputs = { - self, - nixpkgs, - home-manager, - hyprland, - grub2-themes, - #stylix, - ... - }@inputs: + outputs = { self, nixpkgs, home-manager, hyprland, grub2-themes, nixvim + , nixcord, + #stylix, + ... }@inputs: let system = "x86_64-linux"; @@ -54,38 +50,32 @@ nixosConfigurations = { # i be on my puter fr myputer = nixpkgs.lib.nixosSystem { - # nix passes these to every single module above - specialArgs = { - inherit inputs pkgs; - }; + # nix passes these to every single module above + specialArgs = { inherit inputs pkgs; }; modules = [ ./hosts/myputer - grub2-themes.nixosModules.default - #stylix.nixosModules.stylix + grub2-themes.nixosModules.default + #stylix.nixosModules.stylix ]; }; # my laptop 0w0 lolcathost = nixpkgs.lib.nixosSystem { - specialArgs = { - inherit inputs; - }; + specialArgs = { inherit inputs pkgs; }; - modules = [ - ./hosts/lolcathost - ]; + modules = [ ./hosts/lolcathost ]; }; }; homeConfigurations = { me = home-manager.lib.homeManagerConfiguration { - specialArgs = { - inherit inputs; - }; + specialArgs = { inherit inputs; }; - modules = [ + modules = [ ./home/me + #nixcord.homeManagerModules.nixcord + #nixvim.homeManagerModules.nixvim ]; }; }; diff --git a/homes/me/TODO b/homes/me/TODO new file mode 100644 index 0000000..c4bfdc8 --- /dev/null +++ b/homes/me/TODO @@ -0,0 +1,31 @@ +Get Utilities: +1. httpie +2. curlie +3. zoxide +4. doggo + +1. Get helix editor +2. Custom helix +3. Complete helix tutorial + + + +Get waybar (or another bar) working + + +Get a better wallpaper + +Get a GRUB theme working + +Fix: your 131072x1 screen size is bogus. expect trouble + + +Push nixdots to github + + + +Have helix editor look differently depending on language + (specifically don't show indent indicators when editing nix files + + +Learn to package my own home-manager modules diff --git a/homes/me/default.nix b/homes/me/default.nix old mode 100644 new mode 100755 index 806471c..dfeeb2e --- a/homes/me/default.nix +++ b/homes/me/default.nix @@ -5,17 +5,16 @@ config, pkgs, ... -}: - -{ +}: { nixpkgs = { config.allowUnfree = true; }; imports = [ - # inputs.nixcord.homeManagerModules.nixcord + #inputs.nixcord.homeManagerModules.nixcord # inputs.spicetify-nix.homeManagerModules.default # ./wofi.nix + #../../modules/discord/nixcord.nix ]; /* @@ -36,7 +35,7 @@ */ # ----- STYLIX ----- - + #stylix = { # enable = true; # @@ -44,7 +43,7 @@ # url = "https://www.pixelstalk.net/wp-content/uploads/2016/05/Epic-Anime-Awesome-Wallpapers.jpg"; # sha256 = "enQo3wqhgf0FEPHj2coOCvo7DuZv+x5rL/WIo4qPI50="; # }; - # + # # # Stylix will automatically theme applications # autoEnable = true; # targets = { @@ -56,332 +55,489 @@ home = { username = "me"; - homeDirectory = "/home/me"; + homeDirectory = "/home/me"; + + pointerCursor = { + gtk.enable = true; + # x11.enable = true # dont enable since im on hyprland + package = pkgs.bibata-cursors; + name = "Bibata-Modern-Ice"; + size = 16; + }; }; programs = { # these are both required for home-manager to work home-manager.enable = true; - - git = { - enable = true; - userName = "emileclarkb"; - userEmail = "eclarkboman@gmail.com"; - }; + + git = { + enable = true; + userName = "Emile Clark-Boman"; + userEmail = "eclarkboman@gmail.com"; + }; # like `/bin/cat` but with syntax highlighting - # TODO: change the pager (maybe use Github:sachaos/viddy instead) - bat = { - enable = true; + # TODO: change the pager (maybe use Github:sachaos/viddy instead) + bat = { + enable = true; config = { - pager = "less -FR"; - # let Stylix control the theme - #theme = "Dracula"; - }; - }; + pager = "less -FR"; + # let Stylix control the theme + #theme = "Dracula"; + }; + }; - firefox = { - enable = true; + #nixvim = { + # enable = true; + # # TODO: allow clipboard to be configurable based on system clipboard + # colorschemes.dracula.enable = true; + # plugins = { + # lualine.enable = true; + # treesitter.enable = true; + # }; + + # opts = { + # number = true; + # tabstop = 4; + # softtabstop = 4; + # shiftwidth = 4; + # }; + + # clipboard.providers.wl-copy.enable = true; + #}; + + # read https://docs.helix-editor.com/editor.html + helix = { + enable = true; + settings = { + theme = "dracula"; + editor = { + line-number = "absolute"; + popup-border = "all"; + scroll-lines = 3; + color-modes = true; # colour the mode indicator depending on mode + shell = ["zsh" "-c"]; + + auto-format = true; + auto-completion = true; # enable popup for autocomplete + completion-timeout = 250; # time before completions display + preview-completion-insert = true; + completion-trigger-len = 2; # min word length to trigger completions + completion-replace = true; # completions replace entire word + + indent-heuristic = "tree-sitter"; # how indentation is computed + middle-click-paste = true; + insert-final-newline = true; # append newline to file on write + + gutters = [ + "diagnostics" + "spacer" + "line-numbers" + "spacer" + "diff" + ]; + + whitespace = { + render = { + space = "none"; # "all" + tab = "none"; #"all" + nbsp = "none"; + nnbsp = "none"; + newline = "none"; + }; + characters = { + space = "·"; + nbsp = "⍽"; + nnbsp = "␣"; + tab = "→"; + newline = "⤶"; + tabpad = "·"; # Tabs will look like "→···" (depending on tab width) + }; + }; + + indent-guides = { + render = true; + character = "▏"; # "|" + skip-levels = 1; + }; + + lsp = { + enable = true; + auto-signature-help = true; # hints for function parameters + display-inlay-hints = true; # inline hints + snippets = true; + }; + + cursor-shape = { + normal = "block"; + insert = "bar"; + select = "block"; + }; + + file-picker = { + hidden = true; # show hidden files + follow-symlinks = true; + deduplicate-links = true; + git-ignore = false; # dont read .gitignore files + ignore = true; # use .ignore for helix instead of .gitignore + }; + + statusline = { + left = [ + "mode" + "version-control" + "spinner" + ]; + center = [ + "file-name" + "read-only-indicator" + "file-modification-indicator" + ]; + right = [ + "position" + "total-line-numbers" + "separator" + "file-encoding" + "file-line-ending" + "separator" + "file-type" + ]; + separator = "|"; + mode.normal = "NORMAL"; + mode.insert = "INSERT"; + mode.select = "SELECT"; + }; + }; + }; + + languages.language = [ + { + name = "nix"; + indent = { + tab-width = 2; + unit = " "; + }; + block-comment-tokens = { + start = "/*"; + end = "*/"; + }; + auto-format = true; + formatter.command = "${pkgs.alejandra}/bin/alejandra"; + } + { + name = "python"; + indent = { + tab-width = 4; + unit = " "; + }; + auto-format = false; # my python is beautiful ^_^ + rulers = [80]; + } + ]; + }; + + #nixcord.enable = true; + + firefox = { + enable = true; policies = { - #BlockAboutConfig = true; - DefaultDownloadDirectory = "\${home}/downloads"; - }; - }; + #BlockAboutConfig = true; + DefaultDownloadDirectory = "\${home}/downloads"; + }; + }; # I want to use fish as my login shell but it always - # goes terrible cause it isn't POSIX compliant, so - # instead Bash is my login and it will just exec fish - #bash = { - # interactiveShellInit = '' - # if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]] + # goes terrible cause it isn't POSIX compliant, so + # instead Bash is my login and it will just exec fish + #bash = { + # interactiveShellInit = '' + # if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]] # then # shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION="" # exec ${pkgs.fish}/bin/fish $LOGIN_OPTION - # fi - # ''; - #}; + # fi + # ''; + #}; - fish = { - enable = true; - interactiveShellInit = '' + fish = { + enable = true; + interactiveShellInit = '' set -g fish_greeting "Welcome weary traveler to my shop" - ''; - plugins = [ - { - name = "grc"; - src = pkgs.fishPlugins.grc.src; - } - ]; - }; + ''; + plugins = [ + { + name = "grc"; + src = pkgs.fishPlugins.grc.src; + } + ]; + }; - /* - spicetify = - let - spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; - in - { - enable = true; - enabledExtensions = with spicePkgs.extensions; [ - adblock - hidePodcasts - #shuffle - ]; - theme = spicePkgs.themes.catppuccin; - colorScheme = "mocha"; - }; - */ + /* + spicetify = + let + spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; + in + { + enable = true; + enabledExtensions = with spicePkgs.extensions; [ + adblock + hidePodcasts + #shuffle + ]; + theme = spicePkgs.themes.catppuccin; + colorScheme = "mocha"; + }; + */ # The terminal I use - # TODO: this is dependent on nvim being installed - # TODO: make this into a module with a configurable editor option - rio = { - enable = true; - # Rio Config Docs: https://raphamorim.io/rio/docs/config - settings = { - theme = "dracula"; - hide-mouse-cursor-when-typing = true; + # TODO: this is dependent on nvim being installed + # TODO: make this into a module with a configurable editor option + rio = { + enable = true; + # Rio Config Docs: https://raphamorim.io/rio/docs/config + settings = { + theme = "dracula"; + hide-mouse-cursor-when-typing = true; - use-fork = true; # fork (dont spawn) Rio + use-fork = true; # fork (dont spawn) Rio padding-x = 10; - padding-y = [ 15 10 ]; # top, left + padding-y = [15 10]; # top, left - # lines = (accumulated scroll * multiplier / divider) + # lines = (accumulated scroll * multiplier / divider) scroll = { - multiplier = 3.0; - divider = 1.0; - }; + multiplier = 3.0; + divider = 1.0; + }; - fonts = { - size = 15; - features = []; + fonts = { + size = 15; + features = []; - regular = { - family = "FiraCode Nerd Font"; # "IosevkaTerm Nerd Font" - style = "Normal"; - weight = 400; - }; - - bold = { - family = "FiraCode Nerd Font"; - style = "Normal"; - weight = 800; - }; - - italic = { - family = "FiraCode Nerd Font"; - style = "Italic"; - weight = 400; - }; - - bold-italic = { - family = "FiraCode Nerd Font"; - style = "Italic"; - weight = 800; - }; - }; + regular = { + family = "JetBrainsMono Nerd Font"; # FiraCode + style = "Normal"; + weight = 400; + }; - # Run when the `OpenConfigEditor` keybinding is triggered - editor = { - program = "nvim"; - args = []; - }; + bold = { + family = "JetBrainsMono Nerd Font"; + style = "Normal"; + weight = 800; + }; - renderer = { - performance = "High"; - backend = "Automatic"; # Vulkan - }; - }; - }; + italic = { + family = "JetBrainsMono Nerd Font"; + style = "Italic"; + weight = 400; + }; + + bold-italic = { + family = "JetBrainsMono Nerd Font"; + style = "Italic"; + weight = 800; + }; + }; + + # Run when the `OpenConfigEditor` keybinding is triggered + editor = { + program = "nvim"; + args = []; + }; + + renderer = { + performance = "High"; + backend = "Automatic"; # Vulkan + }; + }; + }; wofi = { - enable = true; - settings = { - location = "center"; - allow_markup = true; - width = 250; - }; - # Force the style to stop Stylix being a bitch and overwriting it - style = lib.mkForce '' - @define-color rosewater #f2d5cf; - @define-color rosewater-rgb rgb(242, 213, 207); - @define-color flamingo #eebebe; - @define-color flamingo-rgb rgb(238, 190, 190); - @define-color pink #f4b8e4; - @define-color pink-rgb rgb(244, 184, 228); - @define-color mauve #ca9ee6; - @define-color mauve-rgb rgb(202, 158, 230); - @define-color red #e78284; - @define-color red-rgb rgb(231, 130, 132); - @define-color maroon #ea999c; - @define-color maroon-rgb rgb(234, 153, 156); - @define-color peach #ef9f76; - @define-color peach-rgb rgb(239, 159, 118); - @define-color yellow #e5c890; - @define-color yellow-rgb rgb(229, 200, 144); - @define-color green #a6d189; - @define-color green-rgb rgb(166, 209, 137); - @define-color teal #81c8be; - @define-color teal-rgb rgb(129, 200, 190); - @define-color sky #99d1db; - @define-color sky-rgb rgb(153, 209, 219); - @define-color sapphire #85c1dc; - @define-color sapphire-rgb rgb(133, 193, 220); - @define-color blue #8caaee; - @define-color blue-rgb rgb(140, 170, 238); - @define-color lavender #babbf1; - @define-color lavender-rgb rgb(186, 187, 241); - @define-color text #c6d0f5; - @define-color text-rgb rgb(198, 208, 245); - @define-color subtext1 #b5bfe2; - @define-color subtext1-rgb rgb(181, 191, 226); - @define-color subtext0 #a5adce; - @define-color subtext0-rgb rgb(165, 173, 206); - @define-color overlay2 #949cbb; - @define-color overlay2-rgb rgb(148, 156, 187); - @define-color overlay1 #838ba7; - @define-color overlay1-rgb rgb(131, 139, 167); - @define-color overlay0 #737994; - @define-color overlay0-rgb rgb(115, 121, 148); - @define-color surface2 #626880; - @define-color surface2-rgb rgb(98, 104, 128); - @define-color surface1 #51576d; - @define-color surface1-rgb rgb(81, 87, 109); - @define-color surface0 #414559; - @define-color surface0-rgb rgb(65, 69, 89); - @define-color base #303446; - @define-color base-rgb rgb(48, 52, 70); - @define-color mantle #292c3c; - @define-color mantle-rgb rgb(41, 44, 60); - @define-color crust #232634; - @define-color crust-rgb rgb(35, 38, 52); + enable = true; + settings = { + location = "center"; + allow_markup = true; + width = 250; + }; + # Force the style to stop Stylix being a bitch and overwriting it + style = lib.mkForce '' + @define-color rosewater #f2d5cf; + @define-color rosewater-rgb rgb(242, 213, 207); + @define-color flamingo #eebebe; + @define-color flamingo-rgb rgb(238, 190, 190); + @define-color pink #f4b8e4; + @define-color pink-rgb rgb(244, 184, 228); + @define-color mauve #ca9ee6; + @define-color mauve-rgb rgb(202, 158, 230); + @define-color red #e78284; + @define-color red-rgb rgb(231, 130, 132); + @define-color maroon #ea999c; + @define-color maroon-rgb rgb(234, 153, 156); + @define-color peach #ef9f76; + @define-color peach-rgb rgb(239, 159, 118); + @define-color yellow #e5c890; + @define-color yellow-rgb rgb(229, 200, 144); + @define-color green #a6d189; + @define-color green-rgb rgb(166, 209, 137); + @define-color teal #81c8be; + @define-color teal-rgb rgb(129, 200, 190); + @define-color sky #99d1db; + @define-color sky-rgb rgb(153, 209, 219); + @define-color sapphire #85c1dc; + @define-color sapphire-rgb rgb(133, 193, 220); + @define-color blue #8caaee; + @define-color blue-rgb rgb(140, 170, 238); + @define-color lavender #babbf1; + @define-color lavender-rgb rgb(186, 187, 241); + @define-color text #c6d0f5; + @define-color text-rgb rgb(198, 208, 245); + @define-color subtext1 #b5bfe2; + @define-color subtext1-rgb rgb(181, 191, 226); + @define-color subtext0 #a5adce; + @define-color subtext0-rgb rgb(165, 173, 206); + @define-color overlay2 #949cbb; + @define-color overlay2-rgb rgb(148, 156, 187); + @define-color overlay1 #838ba7; + @define-color overlay1-rgb rgb(131, 139, 167); + @define-color overlay0 #737994; + @define-color overlay0-rgb rgb(115, 121, 148); + @define-color surface2 #626880; + @define-color surface2-rgb rgb(98, 104, 128); + @define-color surface1 #51576d; + @define-color surface1-rgb rgb(81, 87, 109); + @define-color surface0 #414559; + @define-color surface0-rgb rgb(65, 69, 89); + @define-color base #303446; + @define-color base-rgb rgb(48, 52, 70); + @define-color mantle #292c3c; + @define-color mantle-rgb rgb(41, 44, 60); + @define-color crust #232634; + @define-color crust-rgb rgb(35, 38, 52); - * { - font-family: 'FiraCode Nerd Font'; - font-size: 16px; - } + * { + font-family: 'FiraCode Nerd Font'; + font-size: 16px; + } - /* Window */ - window { - margin: 0px; - padding: 10px; - border: 0.16em solid @teal; - border-radius: 0.5em; - background-color: @base; - animation: slideIn 0.25s ease-in-out both; - } + /* Window */ + window { + margin: 0px; + padding: 10px; + border: 0.16em solid @teal; + border-radius: 0.5em; + background-color: @base; + animation: slideIn 0.25s ease-in-out both; + } - /* Slide In */ - @keyframes slideIn { - 0% { - opacity: 0; - } + /* Slide In */ + @keyframes slideIn { + 0% { + opacity: 0; + } - 100% { - opacity: 1; - } - } + 100% { + opacity: 1; + } + } - /* Inner Box */ - #inner-box { - margin: 5px; - padding: 10px; - border: none; - background-color: @base; - /*animation: fadeIn 0.5s ease-in-out both;*/ - } + /* Inner Box */ + #inner-box { + margin: 5px; + padding: 10px; + border: none; + background-color: @base; + /*animation: fadeIn 0.5s ease-in-out both;*/ + } - /* Fade In */ - @keyframes fadeIn { - 0% { - opacity: 0; - } + /* Fade In */ + @keyframes fadeIn { + 0% { + opacity: 0; + } - 100% { - opacity: 1; - } - } + 100% { + opacity: 1; + } + } - /* Outer Box */ - #outer-box { - margin: 5px; - padding: 10px; - border: none; - background-color: @base; - } + /* Outer Box */ + #outer-box { + margin: 5px; + padding: 10px; + border: none; + background-color: @base; + } - /* Scroll */ - #scroll { - margin: 0px; - padding: 10px; - border: none; - background-color: @base; - } + /* Scroll */ + #scroll { + margin: 0px; + padding: 10px; + border: none; + background-color: @base; + } - /* Input */ - #input { - margin: 5px 20px; - padding: 10px; - border: none; - border-radius: 0.25em; - color: @text; - background-color: @base; - animation: fadeIn 0.25s ease-in-out both; - } + /* Input */ + #input { + margin: 5px 20px; + padding: 10px; + border: none; + border-radius: 0.25em; + color: @text; + background-color: @base; + animation: fadeIn 0.25s ease-in-out both; + } - #input image { - border: none; - color: @red; - } + #input image { + border: none; + color: @red; + } - #input * { - outline: 4px solid @red!important; - } + #input * { + outline: 4px solid @red!important; + } - /* Text */ - #text { - margin: 5px; - border: none; - color: @text; - animation: fadeIn 0.5s ease-in-out both; - } + /* Text */ + #text { + margin: 5px; + border: none; + color: @text; + animation: fadeIn 0.5s ease-in-out both; + } - #entry { - background-color: @base; - } + #entry { + background-color: @base; + } - #entry arrow { - border: none; - color: @teal; - } + #entry arrow { + border: none; + color: @teal; + } - /* Selected Entry */ - #entry:selected { - border: 0.10em solid @teal; - border-radius: 0.25em; - } + /* Selected Entry */ + #entry:selected { + border: 0.10em solid @teal; + border-radius: 0.25em; + } - #entry:selected #text { - color: @teal; - } + #entry:selected #text { + color: @teal; + } - #entry:drop(active) { - background-color: @lavender!important; - } - ''; - }; + #entry:drop(active) { + background-color: @lavender!important; + } + ''; + }; - rofi = { - enable = true; - package = pkgs.rofi-wayland; - font = "JetBrains Mono Nerd Font 10"; - location = "center"; - terminal = "${pkgs.rio}/bin/rio"; - }; - + rofi = { + enable = true; + package = pkgs.rofi-wayland; + font = "JetBrains Mono Nerd Font 10"; + location = "center"; + terminal = "${pkgs.rio}/bin/rio"; + }; }; - # ----- SERVICES ----- services = { # Change monitor positions @@ -392,36 +548,54 @@ systemdTarget = "hyprland-session.target"; # You can find your monitors in hyprland by using `hyprctl monitors all` settings = [ - { # 1920x1080@144 gaming monitor - output.criteria = "HDMI-A-1"; - output.mode = "1920x1080@119.98Hz"; - output.scale = 1.0; - output.adaptiveSync = false; # Variable Refresh Rate (this can be changed for gaming) - } - { # 4k side monitor - output.criteria = "DP-2"; - output.mode = "3840x2160@60.00Hz"; - output.scale = 2.0; - } + { + # 1920x1080@144 gaming monitor + output.criteria = "HDMI-A-1"; + output.mode = "1920x1080@119.98Hz"; + output.scale = 1.0; + output.adaptiveSync = false; # Variable Refresh Rate (this can be changed for gaming) + } + { + # 4k side monitor + output.criteria = "DP-2"; + output.mode = "3840x2160@60.00Hz"; + output.scale = 2.0; + } + { + # laptop builtin screen + output.criteria = "eDP-1"; + output.mode = "1920x1080@60.02Hz"; + output.scale = 1.0; + } - { # This is my default setup - profile.name = "default"; + { + # This is my dual-monitor desktop setup + profile.name = "myputer"; profile.outputs = [ - { - criteria = "DP-2"; - position = "0,0"; - } - { - criteria = "HDMI-A-1"; - position = "3840,0"; - } - ]; - } + { + criteria = "DP-2"; + position = "0,0"; + } + { + criteria = "HDMI-A-1"; + position = "3840,0"; + } + ]; + } + { + # This is my laptop (lolcathost) :) + profile.name = "lolcathost"; + profile.outputs = [ + { + criteria = "eDP-1"; + position = "0,0"; + } + ]; + } ]; }; }; - # Nicely reload system units when changing configs systemd.user.startServices = "sd-switch"; diff --git a/homes/me/default.nix.bak b/homes/me/default.nix.bak deleted file mode 100644 index 3573995..0000000 --- a/homes/me/default.nix.bak +++ /dev/null @@ -1,207 +0,0 @@ -{ - inputs, - outputs, - lib, - config, - pkgs, - ... -}: - -{ - nixpkgs = { - config.allowUnfree = true; - }; - - imports = [ - # inputs.spicetify-nix.homeManagerModules.default - #./wofi.nix - ]; - - /* - programs.spicetify = - let - spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; - in - { - enable = true; - enabledExtensions = with spicePkgs.extensions; [ - adblock - hidePodcasts - shuffle # shuffle+ (special characters are sanitized out of extension names) - ]; - theme = spicePkgs.themes.catppuccin; - colorScheme = "mocha"; - }; - */ - - #wayland.windowManager.hyprland.enable = true; - - home = { - username = "me"; - homeDirectory = "/home/me"; - }; - - programs = { - # these are both required for home-manager to work - home-manager.enable = true; - git.enable = true; - - # like `/bin/cat` but with syntax highlighting - # TODO: change the pager (maybe use Github:sachaos/viddy instead) - bat = { - enable = true; - config = { - pager = "less -FR"; - #theme = "Dracula"; - }; - }; - - /* - spicetify = - let - spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; - in - { - enable = true; - enabledExtensions = with spicePkgs.extensions; [ - adblock - hidePodcasts - #shuffle - ]; - theme = spicePkgs.themes.catppuccin; - colorScheme = "mocha"; - }; - */ - - # The terminal I use - # TODO: this is dependent on nvim being installed - # TODO: make this into a module with a configurable editor option - rio = { - enable = true; - # Rio Config Docs: https://raphamorim.io/rio/docs/config - settings = { - theme = "dracula"; - hide-mouse-cursor-when-typing = true; - - use-fork = true; # fork (dont spawn) Rio - - padding-x = 10; - padding-y = [ 15 10 ]; # top, left - - # lines = (accumulated scroll * multiplier / divider) - scroll = { - multiplier = 1.0; - divider = 1.0; - }; - - fonts = { - size = 15; - features = []; - - regular = { - family = "FiraCode Nerd Font"; # "IosevkaTerm Nerd Font" - style = "Normal"; - weight = 400; - }; - - bold = { - family = "FiraCode Nerd Font"; - style = "Normal"; - weight = 800; - }; - - italic = { - family = "FiraCode Nerd Font"; - style = "Italic"; - weight = 400; - }; - - bold-italic = { - family = "FiraCode Nerd Font"; - style = "Italic"; - weight = 800; - }; - }; - - # Run when the `OpenConfigEditor` keybinding is triggered - editor = { - program = "nvim"; - args = []; - }; - - renderer = { - performance = "High"; - backend = "Automatic"; # Vulkan - }; - }; - }; - - wofi = { - enable = true; - settings = { - location = "center"; - allow_markup = true; - width = 250; - }; - }; - }; - - # ----- SERVICES ----- - services = { - # Hyprland Wallpaper - #hyprpaper = { - # enable = true; - # settings = { - # preload = [ "~/nixdots/wallpapers/ghibli-esque-valley.png" ]; - # wallpaper = [ - # "DP-2,~/nixdots/wallpapers/ghibli-esque-valley.png" - # "HDMI-A-1,~/nixdots/wallpapers/ghibli-esque-valley.png" - # ]; - # }; - #}; - - hyprpaper.enable = true; # so stylix can see it - - # Change monitor positions - # TODO: find a way to make this modular (ie put something different for my laptop) - # my idea is to have a "monitors" module and use kanshi for wayland - kanshi = { - enable = true; - systemdTarget = "hyprland-session.target"; - # You can find your monitors in hyprland by using `hyprctl monitors all` - settings = [ - { # 1920x1080@144 gaming monitor - output.criteria = "HDMI-A-1"; - output.mode = "1920x1080@119.98Hz"; - output.scale = 1.0; - output.adaptiveSync = false; # Variable Refresh Rate (this can be changed for gaming) - } - { # 4k side monitor - output.criteria = "DP-2"; - output.mode = "3840x2160@60.00Hz"; - output.scale = 2.0; - } - - { # This is my default setup - profile.name = "default"; - profile.outputs = [ - { - criteria = "DP-2"; - position = "0,0"; - } - { - criteria = "HDMI-A-1"; - position = "3840,0"; - } - ]; - } - ]; - }; - }; - - - # Nicely reload system units when changing configs - systemd.user.startServices = "sd-switch"; - - home.stateVersion = "24.05"; # don't change this -} diff --git a/homes/me/default.nix.bak13 b/homes/me/default.nix.bak13 deleted file mode 100644 index f5b3589..0000000 --- a/homes/me/default.nix.bak13 +++ /dev/null @@ -1,410 +0,0 @@ -{ - inputs, - outputs, - lib, - config, - pkgs, - ... -}: - -{ - nixpkgs = { - config.allowUnfree = true; - }; - - imports = [ - #inputs.nixcord.homeManagerModules.nixcord - # inputs.spicetify-nix.homeManagerModules.default - #./wofi.nix - ]; - - /* - programs.spicetify = - let - spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; - in - { - enable = true; - enabledExtensions = with spicePkgs.extensions; [ - adblock - hidePodcasts - shuffle # shuffle+ (special characters are sanitized out of extension names) - ]; - theme = spicePkgs.themes.catppuccin; - colorScheme = "mocha"; - }; - */ - - # ----- STYLIX ----- - - #stylix = { - # enable = true; - # - # image = pkgs.fetchurl { - # url = "https://www.pixelstalk.net/wp-content/uploads/2016/05/Epic-Anime-Awesome-Wallpapers.jpg"; - # sha256 = "enQo3wqhgf0FEPHj2coOCvo7DuZv+x5rL/WIo4qPI50="; - # }; - # - # # Stylix will automatically theme applications - # autoEnable = true; - # targets = { - # # disable Stylix's themes for ones I will theme manually - # firefox.enable = false; - # wofi.enable = false; - # }; - #}; - - home = { - username = "me"; - homeDirectory = "/home/me"; - }; - - programs = { - # these are both required for home-manager to work - home-manager.enable = true; - git.enable = true; - - # like `/bin/cat` but with syntax highlighting - # TODO: change the pager (maybe use Github:sachaos/viddy instead) - bat = { - enable = true; - config = { - pager = "less -FR"; - # let Stylix control the theme - #theme = "Dracula"; - }; - }; - - firefox = { - enable = true; - policies = { - #BlockAboutConfig = true; - DefaultDownloadDirectory = "\${home}/downloads"; - }; - }; - - /* - spicetify = - let - spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; - in - { - enable = true; - enabledExtensions = with spicePkgs.extensions; [ - adblock - hidePodcasts - #shuffle - ]; - theme = spicePkgs.themes.catppuccin; - colorScheme = "mocha"; - }; - */ - - # The terminal I use - # TODO: this is dependent on nvim being installed - # TODO: make this into a module with a configurable editor option - rio = { - enable = true; - # Rio Config Docs: https://raphamorim.io/rio/docs/config - settings = { - theme = "dracula"; - hide-mouse-cursor-when-typing = true; - - use-fork = true; # fork (dont spawn) Rio - - padding-x = 10; - padding-y = [ 15 10 ]; # top, left - - # lines = (accumulated scroll * multiplier / divider) - scroll = { - multiplier = 3.0; - divider = 1.0; - }; - - fonts = { - size = 15; - features = []; - - regular = { - family = "FiraCode Nerd Font"; # "IosevkaTerm Nerd Font" - style = "Normal"; - weight = 400; - }; - - bold = { - family = "FiraCode Nerd Font"; - style = "Normal"; - weight = 800; - }; - - italic = { - family = "FiraCode Nerd Font"; - style = "Italic"; - weight = 400; - }; - - bold-italic = { - family = "FiraCode Nerd Font"; - style = "Italic"; - weight = 800; - }; - }; - - # Run when the `OpenConfigEditor` keybinding is triggered - editor = { - program = "nvim"; - args = []; - }; - - renderer = { - performance = "High"; - backend = "Automatic"; # Vulkan - }; - }; - }; - - wofi = { - enable = true; - settings = { - location = "center"; - allow_markup = true; - width = 250; - }; - # Force the style to stop Stylix being a bitch and overwriting it - style = lib.mkForce '' - @define-color rosewater #f2d5cf; - @define-color rosewater-rgb rgb(242, 213, 207); - @define-color flamingo #eebebe; - @define-color flamingo-rgb rgb(238, 190, 190); - @define-color pink #f4b8e4; - @define-color pink-rgb rgb(244, 184, 228); - @define-color mauve #ca9ee6; - @define-color mauve-rgb rgb(202, 158, 230); - @define-color red #e78284; - @define-color red-rgb rgb(231, 130, 132); - @define-color maroon #ea999c; - @define-color maroon-rgb rgb(234, 153, 156); - @define-color peach #ef9f76; - @define-color peach-rgb rgb(239, 159, 118); - @define-color yellow #e5c890; - @define-color yellow-rgb rgb(229, 200, 144); - @define-color green #a6d189; - @define-color green-rgb rgb(166, 209, 137); - @define-color teal #81c8be; - @define-color teal-rgb rgb(129, 200, 190); - @define-color sky #99d1db; - @define-color sky-rgb rgb(153, 209, 219); - @define-color sapphire #85c1dc; - @define-color sapphire-rgb rgb(133, 193, 220); - @define-color blue #8caaee; - @define-color blue-rgb rgb(140, 170, 238); - @define-color lavender #babbf1; - @define-color lavender-rgb rgb(186, 187, 241); - @define-color text #c6d0f5; - @define-color text-rgb rgb(198, 208, 245); - @define-color subtext1 #b5bfe2; - @define-color subtext1-rgb rgb(181, 191, 226); - @define-color subtext0 #a5adce; - @define-color subtext0-rgb rgb(165, 173, 206); - @define-color overlay2 #949cbb; - @define-color overlay2-rgb rgb(148, 156, 187); - @define-color overlay1 #838ba7; - @define-color overlay1-rgb rgb(131, 139, 167); - @define-color overlay0 #737994; - @define-color overlay0-rgb rgb(115, 121, 148); - @define-color surface2 #626880; - @define-color surface2-rgb rgb(98, 104, 128); - @define-color surface1 #51576d; - @define-color surface1-rgb rgb(81, 87, 109); - @define-color surface0 #414559; - @define-color surface0-rgb rgb(65, 69, 89); - @define-color base #303446; - @define-color base-rgb rgb(48, 52, 70); - @define-color mantle #292c3c; - @define-color mantle-rgb rgb(41, 44, 60); - @define-color crust #232634; - @define-color crust-rgb rgb(35, 38, 52); - - * { - font-family: 'FiraCode Nerd Font'; - font-size: 16px; - } - - /* Window */ - window { - margin: 0px; - padding: 10px; - border: 0.16em solid @teal; - border-radius: 0.5em; - background-color: @base; - animation: slideIn 0.25s ease-in-out both; - } - - /* Slide In */ - @keyframes slideIn { - 0% { - opacity: 0; - } - - 100% { - opacity: 1; - } - } - - /* Inner Box */ - #inner-box { - margin: 5px; - padding: 10px; - border: none; - background-color: @base; - /*animation: fadeIn 0.5s ease-in-out both;*/ - } - - /* Fade In */ - @keyframes fadeIn { - 0% { - opacity: 0; - } - - 100% { - opacity: 1; - } - } - - /* Outer Box */ - #outer-box { - margin: 5px; - padding: 10px; - border: none; - background-color: @base; - } - - /* Scroll */ - #scroll { - margin: 0px; - padding: 10px; - border: none; - background-color: @base; - } - - /* Input */ - #input { - margin: 5px 20px; - padding: 10px; - border: none; - border-radius: 0.25em; - color: @text; - background-color: @base; - animation: fadeIn 0.25s ease-in-out both; - } - - #input image { - border: none; - color: @red; - } - - #input * { - outline: 4px solid @red!important; - } - - /* Text */ - #text { - margin: 5px; - border: none; - color: @text; - animation: fadeIn 0.5s ease-in-out both; - } - - #entry { - background-color: @base; - } - - #entry arrow { - border: none; - color: @teal; - } - - /* Selected Entry */ - #entry:selected { - border: 0.10em solid @teal; - border-radius: 0.25em; - } - - #entry:selected #text { - color: @teal; - } - - #entry:drop(active) { - background-color: @lavender!important; - } - ''; - }; - - rofi = { - enable = true; - package = pkgs.rofi-wayland; - font = "JetBrains Mono Nerd Font 10"; - location = "center"; - terminal = "${pkgs.rio}/bin/rio"; - }; - - }; - - - # ----- SERVICES ----- - services = { - # Hyprland Wallpaper - #hyprpaper = { - # enable = true; - # settings = { - # preload = [ "/home/me/nixdots/wallpapers/wall.png" ]; - # wallpaper = [ - # "DP-2,/home/me/nixdots/wallpapers/wall.png" - # "HDMI-A-1,/home/me/nixdots/wallpapers/wall.png" - # ]; - # }; - #}; - - # Change monitor positions - # TODO: find a way to make this modular (ie put something different for my laptop) - # my idea is to have a "monitors" module and use kanshi for wayland - kanshi = { - enable = true; - systemdTarget = "hyprland-session.target"; - # You can find your monitors in hyprland by using `hyprctl monitors all` - settings = [ - { # 1920x1080@144 gaming monitor - output.criteria = "HDMI-A-1"; - output.mode = "1920x1080@119.98Hz"; - output.scale = 1.0; - output.adaptiveSync = false; # Variable Refresh Rate (this can be changed for gaming) - } - { # 4k side monitor - output.criteria = "DP-2"; - output.mode = "3840x2160@60.00Hz"; - output.scale = 2.0; - } - - { # This is my default setup - profile.name = "default"; - profile.outputs = [ - { - criteria = "DP-2"; - position = "0,0"; - } - { - criteria = "HDMI-A-1"; - position = "3840,0"; - } - ]; - } - ]; - }; - }; - - - # Nicely reload system units when changing configs - systemd.user.startServices = "sd-switch"; - - home.stateVersion = "24.05"; # don't change this -} diff --git a/homes/me/theme.rasi b/homes/me/theme.rasi old mode 100644 new mode 100755 diff --git a/homes/me/wofi.nix b/homes/me/wofi.nix old mode 100644 new mode 100755 diff --git a/hosts/lolcathost/default.nix b/hosts/lolcathost/default.nix old mode 100644 new mode 100755 index 93ee8e1..1581a81 --- a/hosts/lolcathost/default.nix +++ b/hosts/lolcathost/default.nix @@ -1,32 +1,44 @@ -{ +{ pkgs, inputs, - ... -}: { + ... +}: let + home-manager = builtins.fetchTarball { + url = "https://github.com/nix-community/home-manager/archive/master.tar.gz"; + sha256 = "19w63qccz78v0spx03911z98w1bvlxvd07hb0ma14a4vdzi4ninj"; + }; +in { imports = [ - ./hardware-configuration.nix + ./hardware-configuration.nix + (import "${home-manager}/nixos") + inputs.spicetify-nix.nixosModules.default + ]; + + programs.spicetify = let + spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; + in { + enable = true; + enabledExtensions = with spicePkgs.extensions; [ + adblock + hidePodcasts + shuffle # shuffle+ (special characters are sanitized out of extension names) ]; + #theme = spicePkgs.themes.catppuccin; + #colorScheme = "mocha"; + }; # Use the systemd-boot EFI boot loader. - # TODO: use GRUB2 instead - boot.loader.systemd-boot.enable = true; - boot.loader.efi.canTouchEfiVariables = true; - #boot.loader = { - # efi = { - # canTouchEfiVariables = true; - # efiSysMountPoint = "/boot/efi"; - # }; - # grub = { - # efiSupport = true; - # #efiInstallAsRemovable = true; # in case canTouchEfiVariables doesn't work on this system - # device = "nodev"; - # }; - #}; - - networking.hostName = "myputer"; - # Pick only one of the below networking options. - # networking.wireless.enable = true; # Enables wireless support via wpa_supplicant. - networking.networkmanager.enable = true; # Easiest to use and most distros use this by default. + boot.loader = { + efi = { + canTouchEfiVariables = true; + efiSysMountPoint = "/boot/efi"; + }; + grub = { + efiSupport = true; + #efiInstallAsRemovable = true; # in case canTouchEfiVariables doesn't work on this system + device = "nodev"; + }; + }; # Set your time zone. time.timeZone = "Australia/Brisbane"; @@ -36,33 +48,218 @@ console = { font = "Lat2-Terminus16"; keyMap = "us"; - #useXkbConfig = true; # use xkb.options in tty. }; - # Enable sound. - #services.pipewire = { - # enable = true; - # pulse.enable = true; - #}; + # ----- NETWORKING SECTION ----- + networking.hostName = "lolcathost"; + networking.networkmanager.enable = true; - # Enable touchpad support (enabled default in most desktopManager). - # services.libinput.enable = true; + # Open ports in the firewall. + # networking.firewall.allowedTCPPorts = [ ... ]; + # networking.firewall.allowedUDPPorts = [ ... ]; + # Or disable the firewall altogether. + networking.firewall.enable = true; - # Define a user account. Don't forget to set a password with ‘passwd’. - users.users.emile = { - isNormalUser = true; - extraGroups = [ "wheel" ]; # Enable ‘sudo’ for the user. - packages = with pkgs; [ - #firefox - tree + # ----- SERVICES ----- + services = { + # Set display manager (login screen) + #displayManager = { + # sddm = { + # enable = true; + # #theme = "${import ./sddm-theme.nix { inherit pkgs; }}"; + # wayland.enable = true; # enable experimental sddm support for wayland + # }; + # defaultSession = "hyprland"; + #}; + + # Enable sound + # TODO: use the modules/core/pipewire.nix module instead :) + pipewire = { + enable = true; + pulse.enable = true; + }; + + # Enable touchpad support + libinput.enable = true; + }; + + # allow wheel group to use passwordless sudo + users = { + # using fish as the login shell tends + # to go very poorly because it isn't + # POSIX compliant, so we'll just use + # simple Bash then :) + defaultUserShell = pkgs.bash; + + users = { + # just me fr (personal account) + me = { + isNormalUser = true; + extraGroups = ["wheel"]; + shell = pkgs.bash; #pkgs.fish + packages = with pkgs; [ + firefox + nitch + starfetch + tldr + ]; + }; + + # programming/development account + dev = { + isNormalUser = true; + extraGroups = ["wheel"]; + shell = pkgs.bash; #pkgs.zsh + packages = with pkgs; [ + ]; + }; + + # user for my professional jobs and stuff + ae = { + isNormalUser = true; + extraGroups = ["wheel"]; + shell = pkgs.bash; #pkgs.fish + packages = with pkgs; [ + ]; + }; + }; + }; + + home-manager = { + users.me = import ../../homes/me; + sharedModules = [ + #inputs.nixcord.homeManagerModules.nixcord + #inputs.nixvim.homeManagerModules.nixvim ]; }; - # List packages installed in system profile. To search, run: - # $ nix search wget + # ---- SYSTEM PACKAGES ----- environment.systemPackages = with pkgs; [ - vim + # User Environment + inputs.swww.packages.${pkgs.system}.swww + #vesktop + helvum + easyeffects + ani-cli + wl-clipboard # clipboard for wayland + + python311 # I use 3.11 since it's in a pretty stable state now + poetry # python dependency management and packaging + + # fish plugins + grc # colorise command outputs + + httpie + curlie + zoxide + doggo + + # Pretty necessary + git + brightnessctl + acpi + + # Unix Commands wget + tree + ]; + + # Enable the use of certain programs + programs = { + hyprland = { + enable = true; + # set the flake package + package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland; + # make sure to also set the portal package, so that they are in sync + portalPackage = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland; + + xwayland.enable = true; + #systemd.enable = true; + }; + + zsh.enable = true; + fish.enable = true; + + neovim = { + enable = true; + defaultEditor = true; + viAlias = true; + vimAlias = true; + configure = { + customRC = '' + set number + set tabstop=4 + set shiftwidth=4 + + set mouse=a + ''; + }; + }; + + # I want to use fish as my login shell but it always goes terrible + # cause it isn't POSIX compliant, so instead Bash is my login and + # will just exec fish (^-^) + bash = { + interactiveShellInit = '' + if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]] + then + shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION="" + exec ${pkgs.fish}/bin/fish $LOGIN_OPTION + fi + ''; + }; + }; + + # ----- FONTS ----- + fonts = { + enableDefaultPackages = true; # no clue what this line does tbh + packages = with pkgs; [ + (nerdfonts.override { + fonts = [ + "Cousine" # its already i guess + "Iosevka" # nah nah + "IosevkaTerm" # big nah + "CascadiaCode" # potential + "FiraCode" # potential + "JetBrainsMono" # for my rofi theme + "Hasklig" + "Hack" + ]; + }) + + # texlive maintains a noto-emoji flake + texlivePackages.noto-emoji + ]; + + fontconfig = { + defaultFonts = { + serif = ["Iosevka"]; # TODO: package Iosevka Etoile since Iosevka isn't a serif font + sansSerif = ["Iosevka "]; + monospace = ["Cousine"]; + emoji = ["Noto Emoji"]; + }; + }; + }; + + # ----- STYLIX ----- + + #stylix = { + # enable = true; + # image = pkgs.fetchurl { + # url = "https://www.pixelstalk.net/wp-content/uploads/2016/05/Epic-Anime-Awesome-Wallpapers.jpg"; + # sha256 = "enQo3wqhgf0FEPHj2coOCvo7DuZv+x5rL/WIo4qPI50="; + # }; + # + # # Stylix will automatically theme applications + # #autoEnable = true; + # #image = ../../wallpapers/wall.png; + # #image = "/home/me/nixdots/wallpapers/ghibli-esque-valley.png"; + #}; + + # Enable the new CLI commands and the flakes as experimental features + nix.settings.experimental-features = [ + "nix-command" + "flakes" ]; # Some programs need SUID wrappers, can be configured further or are @@ -73,40 +270,14 @@ # enableSSHSupport = true; # }; - # List services that you want to enable: - # Enable the OpenSSH daemon. # services.openssh.enable = true; - # Open ports in the firewall. - # networking.firewall.allowedTCPPorts = [ ... ]; - # networking.firewall.allowedUDPPorts = [ ... ]; - # Or disable the firewall altogether. - # networking.firewall.enable = false; + # Enable OpenGL + hardware = { + graphics.enable = true; + }; - # Copy the NixOS configuration file and link it from the resulting system - # (/run/current-system/configuration.nix). This is useful in case you - # accidentally delete configuration.nix. - # system.copySystemConfiguration = true; - - # This option defines the first version of NixOS you have installed on this particular machine, - # and is used to maintain compatibility with application data (e.g. databases) created on older NixOS versions. - # - # Most users should NEVER change this value after the initial install, for any reason, - # even if you've upgraded your system to a new NixOS release. - # - # This value does NOT affect the Nixpkgs version your packages and OS are pulled from, - # so changing it will NOT upgrade your system - see https://nixos.org/manual/nixos/stable/#sec-upgrading for how - # to actually do that. - # - # This value being lower than the current NixOS release does NOT mean your system is - # out of date, out of support, or vulnerable. - # - # Do NOT change this value unless you have manually inspected all the changes it would make to your configuration, - # and migrated your data accordingly. - # - # For more information, see `man configuration.nix` or https://nixos.org/manual/nixos/stable/options#opt-system.stateVersion . + # DO NOT MODIFY system.stateVersion = "24.05"; # Did you read the comment? - } - diff --git a/hosts/lolcathost/hardware-configuration.nix b/hosts/lolcathost/hardware-configuration.nix old mode 100644 new mode 100755 index 9892c37..1be6ce5 --- a/hosts/lolcathost/hardware-configuration.nix +++ b/hosts/lolcathost/hardware-configuration.nix @@ -1 +1,40 @@ -# TODO: (i haven't put NixOS on lolcathost yet) +# 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, ... }: + +{ + imports = + [ (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "ahci" "usb_storage" "sd_mod" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-amd" ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = + { device = "/dev/disk/by-uuid/4bf649ce-047b-472d-b392-4c2c326362d9"; + fsType = "ext4"; + }; + + fileSystems."/boot" = + { device = "/dev/disk/by-uuid/D97A-5260"; + fsType = "vfat"; + options = [ "fmask=0077" "dmask=0077" ]; + }; + + swapDevices = + [ { device = "/dev/disk/by-uuid/bfa29193-4f83-46c3-bcb7-0d2b8323b6e0"; } + ]; + + # Enables DHCP on each ethernet and wireless interface. In case of scripted networking + # (the default) this is the recommended approach. When using systemd-networkd it's + # still possible to use this option, but it's recommended to use it in conjunction + # with explicit per-interface declarations with `networking.interfaces..useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.wlp2s0f4u1.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/hosts/myputer/default.nix b/hosts/myputer/default.nix old mode 100644 new mode 100755 index a4e6f6a..a557b9e --- a/hosts/myputer/default.nix +++ b/hosts/myputer/default.nix @@ -96,6 +96,8 @@ in }; }; + # allow wheel group to use passwordless sudo + security.sudo.wheelNeedsPassword = false; users = { # using fish as the login shell tends # to go very poorly because it isn't @@ -137,8 +139,14 @@ in }; }; - home-manager.users.me = import ../../homes/me; - + home-manager = { + users.me = import ../../homes/me; + sharedModules = [ + #inputs.nixcord.homeManagerModules.nixcord + #inputs.nixvim.homeManagerModules.nixvim + ]; + }; + # ---- SYSTEM PACKAGES ----- environment.systemPackages = with pkgs; [ # User Environment @@ -147,17 +155,24 @@ in helvum easyeffects ani-cli - wl-clipboard # clipboard for wayland - python310 # I use 3.10 since it's in a pretty stable state now + python311 # I use 3.11 since it's in a pretty stable state now + poetry # python dependency management and packaging # fish plugins grc # colorise command outputs + httpie + curlie + zoxide + doggo + # Pretty necessary git - + brightnessctl + acpi + # Unix Commands wget tree diff --git a/hosts/myputer/hardware-configuration.nix b/hosts/myputer/hardware-configuration.nix old mode 100644 new mode 100755 diff --git a/hosts/myputer/sddm-theme.nix b/hosts/myputer/sddm-theme.nix old mode 100644 new mode 100755 diff --git a/modules/core/bluetooth.nix b/modules/core/bluetooth.nix old mode 100644 new mode 100755 diff --git a/modules/core/bootloader/grub.nix b/modules/core/bootloader/grub.nix old mode 100644 new mode 100755 diff --git a/modules/core/bootloader/systemd-boot.nix b/modules/core/bootloader/systemd-boot.nix old mode 100644 new mode 100755 diff --git a/modules/core/garbage-collector.nix b/modules/core/garbage-collector.nix old mode 100644 new mode 100755 diff --git a/modules/core/sound/default.nix b/modules/core/sound/default.nix old mode 100644 new mode 100755 diff --git a/modules/core/sound/pipewire.nix b/modules/core/sound/pipewire.nix old mode 100644 new mode 100755 diff --git a/modules/discord/nixcord.nix b/modules/discord/nixcord.nix old mode 100644 new mode 100755 index 6f65281..a347405 --- a/modules/discord/nixcord.nix +++ b/modules/discord/nixcord.nix @@ -9,15 +9,15 @@ { imports = [ - inputs.nixcord.homeManagerModules.nixcord + config.nixcord.homeManagerModules.nixcord ]; programs.nixcord = { enable = true; config = { - themeLinks = [ - "" - ]; + #themeLinks = [ + # "" + #]; # no surrounding window frame frameless = true; diff --git a/modules/hyprland/default.nix b/modules/hyprland/default.nix old mode 100644 new mode 100755 diff --git a/typescript b/typescript deleted file mode 100644 index c149333..0000000 --- a/typescript +++ /dev/null @@ -1,7 +0,0 @@ -Script started on 2024-11-02 18:26:40+10:00 [TERM="rio" TTY="/dev/pts/1" COLUMNS="162" LINES="70"] -You need to install grc! -Welcome weary traveler mmm mm mmm to my shop -[?2004h]0;~/nixdots(B me(B@myputer(B:~/nixdots(B|main⚡*(B?(B -➤ (B e xit exit xit it t  exit   -(B[?2004l]0;exit ~/nixdots(B (B(B[?2004l -Script done on 2024-11-02 18:26:46+10:00 [COMMAND_EXIT_CODE="0"] From c9a95e19d641e962dc6f26ef1c8c91633b69183c Mon Sep 17 00:00:00 2001 From: _cry64 Date: Thu, 7 Nov 2024 17:37:15 +1000 Subject: [PATCH 014/328] added host: lolcathost --- .gitignore | 0 README.md | 6 + flake.lock | 370 +++++++-- flake.nix | 64 +- homes/me/TODO | 31 + homes/me/default.nix | 782 ++++++++++++-------- homes/me/default.nix.bak | 207 ------ homes/me/default.nix.bak13 | 410 ---------- homes/me/theme.rasi | 0 homes/me/wofi.nix | 0 hosts/lolcathost/default.nix | 315 ++++++-- hosts/lolcathost/hardware-configuration.nix | 41 +- hosts/myputer/default.nix | 25 +- hosts/myputer/hardware-configuration.nix | 0 hosts/myputer/sddm-theme.nix | 0 modules/core/bluetooth.nix | 0 modules/core/bootloader/grub.nix | 0 modules/core/bootloader/systemd-boot.nix | 0 modules/core/garbage-collector.nix | 0 modules/core/sound/default.nix | 0 modules/core/sound/pipewire.nix | 0 modules/discord/nixcord.nix | 8 +- modules/hyprland/default.nix | 0 typescript | 7 - 24 files changed, 1176 insertions(+), 1090 deletions(-) mode change 100644 => 100755 .gitignore mode change 100644 => 100755 README.md mode change 100644 => 100755 flake.lock mode change 100644 => 100755 flake.nix create mode 100644 homes/me/TODO mode change 100644 => 100755 homes/me/default.nix delete mode 100644 homes/me/default.nix.bak delete mode 100644 homes/me/default.nix.bak13 mode change 100644 => 100755 homes/me/theme.rasi mode change 100644 => 100755 homes/me/wofi.nix mode change 100644 => 100755 hosts/lolcathost/default.nix mode change 100644 => 100755 hosts/lolcathost/hardware-configuration.nix mode change 100644 => 100755 hosts/myputer/default.nix mode change 100644 => 100755 hosts/myputer/hardware-configuration.nix mode change 100644 => 100755 hosts/myputer/sddm-theme.nix mode change 100644 => 100755 modules/core/bluetooth.nix mode change 100644 => 100755 modules/core/bootloader/grub.nix mode change 100644 => 100755 modules/core/bootloader/systemd-boot.nix mode change 100644 => 100755 modules/core/garbage-collector.nix mode change 100644 => 100755 modules/core/sound/default.nix mode change 100644 => 100755 modules/core/sound/pipewire.nix mode change 100644 => 100755 modules/discord/nixcord.nix mode change 100644 => 100755 modules/hyprland/default.nix delete mode 100644 typescript diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 index 7a3953a..50c9053 --- a/README.md +++ b/README.md @@ -65,6 +65,12 @@ https://www.reddit.com/r/unixporn/comments/vkcasz/i3gaps_i_prefer_light_mode/ If their colour scheme was a little less white I'd love it but overall one of my favourites every +### Wallpaper Sources +1. https://www.wallpaperflare.com/ +2. https://alphacoders.com + specifically: https://alphacoders.com/lofi + + ### Credits 1. https://github.com/XNM1/linux-nixos-hyprland-config-dotfiles The simplicity of their layout is amazing, was really good to pick out small modules and learn how something works / is configured. diff --git a/flake.lock b/flake.lock old mode 100644 new mode 100755 index eb4fc3d..adee7a7 --- a/flake.lock +++ b/flake.lock @@ -33,6 +33,27 @@ "type": "github" } }, + "devshell": { + "inputs": { + "nixpkgs": [ + "nixvim", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1728330715, + "narHash": "sha256-xRJ2nPOXb//u1jaBnDP56M7v5ldavjbtR6lfGqSvcKg=", + "owner": "numtide", + "repo": "devshell", + "rev": "dd6b80932022cea34a019e2bb32f6fa9e494dfef", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, "flake-compat": { "flake": false, "locked": { @@ -64,19 +85,17 @@ } }, "flake-compat_3": { - "flake": false, "locked": { "lastModified": 1696426674, "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", - "owner": "edolstra", - "repo": "flake-compat", "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", - "type": "github" + "revCount": 57, + "type": "tarball", + "url": "https://api.flakehub.com/f/pinned/edolstra/flake-compat/1.0.1/018afb31-abd1-7bff-a5e4-cff7e18efb7a/source.tar.gz" }, "original": { - "owner": "edolstra", - "repo": "flake-compat", - "type": "github" + "type": "tarball", + "url": "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz" } }, "flake-compat_4": { @@ -95,6 +114,91 @@ "type": "github" } }, + "flake-compat_5": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": [ + "nixvim", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1730504689, + "narHash": "sha256-hgmguH29K2fvs9szpq2r3pz2/8cJd2LPS+b4tfNFCwE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "506278e768c2a08bec68eb62932193e341f55c90", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "inputs": { + "systems": "systems_2" + }, + "locked": { + "lastModified": 1726560853, + "narHash": "sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "git-hooks": { + "inputs": { + "flake-compat": [ + "nixvim", + "flake-compat" + ], + "gitignore": "gitignore_2", + "nixpkgs": [ + "nixvim", + "nixpkgs" + ], + "nixpkgs-stable": [ + "nixvim", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1730302582, + "narHash": "sha256-W1MIJpADXQCgosJZT8qBYLRuZls2KSiKdpnTVdKBuvU=", + "owner": "cachix", + "repo": "git-hooks.nix", + "rev": "af8a16fe5c264f5e9e18bcee2859b40a656876cf", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "git-hooks.nix", + "type": "github" + } + }, "gitignore": { "inputs": { "nixpkgs": [ @@ -117,6 +221,28 @@ "type": "github" } }, + "gitignore_2": { + "inputs": { + "nixpkgs": [ + "nixvim", + "git-hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1709087332, + "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, "grub2-themes": { "inputs": { "nixpkgs": "nixpkgs" @@ -142,11 +268,32 @@ ] }, "locked": { - "lastModified": 1729551526, - "narHash": "sha256-7LAGY32Xl14OVQp3y6M43/0AtHYYvV6pdyBcp3eoz0s=", + "lastModified": 1730633670, + "narHash": "sha256-ZFJqIXpvVKvzOVFKWNRDyIyAo+GYdmEPaYi1bZB6uf0=", "owner": "nix-community", "repo": "home-manager", - "rev": "5ec753a1fc4454df9285d8b3ec0809234defb975", + "rev": "8f6ca7855d409aeebe2a582c6fd6b6a8d0bf5661", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "home-manager", + "type": "github" + } + }, + "home-manager_2": { + "inputs": { + "nixpkgs": [ + "nixvim", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1730633670, + "narHash": "sha256-ZFJqIXpvVKvzOVFKWNRDyIyAo+GYdmEPaYi1bZB6uf0=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "8f6ca7855d409aeebe2a582c6fd6b6a8d0bf5661", "type": "github" }, "original": { @@ -198,11 +345,11 @@ "xdph": "xdph" }, "locked": { - "lastModified": 1729657195, - "narHash": "sha256-YGk7oeyyfvZs4d8qAyMBPg2J/euYK48hPiI6PLKEa30=", + "lastModified": 1730800743, + "narHash": "sha256-DmlaerjZowNAc/NCrVHKwvAMBJYPVFx4YLs0Ad2Jo5g=", "owner": "hyprwm", "repo": "Hyprland", - "rev": "6e0aadc585c6d9fdaaebfa5853adbf9610897c82", + "rev": "e3882b23d09aad7f5c3a708536c87b062f3b0d8d", "type": "github" }, "original": { @@ -315,17 +462,66 @@ "type": "github" } }, + "ixx": { + "inputs": { + "flake-utils": [ + "nixvim", + "nuschtosSearch", + "flake-utils" + ], + "nixpkgs": [ + "nixvim", + "nuschtosSearch", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1729544999, + "narHash": "sha256-YcyJLvTmN6uLEBGCvYoMLwsinblXMkoYkNLEO4WnKus=", + "owner": "NuschtOS", + "repo": "ixx", + "rev": "65c207c92befec93e22086da9456d3906a4e999c", + "type": "github" + }, + "original": { + "owner": "NuschtOS", + "ref": "v0.0.5", + "repo": "ixx", + "type": "github" + } + }, + "nix-darwin": { + "inputs": { + "nixpkgs": [ + "nixvim", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1730600078, + "narHash": "sha256-BoyFmE59HDF3uybBySsWVoyjNuHvz3Wv8row/mSb958=", + "owner": "lnl7", + "repo": "nix-darwin", + "rev": "4652874d014b82cb746173ffc64f6a70044daa7e", + "type": "github" + }, + "original": { + "owner": "lnl7", + "repo": "nix-darwin", + "type": "github" + } + }, "nixcord": { "inputs": { "flake-compat": "flake-compat_2", "nixpkgs": "nixpkgs_3" }, "locked": { - "lastModified": 1730107956, - "narHash": "sha256-Ohwk5/RGhGjDXaD4v0Yc40J/79gHRcD92mKWY+6qHJU=", + "lastModified": 1730720546, + "narHash": "sha256-5147A6X0MH6u/YDxLe+Nnva3oxfLQanC716LarG/uoo=", "owner": "kaylorben", "repo": "nixcord", - "rev": "5dcb476b924ad08ffd8521cca812052605cb5974", + "rev": "e3e27c77316f7526b1a846778ae9c759c9377611", "type": "github" }, "original": { @@ -336,11 +532,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1730370246, - "narHash": "sha256-UD2XmS6IWT+G/scUpPItb0dNijT5Dxa7WMuVqRhiaxU=", + "lastModified": 1730808093, + "narHash": "sha256-oOenwoxpzQsBNi7KltgnXqq6e0+CxlfNXKn3k27w6cQ=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "88f31ac8837ab15748102da8bbc6e96a9330be0d", + "rev": "c1a390f74b2c93f69a6805142f11a215a689cec1", "type": "github" }, "original": { @@ -368,11 +564,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1729413321, - "narHash": "sha256-I4tuhRpZFa6Fu6dcH9Dlo5LlH17peT79vx1y1SpeKt0=", + "lastModified": 1730531603, + "narHash": "sha256-Dqg6si5CqIzm87sp57j5nTaeBbWhHFaVyG7V6L8k3lY=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "1997e4aa514312c1af7e2bda7fad1644e778ff26", + "rev": "7ffd9ae656aec493492b44d0ddfb28e79a1ea25d", "type": "github" }, "original": { @@ -384,11 +580,11 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1730170245, - "narHash": "sha256-PRq4vJjDa+m1mNwkV9H7zVzMhuMqsHJrTGx0iJZ0e0w=", + "lastModified": 1730768919, + "narHash": "sha256-8AKquNnnSaJRXZxc5YmF/WfmxiHX6MMZZasRP6RRQkE=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "30c9efeef01e2ad4880bff6a01a61dd99536b3c9", + "rev": "a04d33c0c3f1a59a2c1cb0c6e34cd24500e5a1dc", "type": "github" }, "original": { @@ -400,11 +596,11 @@ }, "nixpkgs_4": { "locked": { - "lastModified": 1729413321, - "narHash": "sha256-I4tuhRpZFa6Fu6dcH9Dlo5LlH17peT79vx1y1SpeKt0=", + "lastModified": 1730531603, + "narHash": "sha256-Dqg6si5CqIzm87sp57j5nTaeBbWhHFaVyG7V6L8k3lY=", "owner": "nixos", "repo": "nixpkgs", - "rev": "1997e4aa514312c1af7e2bda7fad1644e778ff26", + "rev": "7ffd9ae656aec493492b44d0ddfb28e79a1ea25d", "type": "github" }, "original": { @@ -416,11 +612,11 @@ }, "nixpkgs_5": { "locked": { - "lastModified": 1727634051, - "narHash": "sha256-S5kVU7U82LfpEukbn/ihcyNt2+EvG7Z5unsKW9H/yFA=", + "lastModified": 1730200266, + "narHash": "sha256-l253w0XMT8nWHGXuXqyiIC/bMvh1VRszGXgdpQlfhvU=", "owner": "nixos", "repo": "nixpkgs", - "rev": "06cf0e1da4208d3766d898b7fdab6513366d45b9", + "rev": "807e9154dcb16384b1b765ebe9cd2bba2ac287fd", "type": "github" }, "original": { @@ -430,6 +626,57 @@ "type": "github" } }, + "nixvim": { + "inputs": { + "devshell": "devshell", + "flake-compat": "flake-compat_3", + "flake-parts": "flake-parts", + "git-hooks": "git-hooks", + "home-manager": "home-manager_2", + "nix-darwin": "nix-darwin", + "nixpkgs": [ + "nixpkgs" + ], + "nuschtosSearch": "nuschtosSearch", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1730792264, + "narHash": "sha256-Ue3iywjyaNOxXgw7esVSBX3bZzM2bSPubZamYsBKIG8=", + "owner": "nix-community", + "repo": "nixvim", + "rev": "3d24cb72618738130e6af9c644c81fe42aa34ebc", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixvim", + "type": "github" + } + }, + "nuschtosSearch": { + "inputs": { + "flake-utils": "flake-utils", + "ixx": "ixx", + "nixpkgs": [ + "nixvim", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1730515563, + "narHash": "sha256-8lklUZRV7nwkPLF3roxzi4C2oyLydDXyAzAnDvjkOms=", + "owner": "NuschtOS", + "repo": "search", + "rev": "9e22bd742480916ff5d0ab20ca2522eaa3fa061e", + "type": "github" + }, + "original": { + "owner": "NuschtOS", + "repo": "search", + "type": "github" + } + }, "pre-commit-hooks": { "inputs": { "flake-compat": "flake-compat", @@ -461,23 +708,24 @@ "hyprland": "hyprland", "nixcord": "nixcord", "nixpkgs": "nixpkgs_4", + "nixvim": "nixvim", "spicetify-nix": "spicetify-nix", "swww": "swww" } }, "spicetify-nix": { "inputs": { - "flake-compat": "flake-compat_3", + "flake-compat": "flake-compat_4", "nixpkgs": [ "nixpkgs" ] }, "locked": { - "lastModified": 1730261837, - "narHash": "sha256-syeN2dLFxJ9bhsG1YnwWpwMgCttBY1S60KUrqLIrmMo=", + "lastModified": 1730780158, + "narHash": "sha256-ZJkCFn4PL49rINz7xrjlBqw9nF8wWJE7fSVqbHlCWSA=", "owner": "Gerg-L", "repo": "spicetify-nix", - "rev": "1c482c8baffd494119b7f61735d35c62a0a22244", + "rev": "2791c6662002731d3dfc00312307aef547e1c8be", "type": "github" }, "original": { @@ -488,16 +736,16 @@ }, "swww": { "inputs": { - "flake-compat": "flake-compat_4", + "flake-compat": "flake-compat_5", "nixpkgs": "nixpkgs_5", "utils": "utils" }, "locked": { - "lastModified": 1730050836, - "narHash": "sha256-6xCp6rTJ5MWxfUXUYxWRZz1CA5V9/gGqgb0+34BMF6U=", + "lastModified": 1730424990, + "narHash": "sha256-+8YUJsNzvgAeZYLfbHYfYlad/iS+6Eec/LWzL1ZIGfY=", "owner": "LGFae", "repo": "swww", - "rev": "36808dfd90223e648fcc45075ca57392b3d6a297", + "rev": "0db3f4eb192f1c9bf914efcc1d2aba809da5d78a", "type": "github" }, "original": { @@ -536,9 +784,45 @@ "type": "github" } }, + "systems_3": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "nixvim", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1730321837, + "narHash": "sha256-vK+a09qq19QNu2MlLcvN4qcRctJbqWkX7ahgPZ/+maI=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "746901bb8dba96d154b66492a29f5db0693dbfcc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, "utils": { "inputs": { - "systems": "systems_2" + "systems": "systems_3" }, "locked": { "lastModified": 1726560853, @@ -582,11 +866,11 @@ ] }, "locked": { - "lastModified": 1728166987, - "narHash": "sha256-w6dVTguAn9zJ+7aPOhBQgDz8bn6YZ7b56cY8Kg5HJRI=", + "lastModified": 1730743262, + "narHash": "sha256-iTLqj3lU8kFehPm5tXpctzkD274t/k1nwSSq3qCWXeg=", "owner": "hyprwm", "repo": "xdg-desktop-portal-hyprland", - "rev": "fb9c8d665af0588bb087f97d0f673ddf0d501787", + "rev": "09b23cef06fe248e61cec8862c04b9bcb62f4b6d", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix old mode 100644 new mode 100755 index 3f56093..da2e087 --- a/flake.nix +++ b/flake.nix @@ -3,42 +3,38 @@ inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; - + home-manager = { url = "github:nix-community/home-manager"; inputs.nixpkgs.follows = "nixpkgs"; }; - spicetify-nix = { + spicetify-nix = { url = "github:Gerg-L/spicetify-nix"; inputs.nixpkgs.follows = "nixpkgs"; }; - - #stylix.url = "github:danth/stylix"; - nixcord = { - url = "github:kaylorben/nixcord"; - }; + #stylix.url = "github:danth/stylix"; - grub2-themes = { - url = "github:vinceliuice/grub2-themes"; - }; + nixcord = { url = "github:kaylorben/nixcord"; }; - # is this necessary? (aren't I enabling it in `configuration.nix` anyways?) + nixvim = { + url = "github:nix-community/nixvim"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + grub2-themes = { url = "github:vinceliuice/grub2-themes"; }; + + # is this necessary? (aren't I enabling it in `configuration.nix` anyways?) hyprland.url = "github:hyprwm/Hyprland"; - swww.url = "github:LGFae/swww"; + swww.url = "github:LGFae/swww"; }; - outputs = { - self, - nixpkgs, - home-manager, - hyprland, - grub2-themes, - #stylix, - ... - }@inputs: + outputs = { self, nixpkgs, home-manager, hyprland, grub2-themes, nixvim + , nixcord, + #stylix, + ... }@inputs: let system = "x86_64-linux"; @@ -54,38 +50,32 @@ nixosConfigurations = { # i be on my puter fr myputer = nixpkgs.lib.nixosSystem { - # nix passes these to every single module above - specialArgs = { - inherit inputs pkgs; - }; + # nix passes these to every single module above + specialArgs = { inherit inputs pkgs; }; modules = [ ./hosts/myputer - grub2-themes.nixosModules.default - #stylix.nixosModules.stylix + grub2-themes.nixosModules.default + #stylix.nixosModules.stylix ]; }; # my laptop 0w0 lolcathost = nixpkgs.lib.nixosSystem { - specialArgs = { - inherit inputs; - }; + specialArgs = { inherit inputs pkgs; }; - modules = [ - ./hosts/lolcathost - ]; + modules = [ ./hosts/lolcathost ]; }; }; homeConfigurations = { me = home-manager.lib.homeManagerConfiguration { - specialArgs = { - inherit inputs; - }; + specialArgs = { inherit inputs; }; - modules = [ + modules = [ ./home/me + #nixcord.homeManagerModules.nixcord + #nixvim.homeManagerModules.nixvim ]; }; }; diff --git a/homes/me/TODO b/homes/me/TODO new file mode 100644 index 0000000..c4bfdc8 --- /dev/null +++ b/homes/me/TODO @@ -0,0 +1,31 @@ +Get Utilities: +1. httpie +2. curlie +3. zoxide +4. doggo + +1. Get helix editor +2. Custom helix +3. Complete helix tutorial + + + +Get waybar (or another bar) working + + +Get a better wallpaper + +Get a GRUB theme working + +Fix: your 131072x1 screen size is bogus. expect trouble + + +Push nixdots to github + + + +Have helix editor look differently depending on language + (specifically don't show indent indicators when editing nix files + + +Learn to package my own home-manager modules diff --git a/homes/me/default.nix b/homes/me/default.nix old mode 100644 new mode 100755 index 806471c..dfeeb2e --- a/homes/me/default.nix +++ b/homes/me/default.nix @@ -5,17 +5,16 @@ config, pkgs, ... -}: - -{ +}: { nixpkgs = { config.allowUnfree = true; }; imports = [ - # inputs.nixcord.homeManagerModules.nixcord + #inputs.nixcord.homeManagerModules.nixcord # inputs.spicetify-nix.homeManagerModules.default # ./wofi.nix + #../../modules/discord/nixcord.nix ]; /* @@ -36,7 +35,7 @@ */ # ----- STYLIX ----- - + #stylix = { # enable = true; # @@ -44,7 +43,7 @@ # url = "https://www.pixelstalk.net/wp-content/uploads/2016/05/Epic-Anime-Awesome-Wallpapers.jpg"; # sha256 = "enQo3wqhgf0FEPHj2coOCvo7DuZv+x5rL/WIo4qPI50="; # }; - # + # # # Stylix will automatically theme applications # autoEnable = true; # targets = { @@ -56,332 +55,489 @@ home = { username = "me"; - homeDirectory = "/home/me"; + homeDirectory = "/home/me"; + + pointerCursor = { + gtk.enable = true; + # x11.enable = true # dont enable since im on hyprland + package = pkgs.bibata-cursors; + name = "Bibata-Modern-Ice"; + size = 16; + }; }; programs = { # these are both required for home-manager to work home-manager.enable = true; - - git = { - enable = true; - userName = "emileclarkb"; - userEmail = "eclarkboman@gmail.com"; - }; + + git = { + enable = true; + userName = "Emile Clark-Boman"; + userEmail = "eclarkboman@gmail.com"; + }; # like `/bin/cat` but with syntax highlighting - # TODO: change the pager (maybe use Github:sachaos/viddy instead) - bat = { - enable = true; + # TODO: change the pager (maybe use Github:sachaos/viddy instead) + bat = { + enable = true; config = { - pager = "less -FR"; - # let Stylix control the theme - #theme = "Dracula"; - }; - }; + pager = "less -FR"; + # let Stylix control the theme + #theme = "Dracula"; + }; + }; - firefox = { - enable = true; + #nixvim = { + # enable = true; + # # TODO: allow clipboard to be configurable based on system clipboard + # colorschemes.dracula.enable = true; + # plugins = { + # lualine.enable = true; + # treesitter.enable = true; + # }; + + # opts = { + # number = true; + # tabstop = 4; + # softtabstop = 4; + # shiftwidth = 4; + # }; + + # clipboard.providers.wl-copy.enable = true; + #}; + + # read https://docs.helix-editor.com/editor.html + helix = { + enable = true; + settings = { + theme = "dracula"; + editor = { + line-number = "absolute"; + popup-border = "all"; + scroll-lines = 3; + color-modes = true; # colour the mode indicator depending on mode + shell = ["zsh" "-c"]; + + auto-format = true; + auto-completion = true; # enable popup for autocomplete + completion-timeout = 250; # time before completions display + preview-completion-insert = true; + completion-trigger-len = 2; # min word length to trigger completions + completion-replace = true; # completions replace entire word + + indent-heuristic = "tree-sitter"; # how indentation is computed + middle-click-paste = true; + insert-final-newline = true; # append newline to file on write + + gutters = [ + "diagnostics" + "spacer" + "line-numbers" + "spacer" + "diff" + ]; + + whitespace = { + render = { + space = "none"; # "all" + tab = "none"; #"all" + nbsp = "none"; + nnbsp = "none"; + newline = "none"; + }; + characters = { + space = "·"; + nbsp = "⍽"; + nnbsp = "␣"; + tab = "→"; + newline = "⤶"; + tabpad = "·"; # Tabs will look like "→···" (depending on tab width) + }; + }; + + indent-guides = { + render = true; + character = "▏"; # "|" + skip-levels = 1; + }; + + lsp = { + enable = true; + auto-signature-help = true; # hints for function parameters + display-inlay-hints = true; # inline hints + snippets = true; + }; + + cursor-shape = { + normal = "block"; + insert = "bar"; + select = "block"; + }; + + file-picker = { + hidden = true; # show hidden files + follow-symlinks = true; + deduplicate-links = true; + git-ignore = false; # dont read .gitignore files + ignore = true; # use .ignore for helix instead of .gitignore + }; + + statusline = { + left = [ + "mode" + "version-control" + "spinner" + ]; + center = [ + "file-name" + "read-only-indicator" + "file-modification-indicator" + ]; + right = [ + "position" + "total-line-numbers" + "separator" + "file-encoding" + "file-line-ending" + "separator" + "file-type" + ]; + separator = "|"; + mode.normal = "NORMAL"; + mode.insert = "INSERT"; + mode.select = "SELECT"; + }; + }; + }; + + languages.language = [ + { + name = "nix"; + indent = { + tab-width = 2; + unit = " "; + }; + block-comment-tokens = { + start = "/*"; + end = "*/"; + }; + auto-format = true; + formatter.command = "${pkgs.alejandra}/bin/alejandra"; + } + { + name = "python"; + indent = { + tab-width = 4; + unit = " "; + }; + auto-format = false; # my python is beautiful ^_^ + rulers = [80]; + } + ]; + }; + + #nixcord.enable = true; + + firefox = { + enable = true; policies = { - #BlockAboutConfig = true; - DefaultDownloadDirectory = "\${home}/downloads"; - }; - }; + #BlockAboutConfig = true; + DefaultDownloadDirectory = "\${home}/downloads"; + }; + }; # I want to use fish as my login shell but it always - # goes terrible cause it isn't POSIX compliant, so - # instead Bash is my login and it will just exec fish - #bash = { - # interactiveShellInit = '' - # if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]] + # goes terrible cause it isn't POSIX compliant, so + # instead Bash is my login and it will just exec fish + #bash = { + # interactiveShellInit = '' + # if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]] # then # shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION="" # exec ${pkgs.fish}/bin/fish $LOGIN_OPTION - # fi - # ''; - #}; + # fi + # ''; + #}; - fish = { - enable = true; - interactiveShellInit = '' + fish = { + enable = true; + interactiveShellInit = '' set -g fish_greeting "Welcome weary traveler to my shop" - ''; - plugins = [ - { - name = "grc"; - src = pkgs.fishPlugins.grc.src; - } - ]; - }; + ''; + plugins = [ + { + name = "grc"; + src = pkgs.fishPlugins.grc.src; + } + ]; + }; - /* - spicetify = - let - spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; - in - { - enable = true; - enabledExtensions = with spicePkgs.extensions; [ - adblock - hidePodcasts - #shuffle - ]; - theme = spicePkgs.themes.catppuccin; - colorScheme = "mocha"; - }; - */ + /* + spicetify = + let + spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; + in + { + enable = true; + enabledExtensions = with spicePkgs.extensions; [ + adblock + hidePodcasts + #shuffle + ]; + theme = spicePkgs.themes.catppuccin; + colorScheme = "mocha"; + }; + */ # The terminal I use - # TODO: this is dependent on nvim being installed - # TODO: make this into a module with a configurable editor option - rio = { - enable = true; - # Rio Config Docs: https://raphamorim.io/rio/docs/config - settings = { - theme = "dracula"; - hide-mouse-cursor-when-typing = true; + # TODO: this is dependent on nvim being installed + # TODO: make this into a module with a configurable editor option + rio = { + enable = true; + # Rio Config Docs: https://raphamorim.io/rio/docs/config + settings = { + theme = "dracula"; + hide-mouse-cursor-when-typing = true; - use-fork = true; # fork (dont spawn) Rio + use-fork = true; # fork (dont spawn) Rio padding-x = 10; - padding-y = [ 15 10 ]; # top, left + padding-y = [15 10]; # top, left - # lines = (accumulated scroll * multiplier / divider) + # lines = (accumulated scroll * multiplier / divider) scroll = { - multiplier = 3.0; - divider = 1.0; - }; + multiplier = 3.0; + divider = 1.0; + }; - fonts = { - size = 15; - features = []; + fonts = { + size = 15; + features = []; - regular = { - family = "FiraCode Nerd Font"; # "IosevkaTerm Nerd Font" - style = "Normal"; - weight = 400; - }; - - bold = { - family = "FiraCode Nerd Font"; - style = "Normal"; - weight = 800; - }; - - italic = { - family = "FiraCode Nerd Font"; - style = "Italic"; - weight = 400; - }; - - bold-italic = { - family = "FiraCode Nerd Font"; - style = "Italic"; - weight = 800; - }; - }; + regular = { + family = "JetBrainsMono Nerd Font"; # FiraCode + style = "Normal"; + weight = 400; + }; - # Run when the `OpenConfigEditor` keybinding is triggered - editor = { - program = "nvim"; - args = []; - }; + bold = { + family = "JetBrainsMono Nerd Font"; + style = "Normal"; + weight = 800; + }; - renderer = { - performance = "High"; - backend = "Automatic"; # Vulkan - }; - }; - }; + italic = { + family = "JetBrainsMono Nerd Font"; + style = "Italic"; + weight = 400; + }; + + bold-italic = { + family = "JetBrainsMono Nerd Font"; + style = "Italic"; + weight = 800; + }; + }; + + # Run when the `OpenConfigEditor` keybinding is triggered + editor = { + program = "nvim"; + args = []; + }; + + renderer = { + performance = "High"; + backend = "Automatic"; # Vulkan + }; + }; + }; wofi = { - enable = true; - settings = { - location = "center"; - allow_markup = true; - width = 250; - }; - # Force the style to stop Stylix being a bitch and overwriting it - style = lib.mkForce '' - @define-color rosewater #f2d5cf; - @define-color rosewater-rgb rgb(242, 213, 207); - @define-color flamingo #eebebe; - @define-color flamingo-rgb rgb(238, 190, 190); - @define-color pink #f4b8e4; - @define-color pink-rgb rgb(244, 184, 228); - @define-color mauve #ca9ee6; - @define-color mauve-rgb rgb(202, 158, 230); - @define-color red #e78284; - @define-color red-rgb rgb(231, 130, 132); - @define-color maroon #ea999c; - @define-color maroon-rgb rgb(234, 153, 156); - @define-color peach #ef9f76; - @define-color peach-rgb rgb(239, 159, 118); - @define-color yellow #e5c890; - @define-color yellow-rgb rgb(229, 200, 144); - @define-color green #a6d189; - @define-color green-rgb rgb(166, 209, 137); - @define-color teal #81c8be; - @define-color teal-rgb rgb(129, 200, 190); - @define-color sky #99d1db; - @define-color sky-rgb rgb(153, 209, 219); - @define-color sapphire #85c1dc; - @define-color sapphire-rgb rgb(133, 193, 220); - @define-color blue #8caaee; - @define-color blue-rgb rgb(140, 170, 238); - @define-color lavender #babbf1; - @define-color lavender-rgb rgb(186, 187, 241); - @define-color text #c6d0f5; - @define-color text-rgb rgb(198, 208, 245); - @define-color subtext1 #b5bfe2; - @define-color subtext1-rgb rgb(181, 191, 226); - @define-color subtext0 #a5adce; - @define-color subtext0-rgb rgb(165, 173, 206); - @define-color overlay2 #949cbb; - @define-color overlay2-rgb rgb(148, 156, 187); - @define-color overlay1 #838ba7; - @define-color overlay1-rgb rgb(131, 139, 167); - @define-color overlay0 #737994; - @define-color overlay0-rgb rgb(115, 121, 148); - @define-color surface2 #626880; - @define-color surface2-rgb rgb(98, 104, 128); - @define-color surface1 #51576d; - @define-color surface1-rgb rgb(81, 87, 109); - @define-color surface0 #414559; - @define-color surface0-rgb rgb(65, 69, 89); - @define-color base #303446; - @define-color base-rgb rgb(48, 52, 70); - @define-color mantle #292c3c; - @define-color mantle-rgb rgb(41, 44, 60); - @define-color crust #232634; - @define-color crust-rgb rgb(35, 38, 52); + enable = true; + settings = { + location = "center"; + allow_markup = true; + width = 250; + }; + # Force the style to stop Stylix being a bitch and overwriting it + style = lib.mkForce '' + @define-color rosewater #f2d5cf; + @define-color rosewater-rgb rgb(242, 213, 207); + @define-color flamingo #eebebe; + @define-color flamingo-rgb rgb(238, 190, 190); + @define-color pink #f4b8e4; + @define-color pink-rgb rgb(244, 184, 228); + @define-color mauve #ca9ee6; + @define-color mauve-rgb rgb(202, 158, 230); + @define-color red #e78284; + @define-color red-rgb rgb(231, 130, 132); + @define-color maroon #ea999c; + @define-color maroon-rgb rgb(234, 153, 156); + @define-color peach #ef9f76; + @define-color peach-rgb rgb(239, 159, 118); + @define-color yellow #e5c890; + @define-color yellow-rgb rgb(229, 200, 144); + @define-color green #a6d189; + @define-color green-rgb rgb(166, 209, 137); + @define-color teal #81c8be; + @define-color teal-rgb rgb(129, 200, 190); + @define-color sky #99d1db; + @define-color sky-rgb rgb(153, 209, 219); + @define-color sapphire #85c1dc; + @define-color sapphire-rgb rgb(133, 193, 220); + @define-color blue #8caaee; + @define-color blue-rgb rgb(140, 170, 238); + @define-color lavender #babbf1; + @define-color lavender-rgb rgb(186, 187, 241); + @define-color text #c6d0f5; + @define-color text-rgb rgb(198, 208, 245); + @define-color subtext1 #b5bfe2; + @define-color subtext1-rgb rgb(181, 191, 226); + @define-color subtext0 #a5adce; + @define-color subtext0-rgb rgb(165, 173, 206); + @define-color overlay2 #949cbb; + @define-color overlay2-rgb rgb(148, 156, 187); + @define-color overlay1 #838ba7; + @define-color overlay1-rgb rgb(131, 139, 167); + @define-color overlay0 #737994; + @define-color overlay0-rgb rgb(115, 121, 148); + @define-color surface2 #626880; + @define-color surface2-rgb rgb(98, 104, 128); + @define-color surface1 #51576d; + @define-color surface1-rgb rgb(81, 87, 109); + @define-color surface0 #414559; + @define-color surface0-rgb rgb(65, 69, 89); + @define-color base #303446; + @define-color base-rgb rgb(48, 52, 70); + @define-color mantle #292c3c; + @define-color mantle-rgb rgb(41, 44, 60); + @define-color crust #232634; + @define-color crust-rgb rgb(35, 38, 52); - * { - font-family: 'FiraCode Nerd Font'; - font-size: 16px; - } + * { + font-family: 'FiraCode Nerd Font'; + font-size: 16px; + } - /* Window */ - window { - margin: 0px; - padding: 10px; - border: 0.16em solid @teal; - border-radius: 0.5em; - background-color: @base; - animation: slideIn 0.25s ease-in-out both; - } + /* Window */ + window { + margin: 0px; + padding: 10px; + border: 0.16em solid @teal; + border-radius: 0.5em; + background-color: @base; + animation: slideIn 0.25s ease-in-out both; + } - /* Slide In */ - @keyframes slideIn { - 0% { - opacity: 0; - } + /* Slide In */ + @keyframes slideIn { + 0% { + opacity: 0; + } - 100% { - opacity: 1; - } - } + 100% { + opacity: 1; + } + } - /* Inner Box */ - #inner-box { - margin: 5px; - padding: 10px; - border: none; - background-color: @base; - /*animation: fadeIn 0.5s ease-in-out both;*/ - } + /* Inner Box */ + #inner-box { + margin: 5px; + padding: 10px; + border: none; + background-color: @base; + /*animation: fadeIn 0.5s ease-in-out both;*/ + } - /* Fade In */ - @keyframes fadeIn { - 0% { - opacity: 0; - } + /* Fade In */ + @keyframes fadeIn { + 0% { + opacity: 0; + } - 100% { - opacity: 1; - } - } + 100% { + opacity: 1; + } + } - /* Outer Box */ - #outer-box { - margin: 5px; - padding: 10px; - border: none; - background-color: @base; - } + /* Outer Box */ + #outer-box { + margin: 5px; + padding: 10px; + border: none; + background-color: @base; + } - /* Scroll */ - #scroll { - margin: 0px; - padding: 10px; - border: none; - background-color: @base; - } + /* Scroll */ + #scroll { + margin: 0px; + padding: 10px; + border: none; + background-color: @base; + } - /* Input */ - #input { - margin: 5px 20px; - padding: 10px; - border: none; - border-radius: 0.25em; - color: @text; - background-color: @base; - animation: fadeIn 0.25s ease-in-out both; - } + /* Input */ + #input { + margin: 5px 20px; + padding: 10px; + border: none; + border-radius: 0.25em; + color: @text; + background-color: @base; + animation: fadeIn 0.25s ease-in-out both; + } - #input image { - border: none; - color: @red; - } + #input image { + border: none; + color: @red; + } - #input * { - outline: 4px solid @red!important; - } + #input * { + outline: 4px solid @red!important; + } - /* Text */ - #text { - margin: 5px; - border: none; - color: @text; - animation: fadeIn 0.5s ease-in-out both; - } + /* Text */ + #text { + margin: 5px; + border: none; + color: @text; + animation: fadeIn 0.5s ease-in-out both; + } - #entry { - background-color: @base; - } + #entry { + background-color: @base; + } - #entry arrow { - border: none; - color: @teal; - } + #entry arrow { + border: none; + color: @teal; + } - /* Selected Entry */ - #entry:selected { - border: 0.10em solid @teal; - border-radius: 0.25em; - } + /* Selected Entry */ + #entry:selected { + border: 0.10em solid @teal; + border-radius: 0.25em; + } - #entry:selected #text { - color: @teal; - } + #entry:selected #text { + color: @teal; + } - #entry:drop(active) { - background-color: @lavender!important; - } - ''; - }; + #entry:drop(active) { + background-color: @lavender!important; + } + ''; + }; - rofi = { - enable = true; - package = pkgs.rofi-wayland; - font = "JetBrains Mono Nerd Font 10"; - location = "center"; - terminal = "${pkgs.rio}/bin/rio"; - }; - + rofi = { + enable = true; + package = pkgs.rofi-wayland; + font = "JetBrains Mono Nerd Font 10"; + location = "center"; + terminal = "${pkgs.rio}/bin/rio"; + }; }; - # ----- SERVICES ----- services = { # Change monitor positions @@ -392,36 +548,54 @@ systemdTarget = "hyprland-session.target"; # You can find your monitors in hyprland by using `hyprctl monitors all` settings = [ - { # 1920x1080@144 gaming monitor - output.criteria = "HDMI-A-1"; - output.mode = "1920x1080@119.98Hz"; - output.scale = 1.0; - output.adaptiveSync = false; # Variable Refresh Rate (this can be changed for gaming) - } - { # 4k side monitor - output.criteria = "DP-2"; - output.mode = "3840x2160@60.00Hz"; - output.scale = 2.0; - } + { + # 1920x1080@144 gaming monitor + output.criteria = "HDMI-A-1"; + output.mode = "1920x1080@119.98Hz"; + output.scale = 1.0; + output.adaptiveSync = false; # Variable Refresh Rate (this can be changed for gaming) + } + { + # 4k side monitor + output.criteria = "DP-2"; + output.mode = "3840x2160@60.00Hz"; + output.scale = 2.0; + } + { + # laptop builtin screen + output.criteria = "eDP-1"; + output.mode = "1920x1080@60.02Hz"; + output.scale = 1.0; + } - { # This is my default setup - profile.name = "default"; + { + # This is my dual-monitor desktop setup + profile.name = "myputer"; profile.outputs = [ - { - criteria = "DP-2"; - position = "0,0"; - } - { - criteria = "HDMI-A-1"; - position = "3840,0"; - } - ]; - } + { + criteria = "DP-2"; + position = "0,0"; + } + { + criteria = "HDMI-A-1"; + position = "3840,0"; + } + ]; + } + { + # This is my laptop (lolcathost) :) + profile.name = "lolcathost"; + profile.outputs = [ + { + criteria = "eDP-1"; + position = "0,0"; + } + ]; + } ]; }; }; - # Nicely reload system units when changing configs systemd.user.startServices = "sd-switch"; diff --git a/homes/me/default.nix.bak b/homes/me/default.nix.bak deleted file mode 100644 index 3573995..0000000 --- a/homes/me/default.nix.bak +++ /dev/null @@ -1,207 +0,0 @@ -{ - inputs, - outputs, - lib, - config, - pkgs, - ... -}: - -{ - nixpkgs = { - config.allowUnfree = true; - }; - - imports = [ - # inputs.spicetify-nix.homeManagerModules.default - #./wofi.nix - ]; - - /* - programs.spicetify = - let - spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; - in - { - enable = true; - enabledExtensions = with spicePkgs.extensions; [ - adblock - hidePodcasts - shuffle # shuffle+ (special characters are sanitized out of extension names) - ]; - theme = spicePkgs.themes.catppuccin; - colorScheme = "mocha"; - }; - */ - - #wayland.windowManager.hyprland.enable = true; - - home = { - username = "me"; - homeDirectory = "/home/me"; - }; - - programs = { - # these are both required for home-manager to work - home-manager.enable = true; - git.enable = true; - - # like `/bin/cat` but with syntax highlighting - # TODO: change the pager (maybe use Github:sachaos/viddy instead) - bat = { - enable = true; - config = { - pager = "less -FR"; - #theme = "Dracula"; - }; - }; - - /* - spicetify = - let - spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; - in - { - enable = true; - enabledExtensions = with spicePkgs.extensions; [ - adblock - hidePodcasts - #shuffle - ]; - theme = spicePkgs.themes.catppuccin; - colorScheme = "mocha"; - }; - */ - - # The terminal I use - # TODO: this is dependent on nvim being installed - # TODO: make this into a module with a configurable editor option - rio = { - enable = true; - # Rio Config Docs: https://raphamorim.io/rio/docs/config - settings = { - theme = "dracula"; - hide-mouse-cursor-when-typing = true; - - use-fork = true; # fork (dont spawn) Rio - - padding-x = 10; - padding-y = [ 15 10 ]; # top, left - - # lines = (accumulated scroll * multiplier / divider) - scroll = { - multiplier = 1.0; - divider = 1.0; - }; - - fonts = { - size = 15; - features = []; - - regular = { - family = "FiraCode Nerd Font"; # "IosevkaTerm Nerd Font" - style = "Normal"; - weight = 400; - }; - - bold = { - family = "FiraCode Nerd Font"; - style = "Normal"; - weight = 800; - }; - - italic = { - family = "FiraCode Nerd Font"; - style = "Italic"; - weight = 400; - }; - - bold-italic = { - family = "FiraCode Nerd Font"; - style = "Italic"; - weight = 800; - }; - }; - - # Run when the `OpenConfigEditor` keybinding is triggered - editor = { - program = "nvim"; - args = []; - }; - - renderer = { - performance = "High"; - backend = "Automatic"; # Vulkan - }; - }; - }; - - wofi = { - enable = true; - settings = { - location = "center"; - allow_markup = true; - width = 250; - }; - }; - }; - - # ----- SERVICES ----- - services = { - # Hyprland Wallpaper - #hyprpaper = { - # enable = true; - # settings = { - # preload = [ "~/nixdots/wallpapers/ghibli-esque-valley.png" ]; - # wallpaper = [ - # "DP-2,~/nixdots/wallpapers/ghibli-esque-valley.png" - # "HDMI-A-1,~/nixdots/wallpapers/ghibli-esque-valley.png" - # ]; - # }; - #}; - - hyprpaper.enable = true; # so stylix can see it - - # Change monitor positions - # TODO: find a way to make this modular (ie put something different for my laptop) - # my idea is to have a "monitors" module and use kanshi for wayland - kanshi = { - enable = true; - systemdTarget = "hyprland-session.target"; - # You can find your monitors in hyprland by using `hyprctl monitors all` - settings = [ - { # 1920x1080@144 gaming monitor - output.criteria = "HDMI-A-1"; - output.mode = "1920x1080@119.98Hz"; - output.scale = 1.0; - output.adaptiveSync = false; # Variable Refresh Rate (this can be changed for gaming) - } - { # 4k side monitor - output.criteria = "DP-2"; - output.mode = "3840x2160@60.00Hz"; - output.scale = 2.0; - } - - { # This is my default setup - profile.name = "default"; - profile.outputs = [ - { - criteria = "DP-2"; - position = "0,0"; - } - { - criteria = "HDMI-A-1"; - position = "3840,0"; - } - ]; - } - ]; - }; - }; - - - # Nicely reload system units when changing configs - systemd.user.startServices = "sd-switch"; - - home.stateVersion = "24.05"; # don't change this -} diff --git a/homes/me/default.nix.bak13 b/homes/me/default.nix.bak13 deleted file mode 100644 index f5b3589..0000000 --- a/homes/me/default.nix.bak13 +++ /dev/null @@ -1,410 +0,0 @@ -{ - inputs, - outputs, - lib, - config, - pkgs, - ... -}: - -{ - nixpkgs = { - config.allowUnfree = true; - }; - - imports = [ - #inputs.nixcord.homeManagerModules.nixcord - # inputs.spicetify-nix.homeManagerModules.default - #./wofi.nix - ]; - - /* - programs.spicetify = - let - spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; - in - { - enable = true; - enabledExtensions = with spicePkgs.extensions; [ - adblock - hidePodcasts - shuffle # shuffle+ (special characters are sanitized out of extension names) - ]; - theme = spicePkgs.themes.catppuccin; - colorScheme = "mocha"; - }; - */ - - # ----- STYLIX ----- - - #stylix = { - # enable = true; - # - # image = pkgs.fetchurl { - # url = "https://www.pixelstalk.net/wp-content/uploads/2016/05/Epic-Anime-Awesome-Wallpapers.jpg"; - # sha256 = "enQo3wqhgf0FEPHj2coOCvo7DuZv+x5rL/WIo4qPI50="; - # }; - # - # # Stylix will automatically theme applications - # autoEnable = true; - # targets = { - # # disable Stylix's themes for ones I will theme manually - # firefox.enable = false; - # wofi.enable = false; - # }; - #}; - - home = { - username = "me"; - homeDirectory = "/home/me"; - }; - - programs = { - # these are both required for home-manager to work - home-manager.enable = true; - git.enable = true; - - # like `/bin/cat` but with syntax highlighting - # TODO: change the pager (maybe use Github:sachaos/viddy instead) - bat = { - enable = true; - config = { - pager = "less -FR"; - # let Stylix control the theme - #theme = "Dracula"; - }; - }; - - firefox = { - enable = true; - policies = { - #BlockAboutConfig = true; - DefaultDownloadDirectory = "\${home}/downloads"; - }; - }; - - /* - spicetify = - let - spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; - in - { - enable = true; - enabledExtensions = with spicePkgs.extensions; [ - adblock - hidePodcasts - #shuffle - ]; - theme = spicePkgs.themes.catppuccin; - colorScheme = "mocha"; - }; - */ - - # The terminal I use - # TODO: this is dependent on nvim being installed - # TODO: make this into a module with a configurable editor option - rio = { - enable = true; - # Rio Config Docs: https://raphamorim.io/rio/docs/config - settings = { - theme = "dracula"; - hide-mouse-cursor-when-typing = true; - - use-fork = true; # fork (dont spawn) Rio - - padding-x = 10; - padding-y = [ 15 10 ]; # top, left - - # lines = (accumulated scroll * multiplier / divider) - scroll = { - multiplier = 3.0; - divider = 1.0; - }; - - fonts = { - size = 15; - features = []; - - regular = { - family = "FiraCode Nerd Font"; # "IosevkaTerm Nerd Font" - style = "Normal"; - weight = 400; - }; - - bold = { - family = "FiraCode Nerd Font"; - style = "Normal"; - weight = 800; - }; - - italic = { - family = "FiraCode Nerd Font"; - style = "Italic"; - weight = 400; - }; - - bold-italic = { - family = "FiraCode Nerd Font"; - style = "Italic"; - weight = 800; - }; - }; - - # Run when the `OpenConfigEditor` keybinding is triggered - editor = { - program = "nvim"; - args = []; - }; - - renderer = { - performance = "High"; - backend = "Automatic"; # Vulkan - }; - }; - }; - - wofi = { - enable = true; - settings = { - location = "center"; - allow_markup = true; - width = 250; - }; - # Force the style to stop Stylix being a bitch and overwriting it - style = lib.mkForce '' - @define-color rosewater #f2d5cf; - @define-color rosewater-rgb rgb(242, 213, 207); - @define-color flamingo #eebebe; - @define-color flamingo-rgb rgb(238, 190, 190); - @define-color pink #f4b8e4; - @define-color pink-rgb rgb(244, 184, 228); - @define-color mauve #ca9ee6; - @define-color mauve-rgb rgb(202, 158, 230); - @define-color red #e78284; - @define-color red-rgb rgb(231, 130, 132); - @define-color maroon #ea999c; - @define-color maroon-rgb rgb(234, 153, 156); - @define-color peach #ef9f76; - @define-color peach-rgb rgb(239, 159, 118); - @define-color yellow #e5c890; - @define-color yellow-rgb rgb(229, 200, 144); - @define-color green #a6d189; - @define-color green-rgb rgb(166, 209, 137); - @define-color teal #81c8be; - @define-color teal-rgb rgb(129, 200, 190); - @define-color sky #99d1db; - @define-color sky-rgb rgb(153, 209, 219); - @define-color sapphire #85c1dc; - @define-color sapphire-rgb rgb(133, 193, 220); - @define-color blue #8caaee; - @define-color blue-rgb rgb(140, 170, 238); - @define-color lavender #babbf1; - @define-color lavender-rgb rgb(186, 187, 241); - @define-color text #c6d0f5; - @define-color text-rgb rgb(198, 208, 245); - @define-color subtext1 #b5bfe2; - @define-color subtext1-rgb rgb(181, 191, 226); - @define-color subtext0 #a5adce; - @define-color subtext0-rgb rgb(165, 173, 206); - @define-color overlay2 #949cbb; - @define-color overlay2-rgb rgb(148, 156, 187); - @define-color overlay1 #838ba7; - @define-color overlay1-rgb rgb(131, 139, 167); - @define-color overlay0 #737994; - @define-color overlay0-rgb rgb(115, 121, 148); - @define-color surface2 #626880; - @define-color surface2-rgb rgb(98, 104, 128); - @define-color surface1 #51576d; - @define-color surface1-rgb rgb(81, 87, 109); - @define-color surface0 #414559; - @define-color surface0-rgb rgb(65, 69, 89); - @define-color base #303446; - @define-color base-rgb rgb(48, 52, 70); - @define-color mantle #292c3c; - @define-color mantle-rgb rgb(41, 44, 60); - @define-color crust #232634; - @define-color crust-rgb rgb(35, 38, 52); - - * { - font-family: 'FiraCode Nerd Font'; - font-size: 16px; - } - - /* Window */ - window { - margin: 0px; - padding: 10px; - border: 0.16em solid @teal; - border-radius: 0.5em; - background-color: @base; - animation: slideIn 0.25s ease-in-out both; - } - - /* Slide In */ - @keyframes slideIn { - 0% { - opacity: 0; - } - - 100% { - opacity: 1; - } - } - - /* Inner Box */ - #inner-box { - margin: 5px; - padding: 10px; - border: none; - background-color: @base; - /*animation: fadeIn 0.5s ease-in-out both;*/ - } - - /* Fade In */ - @keyframes fadeIn { - 0% { - opacity: 0; - } - - 100% { - opacity: 1; - } - } - - /* Outer Box */ - #outer-box { - margin: 5px; - padding: 10px; - border: none; - background-color: @base; - } - - /* Scroll */ - #scroll { - margin: 0px; - padding: 10px; - border: none; - background-color: @base; - } - - /* Input */ - #input { - margin: 5px 20px; - padding: 10px; - border: none; - border-radius: 0.25em; - color: @text; - background-color: @base; - animation: fadeIn 0.25s ease-in-out both; - } - - #input image { - border: none; - color: @red; - } - - #input * { - outline: 4px solid @red!important; - } - - /* Text */ - #text { - margin: 5px; - border: none; - color: @text; - animation: fadeIn 0.5s ease-in-out both; - } - - #entry { - background-color: @base; - } - - #entry arrow { - border: none; - color: @teal; - } - - /* Selected Entry */ - #entry:selected { - border: 0.10em solid @teal; - border-radius: 0.25em; - } - - #entry:selected #text { - color: @teal; - } - - #entry:drop(active) { - background-color: @lavender!important; - } - ''; - }; - - rofi = { - enable = true; - package = pkgs.rofi-wayland; - font = "JetBrains Mono Nerd Font 10"; - location = "center"; - terminal = "${pkgs.rio}/bin/rio"; - }; - - }; - - - # ----- SERVICES ----- - services = { - # Hyprland Wallpaper - #hyprpaper = { - # enable = true; - # settings = { - # preload = [ "/home/me/nixdots/wallpapers/wall.png" ]; - # wallpaper = [ - # "DP-2,/home/me/nixdots/wallpapers/wall.png" - # "HDMI-A-1,/home/me/nixdots/wallpapers/wall.png" - # ]; - # }; - #}; - - # Change monitor positions - # TODO: find a way to make this modular (ie put something different for my laptop) - # my idea is to have a "monitors" module and use kanshi for wayland - kanshi = { - enable = true; - systemdTarget = "hyprland-session.target"; - # You can find your monitors in hyprland by using `hyprctl monitors all` - settings = [ - { # 1920x1080@144 gaming monitor - output.criteria = "HDMI-A-1"; - output.mode = "1920x1080@119.98Hz"; - output.scale = 1.0; - output.adaptiveSync = false; # Variable Refresh Rate (this can be changed for gaming) - } - { # 4k side monitor - output.criteria = "DP-2"; - output.mode = "3840x2160@60.00Hz"; - output.scale = 2.0; - } - - { # This is my default setup - profile.name = "default"; - profile.outputs = [ - { - criteria = "DP-2"; - position = "0,0"; - } - { - criteria = "HDMI-A-1"; - position = "3840,0"; - } - ]; - } - ]; - }; - }; - - - # Nicely reload system units when changing configs - systemd.user.startServices = "sd-switch"; - - home.stateVersion = "24.05"; # don't change this -} diff --git a/homes/me/theme.rasi b/homes/me/theme.rasi old mode 100644 new mode 100755 diff --git a/homes/me/wofi.nix b/homes/me/wofi.nix old mode 100644 new mode 100755 diff --git a/hosts/lolcathost/default.nix b/hosts/lolcathost/default.nix old mode 100644 new mode 100755 index 93ee8e1..1581a81 --- a/hosts/lolcathost/default.nix +++ b/hosts/lolcathost/default.nix @@ -1,32 +1,44 @@ -{ +{ pkgs, inputs, - ... -}: { + ... +}: let + home-manager = builtins.fetchTarball { + url = "https://github.com/nix-community/home-manager/archive/master.tar.gz"; + sha256 = "19w63qccz78v0spx03911z98w1bvlxvd07hb0ma14a4vdzi4ninj"; + }; +in { imports = [ - ./hardware-configuration.nix + ./hardware-configuration.nix + (import "${home-manager}/nixos") + inputs.spicetify-nix.nixosModules.default + ]; + + programs.spicetify = let + spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; + in { + enable = true; + enabledExtensions = with spicePkgs.extensions; [ + adblock + hidePodcasts + shuffle # shuffle+ (special characters are sanitized out of extension names) ]; + #theme = spicePkgs.themes.catppuccin; + #colorScheme = "mocha"; + }; # Use the systemd-boot EFI boot loader. - # TODO: use GRUB2 instead - boot.loader.systemd-boot.enable = true; - boot.loader.efi.canTouchEfiVariables = true; - #boot.loader = { - # efi = { - # canTouchEfiVariables = true; - # efiSysMountPoint = "/boot/efi"; - # }; - # grub = { - # efiSupport = true; - # #efiInstallAsRemovable = true; # in case canTouchEfiVariables doesn't work on this system - # device = "nodev"; - # }; - #}; - - networking.hostName = "myputer"; - # Pick only one of the below networking options. - # networking.wireless.enable = true; # Enables wireless support via wpa_supplicant. - networking.networkmanager.enable = true; # Easiest to use and most distros use this by default. + boot.loader = { + efi = { + canTouchEfiVariables = true; + efiSysMountPoint = "/boot/efi"; + }; + grub = { + efiSupport = true; + #efiInstallAsRemovable = true; # in case canTouchEfiVariables doesn't work on this system + device = "nodev"; + }; + }; # Set your time zone. time.timeZone = "Australia/Brisbane"; @@ -36,33 +48,218 @@ console = { font = "Lat2-Terminus16"; keyMap = "us"; - #useXkbConfig = true; # use xkb.options in tty. }; - # Enable sound. - #services.pipewire = { - # enable = true; - # pulse.enable = true; - #}; + # ----- NETWORKING SECTION ----- + networking.hostName = "lolcathost"; + networking.networkmanager.enable = true; - # Enable touchpad support (enabled default in most desktopManager). - # services.libinput.enable = true; + # Open ports in the firewall. + # networking.firewall.allowedTCPPorts = [ ... ]; + # networking.firewall.allowedUDPPorts = [ ... ]; + # Or disable the firewall altogether. + networking.firewall.enable = true; - # Define a user account. Don't forget to set a password with ‘passwd’. - users.users.emile = { - isNormalUser = true; - extraGroups = [ "wheel" ]; # Enable ‘sudo’ for the user. - packages = with pkgs; [ - #firefox - tree + # ----- SERVICES ----- + services = { + # Set display manager (login screen) + #displayManager = { + # sddm = { + # enable = true; + # #theme = "${import ./sddm-theme.nix { inherit pkgs; }}"; + # wayland.enable = true; # enable experimental sddm support for wayland + # }; + # defaultSession = "hyprland"; + #}; + + # Enable sound + # TODO: use the modules/core/pipewire.nix module instead :) + pipewire = { + enable = true; + pulse.enable = true; + }; + + # Enable touchpad support + libinput.enable = true; + }; + + # allow wheel group to use passwordless sudo + users = { + # using fish as the login shell tends + # to go very poorly because it isn't + # POSIX compliant, so we'll just use + # simple Bash then :) + defaultUserShell = pkgs.bash; + + users = { + # just me fr (personal account) + me = { + isNormalUser = true; + extraGroups = ["wheel"]; + shell = pkgs.bash; #pkgs.fish + packages = with pkgs; [ + firefox + nitch + starfetch + tldr + ]; + }; + + # programming/development account + dev = { + isNormalUser = true; + extraGroups = ["wheel"]; + shell = pkgs.bash; #pkgs.zsh + packages = with pkgs; [ + ]; + }; + + # user for my professional jobs and stuff + ae = { + isNormalUser = true; + extraGroups = ["wheel"]; + shell = pkgs.bash; #pkgs.fish + packages = with pkgs; [ + ]; + }; + }; + }; + + home-manager = { + users.me = import ../../homes/me; + sharedModules = [ + #inputs.nixcord.homeManagerModules.nixcord + #inputs.nixvim.homeManagerModules.nixvim ]; }; - # List packages installed in system profile. To search, run: - # $ nix search wget + # ---- SYSTEM PACKAGES ----- environment.systemPackages = with pkgs; [ - vim + # User Environment + inputs.swww.packages.${pkgs.system}.swww + #vesktop + helvum + easyeffects + ani-cli + wl-clipboard # clipboard for wayland + + python311 # I use 3.11 since it's in a pretty stable state now + poetry # python dependency management and packaging + + # fish plugins + grc # colorise command outputs + + httpie + curlie + zoxide + doggo + + # Pretty necessary + git + brightnessctl + acpi + + # Unix Commands wget + tree + ]; + + # Enable the use of certain programs + programs = { + hyprland = { + enable = true; + # set the flake package + package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland; + # make sure to also set the portal package, so that they are in sync + portalPackage = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland; + + xwayland.enable = true; + #systemd.enable = true; + }; + + zsh.enable = true; + fish.enable = true; + + neovim = { + enable = true; + defaultEditor = true; + viAlias = true; + vimAlias = true; + configure = { + customRC = '' + set number + set tabstop=4 + set shiftwidth=4 + + set mouse=a + ''; + }; + }; + + # I want to use fish as my login shell but it always goes terrible + # cause it isn't POSIX compliant, so instead Bash is my login and + # will just exec fish (^-^) + bash = { + interactiveShellInit = '' + if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]] + then + shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION="" + exec ${pkgs.fish}/bin/fish $LOGIN_OPTION + fi + ''; + }; + }; + + # ----- FONTS ----- + fonts = { + enableDefaultPackages = true; # no clue what this line does tbh + packages = with pkgs; [ + (nerdfonts.override { + fonts = [ + "Cousine" # its already i guess + "Iosevka" # nah nah + "IosevkaTerm" # big nah + "CascadiaCode" # potential + "FiraCode" # potential + "JetBrainsMono" # for my rofi theme + "Hasklig" + "Hack" + ]; + }) + + # texlive maintains a noto-emoji flake + texlivePackages.noto-emoji + ]; + + fontconfig = { + defaultFonts = { + serif = ["Iosevka"]; # TODO: package Iosevka Etoile since Iosevka isn't a serif font + sansSerif = ["Iosevka "]; + monospace = ["Cousine"]; + emoji = ["Noto Emoji"]; + }; + }; + }; + + # ----- STYLIX ----- + + #stylix = { + # enable = true; + # image = pkgs.fetchurl { + # url = "https://www.pixelstalk.net/wp-content/uploads/2016/05/Epic-Anime-Awesome-Wallpapers.jpg"; + # sha256 = "enQo3wqhgf0FEPHj2coOCvo7DuZv+x5rL/WIo4qPI50="; + # }; + # + # # Stylix will automatically theme applications + # #autoEnable = true; + # #image = ../../wallpapers/wall.png; + # #image = "/home/me/nixdots/wallpapers/ghibli-esque-valley.png"; + #}; + + # Enable the new CLI commands and the flakes as experimental features + nix.settings.experimental-features = [ + "nix-command" + "flakes" ]; # Some programs need SUID wrappers, can be configured further or are @@ -73,40 +270,14 @@ # enableSSHSupport = true; # }; - # List services that you want to enable: - # Enable the OpenSSH daemon. # services.openssh.enable = true; - # Open ports in the firewall. - # networking.firewall.allowedTCPPorts = [ ... ]; - # networking.firewall.allowedUDPPorts = [ ... ]; - # Or disable the firewall altogether. - # networking.firewall.enable = false; + # Enable OpenGL + hardware = { + graphics.enable = true; + }; - # Copy the NixOS configuration file and link it from the resulting system - # (/run/current-system/configuration.nix). This is useful in case you - # accidentally delete configuration.nix. - # system.copySystemConfiguration = true; - - # This option defines the first version of NixOS you have installed on this particular machine, - # and is used to maintain compatibility with application data (e.g. databases) created on older NixOS versions. - # - # Most users should NEVER change this value after the initial install, for any reason, - # even if you've upgraded your system to a new NixOS release. - # - # This value does NOT affect the Nixpkgs version your packages and OS are pulled from, - # so changing it will NOT upgrade your system - see https://nixos.org/manual/nixos/stable/#sec-upgrading for how - # to actually do that. - # - # This value being lower than the current NixOS release does NOT mean your system is - # out of date, out of support, or vulnerable. - # - # Do NOT change this value unless you have manually inspected all the changes it would make to your configuration, - # and migrated your data accordingly. - # - # For more information, see `man configuration.nix` or https://nixos.org/manual/nixos/stable/options#opt-system.stateVersion . + # DO NOT MODIFY system.stateVersion = "24.05"; # Did you read the comment? - } - diff --git a/hosts/lolcathost/hardware-configuration.nix b/hosts/lolcathost/hardware-configuration.nix old mode 100644 new mode 100755 index 9892c37..1be6ce5 --- a/hosts/lolcathost/hardware-configuration.nix +++ b/hosts/lolcathost/hardware-configuration.nix @@ -1 +1,40 @@ -# TODO: (i haven't put NixOS on lolcathost yet) +# 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, ... }: + +{ + imports = + [ (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "ahci" "usb_storage" "sd_mod" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-amd" ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = + { device = "/dev/disk/by-uuid/4bf649ce-047b-472d-b392-4c2c326362d9"; + fsType = "ext4"; + }; + + fileSystems."/boot" = + { device = "/dev/disk/by-uuid/D97A-5260"; + fsType = "vfat"; + options = [ "fmask=0077" "dmask=0077" ]; + }; + + swapDevices = + [ { device = "/dev/disk/by-uuid/bfa29193-4f83-46c3-bcb7-0d2b8323b6e0"; } + ]; + + # Enables DHCP on each ethernet and wireless interface. In case of scripted networking + # (the default) this is the recommended approach. When using systemd-networkd it's + # still possible to use this option, but it's recommended to use it in conjunction + # with explicit per-interface declarations with `networking.interfaces..useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.wlp2s0f4u1.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/hosts/myputer/default.nix b/hosts/myputer/default.nix old mode 100644 new mode 100755 index a4e6f6a..a557b9e --- a/hosts/myputer/default.nix +++ b/hosts/myputer/default.nix @@ -96,6 +96,8 @@ in }; }; + # allow wheel group to use passwordless sudo + security.sudo.wheelNeedsPassword = false; users = { # using fish as the login shell tends # to go very poorly because it isn't @@ -137,8 +139,14 @@ in }; }; - home-manager.users.me = import ../../homes/me; - + home-manager = { + users.me = import ../../homes/me; + sharedModules = [ + #inputs.nixcord.homeManagerModules.nixcord + #inputs.nixvim.homeManagerModules.nixvim + ]; + }; + # ---- SYSTEM PACKAGES ----- environment.systemPackages = with pkgs; [ # User Environment @@ -147,17 +155,24 @@ in helvum easyeffects ani-cli - wl-clipboard # clipboard for wayland - python310 # I use 3.10 since it's in a pretty stable state now + python311 # I use 3.11 since it's in a pretty stable state now + poetry # python dependency management and packaging # fish plugins grc # colorise command outputs + httpie + curlie + zoxide + doggo + # Pretty necessary git - + brightnessctl + acpi + # Unix Commands wget tree diff --git a/hosts/myputer/hardware-configuration.nix b/hosts/myputer/hardware-configuration.nix old mode 100644 new mode 100755 diff --git a/hosts/myputer/sddm-theme.nix b/hosts/myputer/sddm-theme.nix old mode 100644 new mode 100755 diff --git a/modules/core/bluetooth.nix b/modules/core/bluetooth.nix old mode 100644 new mode 100755 diff --git a/modules/core/bootloader/grub.nix b/modules/core/bootloader/grub.nix old mode 100644 new mode 100755 diff --git a/modules/core/bootloader/systemd-boot.nix b/modules/core/bootloader/systemd-boot.nix old mode 100644 new mode 100755 diff --git a/modules/core/garbage-collector.nix b/modules/core/garbage-collector.nix old mode 100644 new mode 100755 diff --git a/modules/core/sound/default.nix b/modules/core/sound/default.nix old mode 100644 new mode 100755 diff --git a/modules/core/sound/pipewire.nix b/modules/core/sound/pipewire.nix old mode 100644 new mode 100755 diff --git a/modules/discord/nixcord.nix b/modules/discord/nixcord.nix old mode 100644 new mode 100755 index 6f65281..a347405 --- a/modules/discord/nixcord.nix +++ b/modules/discord/nixcord.nix @@ -9,15 +9,15 @@ { imports = [ - inputs.nixcord.homeManagerModules.nixcord + config.nixcord.homeManagerModules.nixcord ]; programs.nixcord = { enable = true; config = { - themeLinks = [ - "" - ]; + #themeLinks = [ + # "" + #]; # no surrounding window frame frameless = true; diff --git a/modules/hyprland/default.nix b/modules/hyprland/default.nix old mode 100644 new mode 100755 diff --git a/typescript b/typescript deleted file mode 100644 index c149333..0000000 --- a/typescript +++ /dev/null @@ -1,7 +0,0 @@ -Script started on 2024-11-02 18:26:40+10:00 [TERM="rio" TTY="/dev/pts/1" COLUMNS="162" LINES="70"] -You need to install grc! -Welcome weary traveler mmm mm mmm to my shop -[?2004h]0;~/nixdots(B me(B@myputer(B:~/nixdots(B|main⚡*(B?(B -➤ (B e xit exit xit it t  exit   -(B[?2004l]0;exit ~/nixdots(B (B(B[?2004l -Script done on 2024-11-02 18:26:46+10:00 [COMMAND_EXIT_CODE="0"] From b43c9b53ba78482a9cc51f28a6227dda0afee771 Mon Sep 17 00:00:00 2001 From: Emile Clark-Boman Date: Fri, 8 Nov 2024 01:00:21 +1000 Subject: [PATCH 015/328] added nixcord, thunar, and formatted various files --- README.md | 3 +- TODO | 74 ++++++++ flake.nix | 99 ++++++----- homes/me/TODO | 31 ---- homes/me/default.nix | 11 +- hosts/lolcathost/default.nix | 56 +++---- hosts/lolcathost/default.nix.bak | 280 +++++++++++++++++++++++++++++++ result | 1 + try-this | 1 + 9 files changed, 449 insertions(+), 107 deletions(-) create mode 100644 TODO delete mode 100644 homes/me/TODO create mode 100755 hosts/lolcathost/default.nix.bak create mode 120000 result create mode 100644 try-this diff --git a/README.md b/README.md index 50c9053..0dd5535 100755 --- a/README.md +++ b/README.md @@ -68,7 +68,8 @@ If their colour scheme was a little less white I'd love it but overall one of my ### Wallpaper Sources 1. https://www.wallpaperflare.com/ 2. https://alphacoders.com - specifically: https://alphacoders.com/lofi + especially this one person: https://alphacoders.com/users/profile/69089/robokoboto + and also the lofi category: https://alphacoders.com/lofi ### Credits diff --git a/TODO b/TODO new file mode 100644 index 0000000..05a5141 --- /dev/null +++ b/TODO @@ -0,0 +1,74 @@ +Get Utilities: +1. httpie +2. curlie +3. zoxide +4. doggo + +1. Get helix editor +2. Custom helix +3. Complete helix tutorial + +Get nixcord working +Get thunar working and configured + + +Get waybar (or another bar) working + +Bind new terminal to SUPER+Enter instead of SUPER+Q + +Get a better wallpapers + +Join Rio Terminal's discord and ask if they support nerdfonts or if I'm doing something wrong + +Figure out how to modularise my dotfiles + +Configure nixcord + + +Change Dell loading screen (Boot Graphics Resource Table, aka BGRT) + + +Get hyprcursor working with Bibata-Modern-Ice + +Install and configure hyprland plugins like hyprlock + +Get a GRUB theme working + +Fix: your 131072x1 screen size is bogus. expect trouble + +Are there plugins for helix? + + +Push nixdots to github + +Create a program that enables/disables passwordless sudo access + (add to github too) + + + + + +Have helix editor look differently depending on language + (specifically don't show indent indicators when editing nix files + + +Learn to package my own home-manager modules + + + + + + +Fork nixcord and fix documentation (the installation is confusing) +But firstly the first code snippet is wrong... +```nix +inputs.nixcord = { + url = "github:kaylorben/nixcord" +}; +``` +Should actually be +```nix +inputs.nixcord = { + url = "github:kaylorben/nixcord"; # dont forget the semicolon +}; +``` diff --git a/flake.nix b/flake.nix index da2e087..7f6c563 100755 --- a/flake.nix +++ b/flake.nix @@ -16,14 +16,16 @@ #stylix.url = "github:danth/stylix"; - nixcord = { url = "github:kaylorben/nixcord"; }; + nixcord = { + url = "github:kaylorben/nixcord"; + }; nixvim = { url = "github:nix-community/nixvim"; inputs.nixpkgs.follows = "nixpkgs"; }; - grub2-themes = { url = "github:vinceliuice/grub2-themes"; }; + grub2-themes = {url = "github:vinceliuice/grub2-themes";}; # is this necessary? (aren't I enabling it in `configuration.nix` anyways?) hyprland.url = "github:hyprwm/Hyprland"; @@ -31,53 +33,62 @@ swww.url = "github:LGFae/swww"; }; - outputs = { self, nixpkgs, home-manager, hyprland, grub2-themes, nixvim - , nixcord, + outputs = { + self, + nixpkgs, + home-manager, + hyprland, + grub2-themes, + nixvim, + nixcord, #stylix, - ... }@inputs: - let - system = "x86_64-linux"; + ... + } @ inputs: let + system = "x86_64-linux"; - pkgs = import nixpkgs { - inherit system; - config.allowUnfree = true; + pkgs = import nixpkgs { + inherit system; + config.allowUnfree = true; + }; + + # this is just something I'm experimenting with + PROJECT_ROOT = builtins.toString ./.; + in { + nixosConfigurations = { + # i be on my puter fr + myputer = nixpkgs.lib.nixosSystem { + # nix passes these to every single module above + specialArgs = {inherit inputs pkgs;}; + + modules = [ + ./hosts/myputer + grub2-themes.nixosModules.default + #stylix.nixosModules.stylix + ]; }; - # this is just something I'm experimenting with - PROJECT_ROOT = builtins.toString ./.; + # my laptop 0w0 + lolcathost = nixpkgs.lib.nixosSystem { + specialArgs = {inherit inputs pkgs;}; - in { - nixosConfigurations = { - # i be on my puter fr - myputer = nixpkgs.lib.nixosSystem { - # nix passes these to every single module above - specialArgs = { inherit inputs pkgs; }; - - modules = [ - ./hosts/myputer - grub2-themes.nixosModules.default - #stylix.nixosModules.stylix - ]; - }; - - # my laptop 0w0 - lolcathost = nixpkgs.lib.nixosSystem { - specialArgs = { inherit inputs pkgs; }; - - modules = [ ./hosts/lolcathost ]; - }; - }; - - homeConfigurations = { - me = home-manager.lib.homeManagerConfiguration { - specialArgs = { inherit inputs; }; - - modules = [ - ./home/me - #nixcord.homeManagerModules.nixcord - #nixvim.homeManagerModules.nixvim - ]; - }; + modules = [ + ./hosts/lolcathost + ]; }; }; + + /* + homeConfigurations = { + me = home-manager.lib.homeManagerConfiguration { + specialArgs = {inherit inputs;}; + + modules = [ + ./home/me + #nixcord.homeManagerModules.nixcord + #nixvim.homeManagerModules.nixvim + ]; + }; + }; + */ + }; } diff --git a/homes/me/TODO b/homes/me/TODO deleted file mode 100644 index c4bfdc8..0000000 --- a/homes/me/TODO +++ /dev/null @@ -1,31 +0,0 @@ -Get Utilities: -1. httpie -2. curlie -3. zoxide -4. doggo - -1. Get helix editor -2. Custom helix -3. Complete helix tutorial - - - -Get waybar (or another bar) working - - -Get a better wallpaper - -Get a GRUB theme working - -Fix: your 131072x1 screen size is bogus. expect trouble - - -Push nixdots to github - - - -Have helix editor look differently depending on language - (specifically don't show indent indicators when editing nix files - - -Learn to package my own home-manager modules diff --git a/homes/me/default.nix b/homes/me/default.nix index dfeeb2e..41f231f 100755 --- a/homes/me/default.nix +++ b/homes/me/default.nix @@ -236,7 +236,16 @@ ]; }; - #nixcord.enable = true; + nixcord = { + enable = true; + config = { + frameless = true; + plugins = { + # TODO: remove this plugin + hideAttachments.enable = true; + }; + }; + }; firefox = { enable = true; diff --git a/hosts/lolcathost/default.nix b/hosts/lolcathost/default.nix index 1581a81..f4185d5 100755 --- a/hosts/lolcathost/default.nix +++ b/hosts/lolcathost/default.nix @@ -48,6 +48,9 @@ in { console = { font = "Lat2-Terminus16"; keyMap = "us"; + #packages = with pkgs; [ + # nerdfonts + #]; }; # ----- NETWORKING SECTION ----- @@ -81,6 +84,9 @@ in { # Enable touchpad support libinput.enable = true; + + tumbler.enable = true; # Thunar image thumbnail support + gvfs.enable = true; # Thunar mount, trash, and other functionality }; # allow wheel group to use passwordless sudo @@ -92,7 +98,7 @@ in { defaultUserShell = pkgs.bash; users = { - # just me fr (personal account) + # literally me fr (personal account) me = { isNormalUser = true; extraGroups = ["wheel"]; @@ -128,7 +134,7 @@ in { home-manager = { users.me = import ../../homes/me; sharedModules = [ - #inputs.nixcord.homeManagerModules.nixcord + inputs.nixcord.homeManagerModules.nixcord #inputs.nixvim.homeManagerModules.nixvim ]; }; @@ -180,22 +186,6 @@ in { zsh.enable = true; fish.enable = true; - neovim = { - enable = true; - defaultEditor = true; - viAlias = true; - vimAlias = true; - configure = { - customRC = '' - set number - set tabstop=4 - set shiftwidth=4 - - set mouse=a - ''; - }; - }; - # I want to use fish as my login shell but it always goes terrible # cause it isn't POSIX compliant, so instead Bash is my login and # will just exec fish (^-^) @@ -208,24 +198,30 @@ in { fi ''; }; + + # Thunar also uses: `services.tumbler` & `services.gvfs` + thunar = { + enable = true; + plugins = with pkgs.xfce; [ + thunar-volman # for removable drives (ie USBs) + thunar-archive-plugin # create and extract archives + thunar-media-tags-plugin # change metadata for media files + ]; + }; }; # ----- FONTS ----- fonts = { enableDefaultPackages = true; # no clue what this line does tbh packages = with pkgs; [ - (nerdfonts.override { - fonts = [ - "Cousine" # its already i guess - "Iosevka" # nah nah - "IosevkaTerm" # big nah - "CascadiaCode" # potential - "FiraCode" # potential - "JetBrainsMono" # for my rofi theme - "Hasklig" - "Hack" - ]; - }) + #(nerdfonts.override { + # fonts = [ + # "Cousine" + # "Iosevka" + # "JetBrainsMono" + # ]; + # }) + nerdfonts # texlive maintains a noto-emoji flake texlivePackages.noto-emoji diff --git a/hosts/lolcathost/default.nix.bak b/hosts/lolcathost/default.nix.bak new file mode 100755 index 0000000..c7f703e --- /dev/null +++ b/hosts/lolcathost/default.nix.bak @@ -0,0 +1,280 @@ +{ + pkgs, + inputs, + ... +}: let + home-manager = builtins.fetchTarball { + url = "https://github.com/nix-community/home-manager/archive/master.tar.gz"; + sha256 = "19w63qccz78v0spx03911z98w1bvlxvd07hb0ma14a4vdzi4ninj"; + }; +in { + imports = [ + ./hardware-configuration.nix + (import "${home-manager}/nixos") + inputs.spicetify-nix.nixosModules.default + ]; + + programs.spicetify = let + spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; + in { + enable = true; + enabledExtensions = with spicePkgs.extensions; [ + adblock + hidePodcasts + shuffle # shuffle+ (special characters are sanitized out of extension names) + ]; + #theme = spicePkgs.themes.catppuccin; + #colorScheme = "mocha"; + }; + + # Use the systemd-boot EFI boot loader. + boot.loader = { + efi = { + canTouchEfiVariables = true; + efiSysMountPoint = "/boot/efi"; + }; + grub = { + efiSupport = true; + #efiInstallAsRemovable = true; # in case canTouchEfiVariables doesn't work on this system + device = "nodev"; + }; + }; + + # Set your time zone. + time.timeZone = "Australia/Brisbane"; + + # Select internationalisation properties. + i18n.defaultLocale = "en_US.UTF-8"; + console = { + font = "Lat2-Terminus16"; + keyMap = "us"; + console.packages = with pkgs; [ + nerdfonts + ]; + }; + + # ----- NETWORKING SECTION ----- + networking.hostName = "lolcathost"; + networking.networkmana + + # Open ports in the fi + # networking.firewall.allowedTCPPorts = [ ... ]; + # networking.firewall.allowedUDPPorts = [ ... ]; + # Or disable the firewall altogether. + networking.firewall.enable = true; + + # ----- SERVICES ----- + services = { + # Set display manager (login screen) + #displayManager = { + # sddm = { + # enable = true; + # #theme = "${import ./sddm-theme.nix { inherit pkgs; }}"; + # wayland.enable = true; # enable experimental sddm support for wayland + # }; + # defaultSession = "hyprland"; + #}; + + # Enable sound + # TODO: use the modules/core/pipewire.nix module instead :) + pipewire = { + enable = true; + pulse.enable = true; + }; + + # Enable touchpad support + libinput.enable = true; + }; + + # allow wheel group to use passwordless sudo + users = { + # using fish as the login shell tends + # to go very poorly because it isn't + # POSIX compliant, so we'll just use + # simple Bash then :) + defaultUserShell = pkgs.bash; + + users = { + # just me fr (personal account) + me = { + isNormalUser = true; + extraGroups = ["wheel"]; + shell = pkgs.bash; #pkgs.fish + packages = with pkgs; [ + firefox + nitch + starfetch + tldr + ]; + }; + + # programming/development account + dev = { + isNormalUser = true; + extraGroups = ["wheel"]; + shell = pkgs.bash; #pkgs.zsh + packages = with pkgs; [ + ]; + }; + + # user for my professional jobs and stuff + ae = { + isNormalUser = true; + extraGroups = ["wheel"]; + shell = pkgs.bash; #pkgs.fish + packages = with pkgs; [ + ]; + }; + }; + }; + + home-manager = { + users.me = import ../../homes/me; + sharedModules = [ + #inputs.nixcord.homeManagerModules.nixcord + #inputs.nixvim.homeManagerModules.nixvim + ]; + }; + + # ---- SYSTEM PACKAGES ----- + environment.systemPackages = with pkgs; [ + # User Environment + inputs.swww.packages.${pkgs.system}.swww + #vesktop + helvum + easyeffects + ani-cli + wl-clipboard # clipboard for wayland + + python311 # I use 3.11 since it's in a pretty stable state now + poetry # python dependency management and packaging + + # fish plugins + grc # colorise command outputs + + httpie + curlie + zoxide + doggo + + # Pretty necessary + git + brightnessctl + acpi + + # Unix Commands + wget + tree + ]; + + # Enable the use of certain programs + programs = { + hyprland = { + enable = true; + # set the flake package + package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland; + # make sure to also set the portal package, so that they are in sync + portalPackage = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland; + + xwayland.enable = true; + #systemd.enable = true; + }; + + zsh.enable = true; + fish.enable = true; + + neovim = { + enable = true; + defaultEditor = true; + viAlias = true; + vimAlias = true; + configure = { + customRC = '' + set number + set tabstop=4 + set shiftwidth=4 + + set mouse=a + ''; + }; + }; + + # I want to use fish as my login shell but it always goes terrible + # cause it isn't POSIX compliant, so instead Bash is my login and + # will just exec fish (^-^) + bash = { + interactiveShellInit = '' + if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]] + then + shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION="" + exec ${pkgs.fish}/bin/fish $LOGIN_OPTION + fi + ''; + }; + }; + + # ----- FONTS ----- + fonts = { + enableDefaultPackages = true; # no clue what this line does tbh + packages = with pkgs; [ + (nerdfonts.override { + fonts = [ + "Cousine" + "Iosevka" + ]; + }) + + # texlive maintains a noto-emoji flake + texlivePackages.noto-emoji + ]; + + fontconfig = { + defaultFonts = { + serif = ["Iosevka"]; # TODO: package Iosevka Etoile since Iosevka isn't a serif font + sansSerif = ["Iosevka "]; + monospace = ["Cousine"]; + emoji = ["Noto Emoji"]; + }; + }; + }; + + # ----- STYLIX ----- + + #stylix = { + # enable = true; + # image = pkgs.fetchurl { + # url = "https://www.pixelstalk.net/wp-content/uploads/2016/05/Epic-Anime-Awesome-Wallpapers.jpg"; + # sha256 = "enQo3wqhgf0FEPHj2coOCvo7DuZv+x5rL/WIo4qPI50="; + # }; + # + # # Stylix will automatically theme applications + # #autoEnable = true; + # #image = ../../wallpapers/wall.png; + # #image = "/home/me/nixdots/wallpapers/ghibli-esque-valley.png"; + #}; + + # Enable the new CLI commands and the flakes as experimental features + nix.settings.experimental-features = [ + "nix-command" + "flakes" + ]; + + # Some programs need SUID wrappers, can be configured further or are + # started in user sessions. + # programs.mtr.enable = true; + # programs.gnupg.agent = { + # enable = true; + # enableSSHSupport = true; + # }; + + # Enable the OpenSSH daemon. + # services.openssh.enable = true; + + # Enable OpenGL + hardware = { + graphics.enable = true; + }; + + # DO NOT MODIFY + system.stateVersion = "24.05"; # Did you read the comment? +} diff --git a/result b/result new file mode 120000 index 0000000..9f9ebca --- /dev/null +++ b/result @@ -0,0 +1 @@ +/nix/store/8fhj8clwhgkf9yqbsjvvyf5hzgnmd98g-nixos-system-lolcathost-24.11.20241102.7ffd9ae \ No newline at end of file diff --git a/try-this b/try-this new file mode 100644 index 0000000..6287e39 --- /dev/null +++ b/try-this @@ -0,0 +1 @@ +nixos-rebuild build --flake .# --cores 8 -j 1 From 7a9703c4ba16f50d43a9b2c9d33eaef95100f17c Mon Sep 17 00:00:00 2001 From: _cry64 Date: Fri, 8 Nov 2024 01:00:21 +1000 Subject: [PATCH 016/328] added nixcord, thunar, and formatted various files --- README.md | 3 +- TODO | 74 ++++++++ flake.nix | 99 ++++++----- homes/me/TODO | 31 ---- homes/me/default.nix | 11 +- hosts/lolcathost/default.nix | 56 +++---- hosts/lolcathost/default.nix.bak | 280 +++++++++++++++++++++++++++++++ result | 1 + try-this | 1 + 9 files changed, 449 insertions(+), 107 deletions(-) create mode 100644 TODO delete mode 100644 homes/me/TODO create mode 100755 hosts/lolcathost/default.nix.bak create mode 120000 result create mode 100644 try-this diff --git a/README.md b/README.md index 50c9053..0dd5535 100755 --- a/README.md +++ b/README.md @@ -68,7 +68,8 @@ If their colour scheme was a little less white I'd love it but overall one of my ### Wallpaper Sources 1. https://www.wallpaperflare.com/ 2. https://alphacoders.com - specifically: https://alphacoders.com/lofi + especially this one person: https://alphacoders.com/users/profile/69089/robokoboto + and also the lofi category: https://alphacoders.com/lofi ### Credits diff --git a/TODO b/TODO new file mode 100644 index 0000000..05a5141 --- /dev/null +++ b/TODO @@ -0,0 +1,74 @@ +Get Utilities: +1. httpie +2. curlie +3. zoxide +4. doggo + +1. Get helix editor +2. Custom helix +3. Complete helix tutorial + +Get nixcord working +Get thunar working and configured + + +Get waybar (or another bar) working + +Bind new terminal to SUPER+Enter instead of SUPER+Q + +Get a better wallpapers + +Join Rio Terminal's discord and ask if they support nerdfonts or if I'm doing something wrong + +Figure out how to modularise my dotfiles + +Configure nixcord + + +Change Dell loading screen (Boot Graphics Resource Table, aka BGRT) + + +Get hyprcursor working with Bibata-Modern-Ice + +Install and configure hyprland plugins like hyprlock + +Get a GRUB theme working + +Fix: your 131072x1 screen size is bogus. expect trouble + +Are there plugins for helix? + + +Push nixdots to github + +Create a program that enables/disables passwordless sudo access + (add to github too) + + + + + +Have helix editor look differently depending on language + (specifically don't show indent indicators when editing nix files + + +Learn to package my own home-manager modules + + + + + + +Fork nixcord and fix documentation (the installation is confusing) +But firstly the first code snippet is wrong... +```nix +inputs.nixcord = { + url = "github:kaylorben/nixcord" +}; +``` +Should actually be +```nix +inputs.nixcord = { + url = "github:kaylorben/nixcord"; # dont forget the semicolon +}; +``` diff --git a/flake.nix b/flake.nix index da2e087..7f6c563 100755 --- a/flake.nix +++ b/flake.nix @@ -16,14 +16,16 @@ #stylix.url = "github:danth/stylix"; - nixcord = { url = "github:kaylorben/nixcord"; }; + nixcord = { + url = "github:kaylorben/nixcord"; + }; nixvim = { url = "github:nix-community/nixvim"; inputs.nixpkgs.follows = "nixpkgs"; }; - grub2-themes = { url = "github:vinceliuice/grub2-themes"; }; + grub2-themes = {url = "github:vinceliuice/grub2-themes";}; # is this necessary? (aren't I enabling it in `configuration.nix` anyways?) hyprland.url = "github:hyprwm/Hyprland"; @@ -31,53 +33,62 @@ swww.url = "github:LGFae/swww"; }; - outputs = { self, nixpkgs, home-manager, hyprland, grub2-themes, nixvim - , nixcord, + outputs = { + self, + nixpkgs, + home-manager, + hyprland, + grub2-themes, + nixvim, + nixcord, #stylix, - ... }@inputs: - let - system = "x86_64-linux"; + ... + } @ inputs: let + system = "x86_64-linux"; - pkgs = import nixpkgs { - inherit system; - config.allowUnfree = true; + pkgs = import nixpkgs { + inherit system; + config.allowUnfree = true; + }; + + # this is just something I'm experimenting with + PROJECT_ROOT = builtins.toString ./.; + in { + nixosConfigurations = { + # i be on my puter fr + myputer = nixpkgs.lib.nixosSystem { + # nix passes these to every single module above + specialArgs = {inherit inputs pkgs;}; + + modules = [ + ./hosts/myputer + grub2-themes.nixosModules.default + #stylix.nixosModules.stylix + ]; }; - # this is just something I'm experimenting with - PROJECT_ROOT = builtins.toString ./.; + # my laptop 0w0 + lolcathost = nixpkgs.lib.nixosSystem { + specialArgs = {inherit inputs pkgs;}; - in { - nixosConfigurations = { - # i be on my puter fr - myputer = nixpkgs.lib.nixosSystem { - # nix passes these to every single module above - specialArgs = { inherit inputs pkgs; }; - - modules = [ - ./hosts/myputer - grub2-themes.nixosModules.default - #stylix.nixosModules.stylix - ]; - }; - - # my laptop 0w0 - lolcathost = nixpkgs.lib.nixosSystem { - specialArgs = { inherit inputs pkgs; }; - - modules = [ ./hosts/lolcathost ]; - }; - }; - - homeConfigurations = { - me = home-manager.lib.homeManagerConfiguration { - specialArgs = { inherit inputs; }; - - modules = [ - ./home/me - #nixcord.homeManagerModules.nixcord - #nixvim.homeManagerModules.nixvim - ]; - }; + modules = [ + ./hosts/lolcathost + ]; }; }; + + /* + homeConfigurations = { + me = home-manager.lib.homeManagerConfiguration { + specialArgs = {inherit inputs;}; + + modules = [ + ./home/me + #nixcord.homeManagerModules.nixcord + #nixvim.homeManagerModules.nixvim + ]; + }; + }; + */ + }; } diff --git a/homes/me/TODO b/homes/me/TODO deleted file mode 100644 index c4bfdc8..0000000 --- a/homes/me/TODO +++ /dev/null @@ -1,31 +0,0 @@ -Get Utilities: -1. httpie -2. curlie -3. zoxide -4. doggo - -1. Get helix editor -2. Custom helix -3. Complete helix tutorial - - - -Get waybar (or another bar) working - - -Get a better wallpaper - -Get a GRUB theme working - -Fix: your 131072x1 screen size is bogus. expect trouble - - -Push nixdots to github - - - -Have helix editor look differently depending on language - (specifically don't show indent indicators when editing nix files - - -Learn to package my own home-manager modules diff --git a/homes/me/default.nix b/homes/me/default.nix index dfeeb2e..41f231f 100755 --- a/homes/me/default.nix +++ b/homes/me/default.nix @@ -236,7 +236,16 @@ ]; }; - #nixcord.enable = true; + nixcord = { + enable = true; + config = { + frameless = true; + plugins = { + # TODO: remove this plugin + hideAttachments.enable = true; + }; + }; + }; firefox = { enable = true; diff --git a/hosts/lolcathost/default.nix b/hosts/lolcathost/default.nix index 1581a81..f4185d5 100755 --- a/hosts/lolcathost/default.nix +++ b/hosts/lolcathost/default.nix @@ -48,6 +48,9 @@ in { console = { font = "Lat2-Terminus16"; keyMap = "us"; + #packages = with pkgs; [ + # nerdfonts + #]; }; # ----- NETWORKING SECTION ----- @@ -81,6 +84,9 @@ in { # Enable touchpad support libinput.enable = true; + + tumbler.enable = true; # Thunar image thumbnail support + gvfs.enable = true; # Thunar mount, trash, and other functionality }; # allow wheel group to use passwordless sudo @@ -92,7 +98,7 @@ in { defaultUserShell = pkgs.bash; users = { - # just me fr (personal account) + # literally me fr (personal account) me = { isNormalUser = true; extraGroups = ["wheel"]; @@ -128,7 +134,7 @@ in { home-manager = { users.me = import ../../homes/me; sharedModules = [ - #inputs.nixcord.homeManagerModules.nixcord + inputs.nixcord.homeManagerModules.nixcord #inputs.nixvim.homeManagerModules.nixvim ]; }; @@ -180,22 +186,6 @@ in { zsh.enable = true; fish.enable = true; - neovim = { - enable = true; - defaultEditor = true; - viAlias = true; - vimAlias = true; - configure = { - customRC = '' - set number - set tabstop=4 - set shiftwidth=4 - - set mouse=a - ''; - }; - }; - # I want to use fish as my login shell but it always goes terrible # cause it isn't POSIX compliant, so instead Bash is my login and # will just exec fish (^-^) @@ -208,24 +198,30 @@ in { fi ''; }; + + # Thunar also uses: `services.tumbler` & `services.gvfs` + thunar = { + enable = true; + plugins = with pkgs.xfce; [ + thunar-volman # for removable drives (ie USBs) + thunar-archive-plugin # create and extract archives + thunar-media-tags-plugin # change metadata for media files + ]; + }; }; # ----- FONTS ----- fonts = { enableDefaultPackages = true; # no clue what this line does tbh packages = with pkgs; [ - (nerdfonts.override { - fonts = [ - "Cousine" # its already i guess - "Iosevka" # nah nah - "IosevkaTerm" # big nah - "CascadiaCode" # potential - "FiraCode" # potential - "JetBrainsMono" # for my rofi theme - "Hasklig" - "Hack" - ]; - }) + #(nerdfonts.override { + # fonts = [ + # "Cousine" + # "Iosevka" + # "JetBrainsMono" + # ]; + # }) + nerdfonts # texlive maintains a noto-emoji flake texlivePackages.noto-emoji diff --git a/hosts/lolcathost/default.nix.bak b/hosts/lolcathost/default.nix.bak new file mode 100755 index 0000000..c7f703e --- /dev/null +++ b/hosts/lolcathost/default.nix.bak @@ -0,0 +1,280 @@ +{ + pkgs, + inputs, + ... +}: let + home-manager = builtins.fetchTarball { + url = "https://github.com/nix-community/home-manager/archive/master.tar.gz"; + sha256 = "19w63qccz78v0spx03911z98w1bvlxvd07hb0ma14a4vdzi4ninj"; + }; +in { + imports = [ + ./hardware-configuration.nix + (import "${home-manager}/nixos") + inputs.spicetify-nix.nixosModules.default + ]; + + programs.spicetify = let + spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; + in { + enable = true; + enabledExtensions = with spicePkgs.extensions; [ + adblock + hidePodcasts + shuffle # shuffle+ (special characters are sanitized out of extension names) + ]; + #theme = spicePkgs.themes.catppuccin; + #colorScheme = "mocha"; + }; + + # Use the systemd-boot EFI boot loader. + boot.loader = { + efi = { + canTouchEfiVariables = true; + efiSysMountPoint = "/boot/efi"; + }; + grub = { + efiSupport = true; + #efiInstallAsRemovable = true; # in case canTouchEfiVariables doesn't work on this system + device = "nodev"; + }; + }; + + # Set your time zone. + time.timeZone = "Australia/Brisbane"; + + # Select internationalisation properties. + i18n.defaultLocale = "en_US.UTF-8"; + console = { + font = "Lat2-Terminus16"; + keyMap = "us"; + console.packages = with pkgs; [ + nerdfonts + ]; + }; + + # ----- NETWORKING SECTION ----- + networking.hostName = "lolcathost"; + networking.networkmana + + # Open ports in the fi + # networking.firewall.allowedTCPPorts = [ ... ]; + # networking.firewall.allowedUDPPorts = [ ... ]; + # Or disable the firewall altogether. + networking.firewall.enable = true; + + # ----- SERVICES ----- + services = { + # Set display manager (login screen) + #displayManager = { + # sddm = { + # enable = true; + # #theme = "${import ./sddm-theme.nix { inherit pkgs; }}"; + # wayland.enable = true; # enable experimental sddm support for wayland + # }; + # defaultSession = "hyprland"; + #}; + + # Enable sound + # TODO: use the modules/core/pipewire.nix module instead :) + pipewire = { + enable = true; + pulse.enable = true; + }; + + # Enable touchpad support + libinput.enable = true; + }; + + # allow wheel group to use passwordless sudo + users = { + # using fish as the login shell tends + # to go very poorly because it isn't + # POSIX compliant, so we'll just use + # simple Bash then :) + defaultUserShell = pkgs.bash; + + users = { + # just me fr (personal account) + me = { + isNormalUser = true; + extraGroups = ["wheel"]; + shell = pkgs.bash; #pkgs.fish + packages = with pkgs; [ + firefox + nitch + starfetch + tldr + ]; + }; + + # programming/development account + dev = { + isNormalUser = true; + extraGroups = ["wheel"]; + shell = pkgs.bash; #pkgs.zsh + packages = with pkgs; [ + ]; + }; + + # user for my professional jobs and stuff + ae = { + isNormalUser = true; + extraGroups = ["wheel"]; + shell = pkgs.bash; #pkgs.fish + packages = with pkgs; [ + ]; + }; + }; + }; + + home-manager = { + users.me = import ../../homes/me; + sharedModules = [ + #inputs.nixcord.homeManagerModules.nixcord + #inputs.nixvim.homeManagerModules.nixvim + ]; + }; + + # ---- SYSTEM PACKAGES ----- + environment.systemPackages = with pkgs; [ + # User Environment + inputs.swww.packages.${pkgs.system}.swww + #vesktop + helvum + easyeffects + ani-cli + wl-clipboard # clipboard for wayland + + python311 # I use 3.11 since it's in a pretty stable state now + poetry # python dependency management and packaging + + # fish plugins + grc # colorise command outputs + + httpie + curlie + zoxide + doggo + + # Pretty necessary + git + brightnessctl + acpi + + # Unix Commands + wget + tree + ]; + + # Enable the use of certain programs + programs = { + hyprland = { + enable = true; + # set the flake package + package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland; + # make sure to also set the portal package, so that they are in sync + portalPackage = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland; + + xwayland.enable = true; + #systemd.enable = true; + }; + + zsh.enable = true; + fish.enable = true; + + neovim = { + enable = true; + defaultEditor = true; + viAlias = true; + vimAlias = true; + configure = { + customRC = '' + set number + set tabstop=4 + set shiftwidth=4 + + set mouse=a + ''; + }; + }; + + # I want to use fish as my login shell but it always goes terrible + # cause it isn't POSIX compliant, so instead Bash is my login and + # will just exec fish (^-^) + bash = { + interactiveShellInit = '' + if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]] + then + shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION="" + exec ${pkgs.fish}/bin/fish $LOGIN_OPTION + fi + ''; + }; + }; + + # ----- FONTS ----- + fonts = { + enableDefaultPackages = true; # no clue what this line does tbh + packages = with pkgs; [ + (nerdfonts.override { + fonts = [ + "Cousine" + "Iosevka" + ]; + }) + + # texlive maintains a noto-emoji flake + texlivePackages.noto-emoji + ]; + + fontconfig = { + defaultFonts = { + serif = ["Iosevka"]; # TODO: package Iosevka Etoile since Iosevka isn't a serif font + sansSerif = ["Iosevka "]; + monospace = ["Cousine"]; + emoji = ["Noto Emoji"]; + }; + }; + }; + + # ----- STYLIX ----- + + #stylix = { + # enable = true; + # image = pkgs.fetchurl { + # url = "https://www.pixelstalk.net/wp-content/uploads/2016/05/Epic-Anime-Awesome-Wallpapers.jpg"; + # sha256 = "enQo3wqhgf0FEPHj2coOCvo7DuZv+x5rL/WIo4qPI50="; + # }; + # + # # Stylix will automatically theme applications + # #autoEnable = true; + # #image = ../../wallpapers/wall.png; + # #image = "/home/me/nixdots/wallpapers/ghibli-esque-valley.png"; + #}; + + # Enable the new CLI commands and the flakes as experimental features + nix.settings.experimental-features = [ + "nix-command" + "flakes" + ]; + + # Some programs need SUID wrappers, can be configured further or are + # started in user sessions. + # programs.mtr.enable = true; + # programs.gnupg.agent = { + # enable = true; + # enableSSHSupport = true; + # }; + + # Enable the OpenSSH daemon. + # services.openssh.enable = true; + + # Enable OpenGL + hardware = { + graphics.enable = true; + }; + + # DO NOT MODIFY + system.stateVersion = "24.05"; # Did you read the comment? +} diff --git a/result b/result new file mode 120000 index 0000000..9f9ebca --- /dev/null +++ b/result @@ -0,0 +1 @@ +/nix/store/8fhj8clwhgkf9yqbsjvvyf5hzgnmd98g-nixos-system-lolcathost-24.11.20241102.7ffd9ae \ No newline at end of file diff --git a/try-this b/try-this new file mode 100644 index 0000000..6287e39 --- /dev/null +++ b/try-this @@ -0,0 +1 @@ +nixos-rebuild build --flake .# --cores 8 -j 1 From 123c92b1b6428eb3ff744a4394bb11f3ee2fccbf Mon Sep 17 00:00:00 2001 From: Emile Clark-Boman Date: Fri, 8 Nov 2024 04:08:30 +1000 Subject: [PATCH 017/328] more cleaning and formatting --- TODO | 38 ++-- flake.lock | 340 +++-------------------------------- flake.nix | 24 --- homes/me/default.nix | 53 +++--- hosts/lolcathost/default.nix | 49 +++-- 5 files changed, 105 insertions(+), 399 deletions(-) diff --git a/TODO b/TODO index 05a5141..489093b 100644 --- a/TODO +++ b/TODO @@ -9,45 +9,58 @@ Get Utilities: 3. Complete helix tutorial Get nixcord working -Get thunar working and configured +Get thunar working +Set a GTK theme & icon theme +Get better wallpapers +Get hyprcursor working with Bibata-Modern-Ice + + + +Overtime just install more programs that I need regularly: ie +- btop/htop/etc + + +Get a QT theme + Get waybar (or another bar) working -Bind new terminal to SUPER+Enter instead of SUPER+Q +Get a GRUB theme working -Get a better wallpapers +Get SDDM and a theme working + +Fix pipewire audio is so incredibly low (happens on laptop and PC) + + +Bind new terminal to SUPER+Enter instead of SUPER+Q Join Rio Terminal's discord and ask if they support nerdfonts or if I'm doing something wrong Figure out how to modularise my dotfiles -Configure nixcord - Change Dell loading screen (Boot Graphics Resource Table, aka BGRT) +Get GTK Bibata Cursors to be the same size as my system cursor -Get hyprcursor working with Bibata-Modern-Ice -Install and configure hyprland plugins like hyprlock - -Get a GRUB theme working Fix: your 131072x1 screen size is bogus. expect trouble Are there plugins for helix? +Search for all "TODO" items in my nix dotfiles Push nixdots to github + +Check out the Ekala Project (I joined their discord server) + Create a program that enables/disables passwordless sudo access (add to github too) - - - Have helix editor look differently depending on language (specifically don't show indent indicators when editing nix files @@ -58,7 +71,6 @@ Learn to package my own home-manager modules - Fork nixcord and fix documentation (the installation is confusing) But firstly the first code snippet is wrong... ```nix diff --git a/flake.lock b/flake.lock index adee7a7..b0bac9c 100755 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ ] }, "locked": { - "lastModified": 1729527199, - "narHash": "sha256-D5/YksfRga8Akd04ZtIkuYSIOjXVrAzQIQBSeplokzU=", + "lastModified": 1730968822, + "narHash": "sha256-NocDjINsh6ismkhb0Xr6xPRksmhuB2WGf8ZmXMhxu7Y=", "owner": "hyprwm", "repo": "aquamarine", - "rev": "8d732fa8aff8b12ef2b1e2f00fc8153e41312b72", + "rev": "a49bc3583ff223f426cb3526fdaa4bcaa247ec14", "type": "github" }, "original": { @@ -33,27 +33,6 @@ "type": "github" } }, - "devshell": { - "inputs": { - "nixpkgs": [ - "nixvim", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1728330715, - "narHash": "sha256-xRJ2nPOXb//u1jaBnDP56M7v5ldavjbtR6lfGqSvcKg=", - "owner": "numtide", - "repo": "devshell", - "rev": "dd6b80932022cea34a019e2bb32f6fa9e494dfef", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "devshell", - "type": "github" - } - }, "flake-compat": { "flake": false, "locked": { @@ -85,17 +64,19 @@ } }, "flake-compat_3": { + "flake": false, "locked": { "lastModified": 1696426674, "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", - "revCount": 57, - "type": "tarball", - "url": "https://api.flakehub.com/f/pinned/edolstra/flake-compat/1.0.1/018afb31-abd1-7bff-a5e4-cff7e18efb7a/source.tar.gz" + "type": "github" }, "original": { - "type": "tarball", - "url": "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz" + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" } }, "flake-compat_4": { @@ -114,91 +95,6 @@ "type": "github" } }, - "flake-compat_5": { - "flake": false, - "locked": { - "lastModified": 1696426674, - "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", - "type": "github" - }, - "original": { - "owner": "edolstra", - "repo": "flake-compat", - "type": "github" - } - }, - "flake-parts": { - "inputs": { - "nixpkgs-lib": [ - "nixvim", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1730504689, - "narHash": "sha256-hgmguH29K2fvs9szpq2r3pz2/8cJd2LPS+b4tfNFCwE=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "506278e768c2a08bec68eb62932193e341f55c90", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "flake-parts", - "type": "github" - } - }, - "flake-utils": { - "inputs": { - "systems": "systems_2" - }, - "locked": { - "lastModified": 1726560853, - "narHash": "sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "git-hooks": { - "inputs": { - "flake-compat": [ - "nixvim", - "flake-compat" - ], - "gitignore": "gitignore_2", - "nixpkgs": [ - "nixvim", - "nixpkgs" - ], - "nixpkgs-stable": [ - "nixvim", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1730302582, - "narHash": "sha256-W1MIJpADXQCgosJZT8qBYLRuZls2KSiKdpnTVdKBuvU=", - "owner": "cachix", - "repo": "git-hooks.nix", - "rev": "af8a16fe5c264f5e9e18bcee2859b40a656876cf", - "type": "github" - }, - "original": { - "owner": "cachix", - "repo": "git-hooks.nix", - "type": "github" - } - }, "gitignore": { "inputs": { "nixpkgs": [ @@ -221,28 +117,6 @@ "type": "github" } }, - "gitignore_2": { - "inputs": { - "nixpkgs": [ - "nixvim", - "git-hooks", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1709087332, - "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", - "owner": "hercules-ci", - "repo": "gitignore.nix", - "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "gitignore.nix", - "type": "github" - } - }, "grub2-themes": { "inputs": { "nixpkgs": "nixpkgs" @@ -281,27 +155,6 @@ "type": "github" } }, - "home-manager_2": { - "inputs": { - "nixpkgs": [ - "nixvim", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1730633670, - "narHash": "sha256-ZFJqIXpvVKvzOVFKWNRDyIyAo+GYdmEPaYi1bZB6uf0=", - "owner": "nix-community", - "repo": "home-manager", - "rev": "8f6ca7855d409aeebe2a582c6fd6b6a8d0bf5661", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "home-manager", - "type": "github" - } - }, "hyprcursor": { "inputs": { "hyprlang": [ @@ -345,11 +198,11 @@ "xdph": "xdph" }, "locked": { - "lastModified": 1730800743, - "narHash": "sha256-DmlaerjZowNAc/NCrVHKwvAMBJYPVFx4YLs0Ad2Jo5g=", + "lastModified": 1730969692, + "narHash": "sha256-4Ly9zkqnRB6qLjMeddfUyd4iRLvq+RDspBWABS8DGN4=", "owner": "hyprwm", "repo": "Hyprland", - "rev": "e3882b23d09aad7f5c3a708536c87b062f3b0d8d", + "rev": "e58e97b0a38b8ccc87a4304c9e4e2b37c9966875", "type": "github" }, "original": { @@ -424,11 +277,11 @@ ] }, "locked": { - "lastModified": 1728941256, - "narHash": "sha256-WRypmcZ2Bw94lLmcmxYokVOHPJSZ7T06V49QZ4tkZeQ=", + "lastModified": 1730968903, + "narHash": "sha256-zFvzLXcSm0Ia4XI1SE4FQ9KE63hlGrRWhLtwMolWuR8=", "owner": "hyprwm", "repo": "hyprutils", - "rev": "fd4be8b9ca932f7384e454bcd923c5451ef2aa85", + "rev": "3ce0cde8709cdacbfba471f8e828433b58a561e9", "type": "github" }, "original": { @@ -462,55 +315,6 @@ "type": "github" } }, - "ixx": { - "inputs": { - "flake-utils": [ - "nixvim", - "nuschtosSearch", - "flake-utils" - ], - "nixpkgs": [ - "nixvim", - "nuschtosSearch", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1729544999, - "narHash": "sha256-YcyJLvTmN6uLEBGCvYoMLwsinblXMkoYkNLEO4WnKus=", - "owner": "NuschtOS", - "repo": "ixx", - "rev": "65c207c92befec93e22086da9456d3906a4e999c", - "type": "github" - }, - "original": { - "owner": "NuschtOS", - "ref": "v0.0.5", - "repo": "ixx", - "type": "github" - } - }, - "nix-darwin": { - "inputs": { - "nixpkgs": [ - "nixvim", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1730600078, - "narHash": "sha256-BoyFmE59HDF3uybBySsWVoyjNuHvz3Wv8row/mSb958=", - "owner": "lnl7", - "repo": "nix-darwin", - "rev": "4652874d014b82cb746173ffc64f6a70044daa7e", - "type": "github" - }, - "original": { - "owner": "lnl7", - "repo": "nix-darwin", - "type": "github" - } - }, "nixcord": { "inputs": { "flake-compat": "flake-compat_2", @@ -548,11 +352,11 @@ }, "nixpkgs-stable": { "locked": { - "lastModified": 1720386169, - "narHash": "sha256-NGKVY4PjzwAa4upkGtAMz1npHGoRzWotlSnVlqI40mo=", + "lastModified": 1730741070, + "narHash": "sha256-edm8WG19kWozJ/GqyYx2VjW99EdhjKwbY3ZwdlPAAlo=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "194846768975b7ad2c4988bdb82572c00222c0d7", + "rev": "d063c1dd113c91ab27959ba540c0d9753409edf3", "type": "github" }, "original": { @@ -564,11 +368,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1730531603, - "narHash": "sha256-Dqg6si5CqIzm87sp57j5nTaeBbWhHFaVyG7V6L8k3lY=", + "lastModified": 1730785428, + "narHash": "sha256-Zwl8YgTVJTEum+L+0zVAWvXAGbWAuXHax3KzuejaDyo=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "7ffd9ae656aec493492b44d0ddfb28e79a1ea25d", + "rev": "4aa36568d413aca0ea84a1684d2d46f55dbabad7", "type": "github" }, "original": { @@ -626,57 +430,6 @@ "type": "github" } }, - "nixvim": { - "inputs": { - "devshell": "devshell", - "flake-compat": "flake-compat_3", - "flake-parts": "flake-parts", - "git-hooks": "git-hooks", - "home-manager": "home-manager_2", - "nix-darwin": "nix-darwin", - "nixpkgs": [ - "nixpkgs" - ], - "nuschtosSearch": "nuschtosSearch", - "treefmt-nix": "treefmt-nix" - }, - "locked": { - "lastModified": 1730792264, - "narHash": "sha256-Ue3iywjyaNOxXgw7esVSBX3bZzM2bSPubZamYsBKIG8=", - "owner": "nix-community", - "repo": "nixvim", - "rev": "3d24cb72618738130e6af9c644c81fe42aa34ebc", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "nixvim", - "type": "github" - } - }, - "nuschtosSearch": { - "inputs": { - "flake-utils": "flake-utils", - "ixx": "ixx", - "nixpkgs": [ - "nixvim", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1730515563, - "narHash": "sha256-8lklUZRV7nwkPLF3roxzi4C2oyLydDXyAzAnDvjkOms=", - "owner": "NuschtOS", - "repo": "search", - "rev": "9e22bd742480916ff5d0ab20ca2522eaa3fa061e", - "type": "github" - }, - "original": { - "owner": "NuschtOS", - "repo": "search", - "type": "github" - } - }, "pre-commit-hooks": { "inputs": { "flake-compat": "flake-compat", @@ -688,11 +441,11 @@ "nixpkgs-stable": "nixpkgs-stable" }, "locked": { - "lastModified": 1729104314, - "narHash": "sha256-pZRZsq5oCdJt3upZIU4aslS9XwFJ+/nVtALHIciX/BI=", + "lastModified": 1730814269, + "narHash": "sha256-fWPHyhYE6xvMI1eGY3pwBTq85wcy1YXqdzTZF+06nOg=", "owner": "cachix", "repo": "git-hooks.nix", - "rev": "3c3e88f0f544d6bb54329832616af7eb971b6be6", + "rev": "d70155fdc00df4628446352fc58adc640cd705c2", "type": "github" }, "original": { @@ -708,14 +461,13 @@ "hyprland": "hyprland", "nixcord": "nixcord", "nixpkgs": "nixpkgs_4", - "nixvim": "nixvim", "spicetify-nix": "spicetify-nix", "swww": "swww" } }, "spicetify-nix": { "inputs": { - "flake-compat": "flake-compat_4", + "flake-compat": "flake-compat_3", "nixpkgs": [ "nixpkgs" ] @@ -736,7 +488,7 @@ }, "swww": { "inputs": { - "flake-compat": "flake-compat_5", + "flake-compat": "flake-compat_4", "nixpkgs": "nixpkgs_5", "utils": "utils" }, @@ -784,45 +536,9 @@ "type": "github" } }, - "systems_3": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - }, - "treefmt-nix": { - "inputs": { - "nixpkgs": [ - "nixvim", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1730321837, - "narHash": "sha256-vK+a09qq19QNu2MlLcvN4qcRctJbqWkX7ahgPZ/+maI=", - "owner": "numtide", - "repo": "treefmt-nix", - "rev": "746901bb8dba96d154b66492a29f5db0693dbfcc", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "treefmt-nix", - "type": "github" - } - }, "utils": { "inputs": { - "systems": "systems_3" + "systems": "systems_2" }, "locked": { "lastModified": 1726560853, diff --git a/flake.nix b/flake.nix index 7f6c563..5ca40a8 100755 --- a/flake.nix +++ b/flake.nix @@ -14,17 +14,10 @@ inputs.nixpkgs.follows = "nixpkgs"; }; - #stylix.url = "github:danth/stylix"; - nixcord = { url = "github:kaylorben/nixcord"; }; - nixvim = { - url = "github:nix-community/nixvim"; - inputs.nixpkgs.follows = "nixpkgs"; - }; - grub2-themes = {url = "github:vinceliuice/grub2-themes";}; # is this necessary? (aren't I enabling it in `configuration.nix` anyways?) @@ -39,9 +32,7 @@ home-manager, hyprland, grub2-themes, - nixvim, nixcord, - #stylix, ... } @ inputs: let system = "x86_64-linux"; @@ -63,7 +54,6 @@ modules = [ ./hosts/myputer grub2-themes.nixosModules.default - #stylix.nixosModules.stylix ]; }; @@ -76,19 +66,5 @@ ]; }; }; - - /* - homeConfigurations = { - me = home-manager.lib.homeManagerConfiguration { - specialArgs = {inherit inputs;}; - - modules = [ - ./home/me - #nixcord.homeManagerModules.nixcord - #nixvim.homeManagerModules.nixvim - ]; - }; - }; - */ }; } diff --git a/homes/me/default.nix b/homes/me/default.nix index 41f231f..d899f66 100755 --- a/homes/me/default.nix +++ b/homes/me/default.nix @@ -34,25 +34,6 @@ }; */ - # ----- STYLIX ----- - - #stylix = { - # enable = true; - # - # image = pkgs.fetchurl { - # url = "https://www.pixelstalk.net/wp-content/uploads/2016/05/Epic-Anime-Awesome-Wallpapers.jpg"; - # sha256 = "enQo3wqhgf0FEPHj2coOCvo7DuZv+x5rL/WIo4qPI50="; - # }; - # - # # Stylix will automatically theme applications - # autoEnable = true; - # targets = { - # # disable Stylix's themes for ones I will theme manually - # firefox.enable = false; - # wofi.enable = false; - # }; - #}; - home = { username = "me"; homeDirectory = "/home/me"; @@ -66,6 +47,37 @@ }; }; + gtk = { + enable = true; + font.name = "Victor Mono SemiBold 12"; + theme = { + name = "Dracula"; + package = pkgs.dracula-theme; + }; + iconTheme = { + name = "kora"; + package = pkgs.kora-icon-theme; + }; + # TODO: use a variable to mirror this cursor size + # with the `home.pointerCurser.size` + cursorTheme = { + # dont set the theme (use system default instead) + # only set size to match the system + package = pkgs.bibata-cursors; + name = "Bibata-Modern-Ice"; + size = 16; + }; + }; + + # TODO: this lowkey doesnt work... (maybe the name "Dracula" is wrong?) + qt = { + enable = true; + style = { + name = "Dracula"; + package = pkgs.dracula-qt5-theme; + }; + }; + programs = { # these are both required for home-manager to work home-manager.enable = true; @@ -185,6 +197,7 @@ statusline = { left = [ "mode" + "spacer" "version-control" "spinner" ]; @@ -196,10 +209,8 @@ right = [ "position" "total-line-numbers" - "separator" "file-encoding" "file-line-ending" - "separator" "file-type" ]; separator = "|"; diff --git a/hosts/lolcathost/default.nix b/hosts/lolcathost/default.nix index f4185d5..9af4fc4 100755 --- a/hosts/lolcathost/default.nix +++ b/hosts/lolcathost/default.nix @@ -107,16 +107,6 @@ in { firefox nitch starfetch - tldr - ]; - }; - - # programming/development account - dev = { - isNormalUser = true; - extraGroups = ["wheel"]; - shell = pkgs.bash; #pkgs.zsh - packages = with pkgs; [ ]; }; @@ -128,6 +118,23 @@ in { packages = with pkgs; [ ]; }; + + # # programming/development account + # dev = { + # isNormalUser = true; + # extraGroups = ["wheel"]; + # shell = pkgs.bash; #pkgs.zsh + # packages = with pkgs; [ + # ]; + # }; + + # user for friends to ssh into + friends = { + isNormalUser = true; + shell = pkgs.fish; + packages = with pkgs; [ + ]; + }; }; }; @@ -135,7 +142,6 @@ in { users.me = import ../../homes/me; sharedModules = [ inputs.nixcord.homeManagerModules.nixcord - #inputs.nixvim.homeManagerModules.nixvim ]; }; @@ -148,6 +154,7 @@ in { easyeffects ani-cli wl-clipboard # clipboard for wayland + kcalc # TEMP: (FOR TESTING) python311 # I use 3.11 since it's in a pretty stable state now poetry # python dependency management and packaging @@ -159,6 +166,7 @@ in { curlie zoxide doggo + tldr # Pretty necessary git @@ -168,19 +176,17 @@ in { # Unix Commands wget tree + unzip ]; # Enable the use of certain programs programs = { hyprland = { enable = true; - # set the flake package package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland; - # make sure to also set the portal package, so that they are in sync portalPackage = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland; xwayland.enable = true; - #systemd.enable = true; }; zsh.enable = true; @@ -237,21 +243,6 @@ in { }; }; - # ----- STYLIX ----- - - #stylix = { - # enable = true; - # image = pkgs.fetchurl { - # url = "https://www.pixelstalk.net/wp-content/uploads/2016/05/Epic-Anime-Awesome-Wallpapers.jpg"; - # sha256 = "enQo3wqhgf0FEPHj2coOCvo7DuZv+x5rL/WIo4qPI50="; - # }; - # - # # Stylix will automatically theme applications - # #autoEnable = true; - # #image = ../../wallpapers/wall.png; - # #image = "/home/me/nixdots/wallpapers/ghibli-esque-valley.png"; - #}; - # Enable the new CLI commands and the flakes as experimental features nix.settings.experimental-features = [ "nix-command" From 552fd657be3d2a8ccf5878e1d7906fb828fda2c4 Mon Sep 17 00:00:00 2001 From: _cry64 Date: Fri, 8 Nov 2024 04:08:30 +1000 Subject: [PATCH 018/328] more cleaning and formatting --- TODO | 38 ++-- flake.lock | 340 +++-------------------------------- flake.nix | 24 --- homes/me/default.nix | 53 +++--- hosts/lolcathost/default.nix | 49 +++-- 5 files changed, 105 insertions(+), 399 deletions(-) diff --git a/TODO b/TODO index 05a5141..489093b 100644 --- a/TODO +++ b/TODO @@ -9,45 +9,58 @@ Get Utilities: 3. Complete helix tutorial Get nixcord working -Get thunar working and configured +Get thunar working +Set a GTK theme & icon theme +Get better wallpapers +Get hyprcursor working with Bibata-Modern-Ice + + + +Overtime just install more programs that I need regularly: ie +- btop/htop/etc + + +Get a QT theme + Get waybar (or another bar) working -Bind new terminal to SUPER+Enter instead of SUPER+Q +Get a GRUB theme working -Get a better wallpapers +Get SDDM and a theme working + +Fix pipewire audio is so incredibly low (happens on laptop and PC) + + +Bind new terminal to SUPER+Enter instead of SUPER+Q Join Rio Terminal's discord and ask if they support nerdfonts or if I'm doing something wrong Figure out how to modularise my dotfiles -Configure nixcord - Change Dell loading screen (Boot Graphics Resource Table, aka BGRT) +Get GTK Bibata Cursors to be the same size as my system cursor -Get hyprcursor working with Bibata-Modern-Ice -Install and configure hyprland plugins like hyprlock - -Get a GRUB theme working Fix: your 131072x1 screen size is bogus. expect trouble Are there plugins for helix? +Search for all "TODO" items in my nix dotfiles Push nixdots to github + +Check out the Ekala Project (I joined their discord server) + Create a program that enables/disables passwordless sudo access (add to github too) - - - Have helix editor look differently depending on language (specifically don't show indent indicators when editing nix files @@ -58,7 +71,6 @@ Learn to package my own home-manager modules - Fork nixcord and fix documentation (the installation is confusing) But firstly the first code snippet is wrong... ```nix diff --git a/flake.lock b/flake.lock index adee7a7..b0bac9c 100755 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ ] }, "locked": { - "lastModified": 1729527199, - "narHash": "sha256-D5/YksfRga8Akd04ZtIkuYSIOjXVrAzQIQBSeplokzU=", + "lastModified": 1730968822, + "narHash": "sha256-NocDjINsh6ismkhb0Xr6xPRksmhuB2WGf8ZmXMhxu7Y=", "owner": "hyprwm", "repo": "aquamarine", - "rev": "8d732fa8aff8b12ef2b1e2f00fc8153e41312b72", + "rev": "a49bc3583ff223f426cb3526fdaa4bcaa247ec14", "type": "github" }, "original": { @@ -33,27 +33,6 @@ "type": "github" } }, - "devshell": { - "inputs": { - "nixpkgs": [ - "nixvim", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1728330715, - "narHash": "sha256-xRJ2nPOXb//u1jaBnDP56M7v5ldavjbtR6lfGqSvcKg=", - "owner": "numtide", - "repo": "devshell", - "rev": "dd6b80932022cea34a019e2bb32f6fa9e494dfef", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "devshell", - "type": "github" - } - }, "flake-compat": { "flake": false, "locked": { @@ -85,17 +64,19 @@ } }, "flake-compat_3": { + "flake": false, "locked": { "lastModified": 1696426674, "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", - "revCount": 57, - "type": "tarball", - "url": "https://api.flakehub.com/f/pinned/edolstra/flake-compat/1.0.1/018afb31-abd1-7bff-a5e4-cff7e18efb7a/source.tar.gz" + "type": "github" }, "original": { - "type": "tarball", - "url": "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz" + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" } }, "flake-compat_4": { @@ -114,91 +95,6 @@ "type": "github" } }, - "flake-compat_5": { - "flake": false, - "locked": { - "lastModified": 1696426674, - "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", - "type": "github" - }, - "original": { - "owner": "edolstra", - "repo": "flake-compat", - "type": "github" - } - }, - "flake-parts": { - "inputs": { - "nixpkgs-lib": [ - "nixvim", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1730504689, - "narHash": "sha256-hgmguH29K2fvs9szpq2r3pz2/8cJd2LPS+b4tfNFCwE=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "506278e768c2a08bec68eb62932193e341f55c90", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "flake-parts", - "type": "github" - } - }, - "flake-utils": { - "inputs": { - "systems": "systems_2" - }, - "locked": { - "lastModified": 1726560853, - "narHash": "sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "git-hooks": { - "inputs": { - "flake-compat": [ - "nixvim", - "flake-compat" - ], - "gitignore": "gitignore_2", - "nixpkgs": [ - "nixvim", - "nixpkgs" - ], - "nixpkgs-stable": [ - "nixvim", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1730302582, - "narHash": "sha256-W1MIJpADXQCgosJZT8qBYLRuZls2KSiKdpnTVdKBuvU=", - "owner": "cachix", - "repo": "git-hooks.nix", - "rev": "af8a16fe5c264f5e9e18bcee2859b40a656876cf", - "type": "github" - }, - "original": { - "owner": "cachix", - "repo": "git-hooks.nix", - "type": "github" - } - }, "gitignore": { "inputs": { "nixpkgs": [ @@ -221,28 +117,6 @@ "type": "github" } }, - "gitignore_2": { - "inputs": { - "nixpkgs": [ - "nixvim", - "git-hooks", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1709087332, - "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", - "owner": "hercules-ci", - "repo": "gitignore.nix", - "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "gitignore.nix", - "type": "github" - } - }, "grub2-themes": { "inputs": { "nixpkgs": "nixpkgs" @@ -281,27 +155,6 @@ "type": "github" } }, - "home-manager_2": { - "inputs": { - "nixpkgs": [ - "nixvim", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1730633670, - "narHash": "sha256-ZFJqIXpvVKvzOVFKWNRDyIyAo+GYdmEPaYi1bZB6uf0=", - "owner": "nix-community", - "repo": "home-manager", - "rev": "8f6ca7855d409aeebe2a582c6fd6b6a8d0bf5661", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "home-manager", - "type": "github" - } - }, "hyprcursor": { "inputs": { "hyprlang": [ @@ -345,11 +198,11 @@ "xdph": "xdph" }, "locked": { - "lastModified": 1730800743, - "narHash": "sha256-DmlaerjZowNAc/NCrVHKwvAMBJYPVFx4YLs0Ad2Jo5g=", + "lastModified": 1730969692, + "narHash": "sha256-4Ly9zkqnRB6qLjMeddfUyd4iRLvq+RDspBWABS8DGN4=", "owner": "hyprwm", "repo": "Hyprland", - "rev": "e3882b23d09aad7f5c3a708536c87b062f3b0d8d", + "rev": "e58e97b0a38b8ccc87a4304c9e4e2b37c9966875", "type": "github" }, "original": { @@ -424,11 +277,11 @@ ] }, "locked": { - "lastModified": 1728941256, - "narHash": "sha256-WRypmcZ2Bw94lLmcmxYokVOHPJSZ7T06V49QZ4tkZeQ=", + "lastModified": 1730968903, + "narHash": "sha256-zFvzLXcSm0Ia4XI1SE4FQ9KE63hlGrRWhLtwMolWuR8=", "owner": "hyprwm", "repo": "hyprutils", - "rev": "fd4be8b9ca932f7384e454bcd923c5451ef2aa85", + "rev": "3ce0cde8709cdacbfba471f8e828433b58a561e9", "type": "github" }, "original": { @@ -462,55 +315,6 @@ "type": "github" } }, - "ixx": { - "inputs": { - "flake-utils": [ - "nixvim", - "nuschtosSearch", - "flake-utils" - ], - "nixpkgs": [ - "nixvim", - "nuschtosSearch", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1729544999, - "narHash": "sha256-YcyJLvTmN6uLEBGCvYoMLwsinblXMkoYkNLEO4WnKus=", - "owner": "NuschtOS", - "repo": "ixx", - "rev": "65c207c92befec93e22086da9456d3906a4e999c", - "type": "github" - }, - "original": { - "owner": "NuschtOS", - "ref": "v0.0.5", - "repo": "ixx", - "type": "github" - } - }, - "nix-darwin": { - "inputs": { - "nixpkgs": [ - "nixvim", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1730600078, - "narHash": "sha256-BoyFmE59HDF3uybBySsWVoyjNuHvz3Wv8row/mSb958=", - "owner": "lnl7", - "repo": "nix-darwin", - "rev": "4652874d014b82cb746173ffc64f6a70044daa7e", - "type": "github" - }, - "original": { - "owner": "lnl7", - "repo": "nix-darwin", - "type": "github" - } - }, "nixcord": { "inputs": { "flake-compat": "flake-compat_2", @@ -548,11 +352,11 @@ }, "nixpkgs-stable": { "locked": { - "lastModified": 1720386169, - "narHash": "sha256-NGKVY4PjzwAa4upkGtAMz1npHGoRzWotlSnVlqI40mo=", + "lastModified": 1730741070, + "narHash": "sha256-edm8WG19kWozJ/GqyYx2VjW99EdhjKwbY3ZwdlPAAlo=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "194846768975b7ad2c4988bdb82572c00222c0d7", + "rev": "d063c1dd113c91ab27959ba540c0d9753409edf3", "type": "github" }, "original": { @@ -564,11 +368,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1730531603, - "narHash": "sha256-Dqg6si5CqIzm87sp57j5nTaeBbWhHFaVyG7V6L8k3lY=", + "lastModified": 1730785428, + "narHash": "sha256-Zwl8YgTVJTEum+L+0zVAWvXAGbWAuXHax3KzuejaDyo=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "7ffd9ae656aec493492b44d0ddfb28e79a1ea25d", + "rev": "4aa36568d413aca0ea84a1684d2d46f55dbabad7", "type": "github" }, "original": { @@ -626,57 +430,6 @@ "type": "github" } }, - "nixvim": { - "inputs": { - "devshell": "devshell", - "flake-compat": "flake-compat_3", - "flake-parts": "flake-parts", - "git-hooks": "git-hooks", - "home-manager": "home-manager_2", - "nix-darwin": "nix-darwin", - "nixpkgs": [ - "nixpkgs" - ], - "nuschtosSearch": "nuschtosSearch", - "treefmt-nix": "treefmt-nix" - }, - "locked": { - "lastModified": 1730792264, - "narHash": "sha256-Ue3iywjyaNOxXgw7esVSBX3bZzM2bSPubZamYsBKIG8=", - "owner": "nix-community", - "repo": "nixvim", - "rev": "3d24cb72618738130e6af9c644c81fe42aa34ebc", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "nixvim", - "type": "github" - } - }, - "nuschtosSearch": { - "inputs": { - "flake-utils": "flake-utils", - "ixx": "ixx", - "nixpkgs": [ - "nixvim", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1730515563, - "narHash": "sha256-8lklUZRV7nwkPLF3roxzi4C2oyLydDXyAzAnDvjkOms=", - "owner": "NuschtOS", - "repo": "search", - "rev": "9e22bd742480916ff5d0ab20ca2522eaa3fa061e", - "type": "github" - }, - "original": { - "owner": "NuschtOS", - "repo": "search", - "type": "github" - } - }, "pre-commit-hooks": { "inputs": { "flake-compat": "flake-compat", @@ -688,11 +441,11 @@ "nixpkgs-stable": "nixpkgs-stable" }, "locked": { - "lastModified": 1729104314, - "narHash": "sha256-pZRZsq5oCdJt3upZIU4aslS9XwFJ+/nVtALHIciX/BI=", + "lastModified": 1730814269, + "narHash": "sha256-fWPHyhYE6xvMI1eGY3pwBTq85wcy1YXqdzTZF+06nOg=", "owner": "cachix", "repo": "git-hooks.nix", - "rev": "3c3e88f0f544d6bb54329832616af7eb971b6be6", + "rev": "d70155fdc00df4628446352fc58adc640cd705c2", "type": "github" }, "original": { @@ -708,14 +461,13 @@ "hyprland": "hyprland", "nixcord": "nixcord", "nixpkgs": "nixpkgs_4", - "nixvim": "nixvim", "spicetify-nix": "spicetify-nix", "swww": "swww" } }, "spicetify-nix": { "inputs": { - "flake-compat": "flake-compat_4", + "flake-compat": "flake-compat_3", "nixpkgs": [ "nixpkgs" ] @@ -736,7 +488,7 @@ }, "swww": { "inputs": { - "flake-compat": "flake-compat_5", + "flake-compat": "flake-compat_4", "nixpkgs": "nixpkgs_5", "utils": "utils" }, @@ -784,45 +536,9 @@ "type": "github" } }, - "systems_3": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - }, - "treefmt-nix": { - "inputs": { - "nixpkgs": [ - "nixvim", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1730321837, - "narHash": "sha256-vK+a09qq19QNu2MlLcvN4qcRctJbqWkX7ahgPZ/+maI=", - "owner": "numtide", - "repo": "treefmt-nix", - "rev": "746901bb8dba96d154b66492a29f5db0693dbfcc", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "treefmt-nix", - "type": "github" - } - }, "utils": { "inputs": { - "systems": "systems_3" + "systems": "systems_2" }, "locked": { "lastModified": 1726560853, diff --git a/flake.nix b/flake.nix index 7f6c563..5ca40a8 100755 --- a/flake.nix +++ b/flake.nix @@ -14,17 +14,10 @@ inputs.nixpkgs.follows = "nixpkgs"; }; - #stylix.url = "github:danth/stylix"; - nixcord = { url = "github:kaylorben/nixcord"; }; - nixvim = { - url = "github:nix-community/nixvim"; - inputs.nixpkgs.follows = "nixpkgs"; - }; - grub2-themes = {url = "github:vinceliuice/grub2-themes";}; # is this necessary? (aren't I enabling it in `configuration.nix` anyways?) @@ -39,9 +32,7 @@ home-manager, hyprland, grub2-themes, - nixvim, nixcord, - #stylix, ... } @ inputs: let system = "x86_64-linux"; @@ -63,7 +54,6 @@ modules = [ ./hosts/myputer grub2-themes.nixosModules.default - #stylix.nixosModules.stylix ]; }; @@ -76,19 +66,5 @@ ]; }; }; - - /* - homeConfigurations = { - me = home-manager.lib.homeManagerConfiguration { - specialArgs = {inherit inputs;}; - - modules = [ - ./home/me - #nixcord.homeManagerModules.nixcord - #nixvim.homeManagerModules.nixvim - ]; - }; - }; - */ }; } diff --git a/homes/me/default.nix b/homes/me/default.nix index 41f231f..d899f66 100755 --- a/homes/me/default.nix +++ b/homes/me/default.nix @@ -34,25 +34,6 @@ }; */ - # ----- STYLIX ----- - - #stylix = { - # enable = true; - # - # image = pkgs.fetchurl { - # url = "https://www.pixelstalk.net/wp-content/uploads/2016/05/Epic-Anime-Awesome-Wallpapers.jpg"; - # sha256 = "enQo3wqhgf0FEPHj2coOCvo7DuZv+x5rL/WIo4qPI50="; - # }; - # - # # Stylix will automatically theme applications - # autoEnable = true; - # targets = { - # # disable Stylix's themes for ones I will theme manually - # firefox.enable = false; - # wofi.enable = false; - # }; - #}; - home = { username = "me"; homeDirectory = "/home/me"; @@ -66,6 +47,37 @@ }; }; + gtk = { + enable = true; + font.name = "Victor Mono SemiBold 12"; + theme = { + name = "Dracula"; + package = pkgs.dracula-theme; + }; + iconTheme = { + name = "kora"; + package = pkgs.kora-icon-theme; + }; + # TODO: use a variable to mirror this cursor size + # with the `home.pointerCurser.size` + cursorTheme = { + # dont set the theme (use system default instead) + # only set size to match the system + package = pkgs.bibata-cursors; + name = "Bibata-Modern-Ice"; + size = 16; + }; + }; + + # TODO: this lowkey doesnt work... (maybe the name "Dracula" is wrong?) + qt = { + enable = true; + style = { + name = "Dracula"; + package = pkgs.dracula-qt5-theme; + }; + }; + programs = { # these are both required for home-manager to work home-manager.enable = true; @@ -185,6 +197,7 @@ statusline = { left = [ "mode" + "spacer" "version-control" "spinner" ]; @@ -196,10 +209,8 @@ right = [ "position" "total-line-numbers" - "separator" "file-encoding" "file-line-ending" - "separator" "file-type" ]; separator = "|"; diff --git a/hosts/lolcathost/default.nix b/hosts/lolcathost/default.nix index f4185d5..9af4fc4 100755 --- a/hosts/lolcathost/default.nix +++ b/hosts/lolcathost/default.nix @@ -107,16 +107,6 @@ in { firefox nitch starfetch - tldr - ]; - }; - - # programming/development account - dev = { - isNormalUser = true; - extraGroups = ["wheel"]; - shell = pkgs.bash; #pkgs.zsh - packages = with pkgs; [ ]; }; @@ -128,6 +118,23 @@ in { packages = with pkgs; [ ]; }; + + # # programming/development account + # dev = { + # isNormalUser = true; + # extraGroups = ["wheel"]; + # shell = pkgs.bash; #pkgs.zsh + # packages = with pkgs; [ + # ]; + # }; + + # user for friends to ssh into + friends = { + isNormalUser = true; + shell = pkgs.fish; + packages = with pkgs; [ + ]; + }; }; }; @@ -135,7 +142,6 @@ in { users.me = import ../../homes/me; sharedModules = [ inputs.nixcord.homeManagerModules.nixcord - #inputs.nixvim.homeManagerModules.nixvim ]; }; @@ -148,6 +154,7 @@ in { easyeffects ani-cli wl-clipboard # clipboard for wayland + kcalc # TEMP: (FOR TESTING) python311 # I use 3.11 since it's in a pretty stable state now poetry # python dependency management and packaging @@ -159,6 +166,7 @@ in { curlie zoxide doggo + tldr # Pretty necessary git @@ -168,19 +176,17 @@ in { # Unix Commands wget tree + unzip ]; # Enable the use of certain programs programs = { hyprland = { enable = true; - # set the flake package package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland; - # make sure to also set the portal package, so that they are in sync portalPackage = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland; xwayland.enable = true; - #systemd.enable = true; }; zsh.enable = true; @@ -237,21 +243,6 @@ in { }; }; - # ----- STYLIX ----- - - #stylix = { - # enable = true; - # image = pkgs.fetchurl { - # url = "https://www.pixelstalk.net/wp-content/uploads/2016/05/Epic-Anime-Awesome-Wallpapers.jpg"; - # sha256 = "enQo3wqhgf0FEPHj2coOCvo7DuZv+x5rL/WIo4qPI50="; - # }; - # - # # Stylix will automatically theme applications - # #autoEnable = true; - # #image = ../../wallpapers/wall.png; - # #image = "/home/me/nixdots/wallpapers/ghibli-esque-valley.png"; - #}; - # Enable the new CLI commands and the flakes as experimental features nix.settings.experimental-features = [ "nix-command" From aca0bcc993abedf193189f6b215c82ffb36035fb Mon Sep 17 00:00:00 2001 From: Emile Clark-Boman Date: Fri, 8 Nov 2024 04:16:46 +1000 Subject: [PATCH 019/328] modified lolcathost pipewire settings --- hosts/lolcathost/default.nix | 9 +- hosts/lolcathost/default.nix.bak | 280 ------------------------------- 2 files changed, 8 insertions(+), 281 deletions(-) delete mode 100755 hosts/lolcathost/default.nix.bak diff --git a/hosts/lolcathost/default.nix b/hosts/lolcathost/default.nix index 9af4fc4..85b0217 100755 --- a/hosts/lolcathost/default.nix +++ b/hosts/lolcathost/default.nix @@ -76,10 +76,17 @@ in { #}; # Enable sound - # TODO: use the modules/core/pipewire.nix module instead :) + hardware.pulseaudio.enable = false; + security.rtkit.enable = true; pipewire = { enable = true; + + alsa.enable = true; + alsa.support32Bit = true; pulse.enable = true; + jack.enable = true; + + wireplumber.enable = true; }; # Enable touchpad support diff --git a/hosts/lolcathost/default.nix.bak b/hosts/lolcathost/default.nix.bak deleted file mode 100755 index c7f703e..0000000 --- a/hosts/lolcathost/default.nix.bak +++ /dev/null @@ -1,280 +0,0 @@ -{ - pkgs, - inputs, - ... -}: let - home-manager = builtins.fetchTarball { - url = "https://github.com/nix-community/home-manager/archive/master.tar.gz"; - sha256 = "19w63qccz78v0spx03911z98w1bvlxvd07hb0ma14a4vdzi4ninj"; - }; -in { - imports = [ - ./hardware-configuration.nix - (import "${home-manager}/nixos") - inputs.spicetify-nix.nixosModules.default - ]; - - programs.spicetify = let - spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; - in { - enable = true; - enabledExtensions = with spicePkgs.extensions; [ - adblock - hidePodcasts - shuffle # shuffle+ (special characters are sanitized out of extension names) - ]; - #theme = spicePkgs.themes.catppuccin; - #colorScheme = "mocha"; - }; - - # Use the systemd-boot EFI boot loader. - boot.loader = { - efi = { - canTouchEfiVariables = true; - efiSysMountPoint = "/boot/efi"; - }; - grub = { - efiSupport = true; - #efiInstallAsRemovable = true; # in case canTouchEfiVariables doesn't work on this system - device = "nodev"; - }; - }; - - # Set your time zone. - time.timeZone = "Australia/Brisbane"; - - # Select internationalisation properties. - i18n.defaultLocale = "en_US.UTF-8"; - console = { - font = "Lat2-Terminus16"; - keyMap = "us"; - console.packages = with pkgs; [ - nerdfonts - ]; - }; - - # ----- NETWORKING SECTION ----- - networking.hostName = "lolcathost"; - networking.networkmana - - # Open ports in the fi - # networking.firewall.allowedTCPPorts = [ ... ]; - # networking.firewall.allowedUDPPorts = [ ... ]; - # Or disable the firewall altogether. - networking.firewall.enable = true; - - # ----- SERVICES ----- - services = { - # Set display manager (login screen) - #displayManager = { - # sddm = { - # enable = true; - # #theme = "${import ./sddm-theme.nix { inherit pkgs; }}"; - # wayland.enable = true; # enable experimental sddm support for wayland - # }; - # defaultSession = "hyprland"; - #}; - - # Enable sound - # TODO: use the modules/core/pipewire.nix module instead :) - pipewire = { - enable = true; - pulse.enable = true; - }; - - # Enable touchpad support - libinput.enable = true; - }; - - # allow wheel group to use passwordless sudo - users = { - # using fish as the login shell tends - # to go very poorly because it isn't - # POSIX compliant, so we'll just use - # simple Bash then :) - defaultUserShell = pkgs.bash; - - users = { - # just me fr (personal account) - me = { - isNormalUser = true; - extraGroups = ["wheel"]; - shell = pkgs.bash; #pkgs.fish - packages = with pkgs; [ - firefox - nitch - starfetch - tldr - ]; - }; - - # programming/development account - dev = { - isNormalUser = true; - extraGroups = ["wheel"]; - shell = pkgs.bash; #pkgs.zsh - packages = with pkgs; [ - ]; - }; - - # user for my professional jobs and stuff - ae = { - isNormalUser = true; - extraGroups = ["wheel"]; - shell = pkgs.bash; #pkgs.fish - packages = with pkgs; [ - ]; - }; - }; - }; - - home-manager = { - users.me = import ../../homes/me; - sharedModules = [ - #inputs.nixcord.homeManagerModules.nixcord - #inputs.nixvim.homeManagerModules.nixvim - ]; - }; - - # ---- SYSTEM PACKAGES ----- - environment.systemPackages = with pkgs; [ - # User Environment - inputs.swww.packages.${pkgs.system}.swww - #vesktop - helvum - easyeffects - ani-cli - wl-clipboard # clipboard for wayland - - python311 # I use 3.11 since it's in a pretty stable state now - poetry # python dependency management and packaging - - # fish plugins - grc # colorise command outputs - - httpie - curlie - zoxide - doggo - - # Pretty necessary - git - brightnessctl - acpi - - # Unix Commands - wget - tree - ]; - - # Enable the use of certain programs - programs = { - hyprland = { - enable = true; - # set the flake package - package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland; - # make sure to also set the portal package, so that they are in sync - portalPackage = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland; - - xwayland.enable = true; - #systemd.enable = true; - }; - - zsh.enable = true; - fish.enable = true; - - neovim = { - enable = true; - defaultEditor = true; - viAlias = true; - vimAlias = true; - configure = { - customRC = '' - set number - set tabstop=4 - set shiftwidth=4 - - set mouse=a - ''; - }; - }; - - # I want to use fish as my login shell but it always goes terrible - # cause it isn't POSIX compliant, so instead Bash is my login and - # will just exec fish (^-^) - bash = { - interactiveShellInit = '' - if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]] - then - shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION="" - exec ${pkgs.fish}/bin/fish $LOGIN_OPTION - fi - ''; - }; - }; - - # ----- FONTS ----- - fonts = { - enableDefaultPackages = true; # no clue what this line does tbh - packages = with pkgs; [ - (nerdfonts.override { - fonts = [ - "Cousine" - "Iosevka" - ]; - }) - - # texlive maintains a noto-emoji flake - texlivePackages.noto-emoji - ]; - - fontconfig = { - defaultFonts = { - serif = ["Iosevka"]; # TODO: package Iosevka Etoile since Iosevka isn't a serif font - sansSerif = ["Iosevka "]; - monospace = ["Cousine"]; - emoji = ["Noto Emoji"]; - }; - }; - }; - - # ----- STYLIX ----- - - #stylix = { - # enable = true; - # image = pkgs.fetchurl { - # url = "https://www.pixelstalk.net/wp-content/uploads/2016/05/Epic-Anime-Awesome-Wallpapers.jpg"; - # sha256 = "enQo3wqhgf0FEPHj2coOCvo7DuZv+x5rL/WIo4qPI50="; - # }; - # - # # Stylix will automatically theme applications - # #autoEnable = true; - # #image = ../../wallpapers/wall.png; - # #image = "/home/me/nixdots/wallpapers/ghibli-esque-valley.png"; - #}; - - # Enable the new CLI commands and the flakes as experimental features - nix.settings.experimental-features = [ - "nix-command" - "flakes" - ]; - - # Some programs need SUID wrappers, can be configured further or are - # started in user sessions. - # programs.mtr.enable = true; - # programs.gnupg.agent = { - # enable = true; - # enableSSHSupport = true; - # }; - - # Enable the OpenSSH daemon. - # services.openssh.enable = true; - - # Enable OpenGL - hardware = { - graphics.enable = true; - }; - - # DO NOT MODIFY - system.stateVersion = "24.05"; # Did you read the comment? -} From ab2a7db781c31dd67f05e25673791dc8f8948d13 Mon Sep 17 00:00:00 2001 From: _cry64 Date: Fri, 8 Nov 2024 04:16:46 +1000 Subject: [PATCH 020/328] modified lolcathost pipewire settings --- hosts/lolcathost/default.nix | 9 +- hosts/lolcathost/default.nix.bak | 280 ------------------------------- 2 files changed, 8 insertions(+), 281 deletions(-) delete mode 100755 hosts/lolcathost/default.nix.bak diff --git a/hosts/lolcathost/default.nix b/hosts/lolcathost/default.nix index 9af4fc4..85b0217 100755 --- a/hosts/lolcathost/default.nix +++ b/hosts/lolcathost/default.nix @@ -76,10 +76,17 @@ in { #}; # Enable sound - # TODO: use the modules/core/pipewire.nix module instead :) + hardware.pulseaudio.enable = false; + security.rtkit.enable = true; pipewire = { enable = true; + + alsa.enable = true; + alsa.support32Bit = true; pulse.enable = true; + jack.enable = true; + + wireplumber.enable = true; }; # Enable touchpad support diff --git a/hosts/lolcathost/default.nix.bak b/hosts/lolcathost/default.nix.bak deleted file mode 100755 index c7f703e..0000000 --- a/hosts/lolcathost/default.nix.bak +++ /dev/null @@ -1,280 +0,0 @@ -{ - pkgs, - inputs, - ... -}: let - home-manager = builtins.fetchTarball { - url = "https://github.com/nix-community/home-manager/archive/master.tar.gz"; - sha256 = "19w63qccz78v0spx03911z98w1bvlxvd07hb0ma14a4vdzi4ninj"; - }; -in { - imports = [ - ./hardware-configuration.nix - (import "${home-manager}/nixos") - inputs.spicetify-nix.nixosModules.default - ]; - - programs.spicetify = let - spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; - in { - enable = true; - enabledExtensions = with spicePkgs.extensions; [ - adblock - hidePodcasts - shuffle # shuffle+ (special characters are sanitized out of extension names) - ]; - #theme = spicePkgs.themes.catppuccin; - #colorScheme = "mocha"; - }; - - # Use the systemd-boot EFI boot loader. - boot.loader = { - efi = { - canTouchEfiVariables = true; - efiSysMountPoint = "/boot/efi"; - }; - grub = { - efiSupport = true; - #efiInstallAsRemovable = true; # in case canTouchEfiVariables doesn't work on this system - device = "nodev"; - }; - }; - - # Set your time zone. - time.timeZone = "Australia/Brisbane"; - - # Select internationalisation properties. - i18n.defaultLocale = "en_US.UTF-8"; - console = { - font = "Lat2-Terminus16"; - keyMap = "us"; - console.packages = with pkgs; [ - nerdfonts - ]; - }; - - # ----- NETWORKING SECTION ----- - networking.hostName = "lolcathost"; - networking.networkmana - - # Open ports in the fi - # networking.firewall.allowedTCPPorts = [ ... ]; - # networking.firewall.allowedUDPPorts = [ ... ]; - # Or disable the firewall altogether. - networking.firewall.enable = true; - - # ----- SERVICES ----- - services = { - # Set display manager (login screen) - #displayManager = { - # sddm = { - # enable = true; - # #theme = "${import ./sddm-theme.nix { inherit pkgs; }}"; - # wayland.enable = true; # enable experimental sddm support for wayland - # }; - # defaultSession = "hyprland"; - #}; - - # Enable sound - # TODO: use the modules/core/pipewire.nix module instead :) - pipewire = { - enable = true; - pulse.enable = true; - }; - - # Enable touchpad support - libinput.enable = true; - }; - - # allow wheel group to use passwordless sudo - users = { - # using fish as the login shell tends - # to go very poorly because it isn't - # POSIX compliant, so we'll just use - # simple Bash then :) - defaultUserShell = pkgs.bash; - - users = { - # just me fr (personal account) - me = { - isNormalUser = true; - extraGroups = ["wheel"]; - shell = pkgs.bash; #pkgs.fish - packages = with pkgs; [ - firefox - nitch - starfetch - tldr - ]; - }; - - # programming/development account - dev = { - isNormalUser = true; - extraGroups = ["wheel"]; - shell = pkgs.bash; #pkgs.zsh - packages = with pkgs; [ - ]; - }; - - # user for my professional jobs and stuff - ae = { - isNormalUser = true; - extraGroups = ["wheel"]; - shell = pkgs.bash; #pkgs.fish - packages = with pkgs; [ - ]; - }; - }; - }; - - home-manager = { - users.me = import ../../homes/me; - sharedModules = [ - #inputs.nixcord.homeManagerModules.nixcord - #inputs.nixvim.homeManagerModules.nixvim - ]; - }; - - # ---- SYSTEM PACKAGES ----- - environment.systemPackages = with pkgs; [ - # User Environment - inputs.swww.packages.${pkgs.system}.swww - #vesktop - helvum - easyeffects - ani-cli - wl-clipboard # clipboard for wayland - - python311 # I use 3.11 since it's in a pretty stable state now - poetry # python dependency management and packaging - - # fish plugins - grc # colorise command outputs - - httpie - curlie - zoxide - doggo - - # Pretty necessary - git - brightnessctl - acpi - - # Unix Commands - wget - tree - ]; - - # Enable the use of certain programs - programs = { - hyprland = { - enable = true; - # set the flake package - package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland; - # make sure to also set the portal package, so that they are in sync - portalPackage = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland; - - xwayland.enable = true; - #systemd.enable = true; - }; - - zsh.enable = true; - fish.enable = true; - - neovim = { - enable = true; - defaultEditor = true; - viAlias = true; - vimAlias = true; - configure = { - customRC = '' - set number - set tabstop=4 - set shiftwidth=4 - - set mouse=a - ''; - }; - }; - - # I want to use fish as my login shell but it always goes terrible - # cause it isn't POSIX compliant, so instead Bash is my login and - # will just exec fish (^-^) - bash = { - interactiveShellInit = '' - if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]] - then - shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION="" - exec ${pkgs.fish}/bin/fish $LOGIN_OPTION - fi - ''; - }; - }; - - # ----- FONTS ----- - fonts = { - enableDefaultPackages = true; # no clue what this line does tbh - packages = with pkgs; [ - (nerdfonts.override { - fonts = [ - "Cousine" - "Iosevka" - ]; - }) - - # texlive maintains a noto-emoji flake - texlivePackages.noto-emoji - ]; - - fontconfig = { - defaultFonts = { - serif = ["Iosevka"]; # TODO: package Iosevka Etoile since Iosevka isn't a serif font - sansSerif = ["Iosevka "]; - monospace = ["Cousine"]; - emoji = ["Noto Emoji"]; - }; - }; - }; - - # ----- STYLIX ----- - - #stylix = { - # enable = true; - # image = pkgs.fetchurl { - # url = "https://www.pixelstalk.net/wp-content/uploads/2016/05/Epic-Anime-Awesome-Wallpapers.jpg"; - # sha256 = "enQo3wqhgf0FEPHj2coOCvo7DuZv+x5rL/WIo4qPI50="; - # }; - # - # # Stylix will automatically theme applications - # #autoEnable = true; - # #image = ../../wallpapers/wall.png; - # #image = "/home/me/nixdots/wallpapers/ghibli-esque-valley.png"; - #}; - - # Enable the new CLI commands and the flakes as experimental features - nix.settings.experimental-features = [ - "nix-command" - "flakes" - ]; - - # Some programs need SUID wrappers, can be configured further or are - # started in user sessions. - # programs.mtr.enable = true; - # programs.gnupg.agent = { - # enable = true; - # enableSSHSupport = true; - # }; - - # Enable the OpenSSH daemon. - # services.openssh.enable = true; - - # Enable OpenGL - hardware = { - graphics.enable = true; - }; - - # DO NOT MODIFY - system.stateVersion = "24.05"; # Did you read the comment? -} From 97b344eb03df8421be2830dbeebe8da9c540ea46 Mon Sep 17 00:00:00 2001 From: Emile Clark-Boman Date: Fri, 8 Nov 2024 14:26:30 +1000 Subject: [PATCH 021/328] added hypridle, hyprlock, and sddm + sddm-theme-corners --- INSPIRATION | 8 + README.md | 2 + TODO | 28 ++- deploy | 1 + homes/me/default.nix | 230 ++++++++++++++++++- hosts/lolcathost/default.nix | 22 +- hosts/lolcathost/hardware-configuration.nix | 46 ++-- hosts/lolcathost/sddm-theme-corners.nix | 17 ++ hosts/myputer/default.nix | 242 +++++++++----------- hosts/myputer/hardware-configuration.nix | 44 ++-- try-this | 1 - 11 files changed, 445 insertions(+), 196 deletions(-) create mode 100644 INSPIRATION create mode 100755 hosts/lolcathost/sddm-theme-corners.nix delete mode 100644 try-this diff --git a/INSPIRATION b/INSPIRATION new file mode 100644 index 0000000..2c5adf0 --- /dev/null +++ b/INSPIRATION @@ -0,0 +1,8 @@ +Godlike + https://github.com/end-4/dots-hyprland + +Gorgeous + https://github.com/prasanthrangan/hyprdots + +Very nice + https://github.com/linuxmobile/hyprland-dots diff --git a/README.md b/README.md index 0dd5535..ce2a13b 100755 --- a/README.md +++ b/README.md @@ -81,3 +81,5 @@ Really great starter config for learning how parts interact and how to generally Wiki page explaining how to install fonts and nerd fonts on NixOS 4. https://github.com/adi1090x/rofi For the Rofi theme +5. https://github.com/zDyanTB/HyprNova +For the really cool hyprlock theme diff --git a/TODO b/TODO index 489093b..8fedefc 100644 --- a/TODO +++ b/TODO @@ -17,6 +17,12 @@ Get hyprcursor working with Bibata-Modern-Ice +Get waybar (or another bar) working + +Get a GRUB theme working + +Get SDDM and a theme working + Overtime just install more programs that I need regularly: ie - btop/htop/etc @@ -24,12 +30,6 @@ Overtime just install more programs that I need regularly: ie Get a QT theme -Get waybar (or another bar) working - -Get a GRUB theme working - -Get SDDM and a theme working - Fix pipewire audio is so incredibly low (happens on laptop and PC) @@ -48,28 +48,32 @@ Get GTK Bibata Cursors to be the same size as my system cursor Fix: your 131072x1 screen size is bogus. expect trouble -Are there plugins for helix? + Search for all "TODO" items in my nix dotfiles Push nixdots to github + + Check out the Ekala Project (I joined their discord server) + Create a program that enables/disables passwordless sudo access (add to github too) - -Have helix editor look differently depending on language - (specifically don't show indent indicators when editing nix files - - Learn to package my own home-manager modules +Ideal Features: +1. AI assistant +2. searching can also be used to calculate stuff (like I do on my iPad) + + + Fork nixcord and fix documentation (the installation is confusing) But firstly the first code snippet is wrong... diff --git a/deploy b/deploy index 7e49259..b72232d 100755 --- a/deploy +++ b/deploy @@ -1,2 +1,3 @@ #!/usr/bin/env bash sudo nixos-rebuild switch --flake . +#nixos-rebuild build --flake .# --cores 8 -j 1 diff --git a/homes/me/default.nix b/homes/me/default.nix index d899f66..64de919 100755 --- a/homes/me/default.nix +++ b/homes/me/default.nix @@ -72,12 +72,233 @@ # TODO: this lowkey doesnt work... (maybe the name "Dracula" is wrong?) qt = { enable = true; - style = { - name = "Dracula"; - package = pkgs.dracula-qt5-theme; + platformTheme.name = "gtk2"; + style.name = "gtk2"; + }; + + services.hypridle = { + enable = true; + settings = { + general = { + ignore_dbus_inhibit = false; + lock_cmd = "pidof hyprlock || ${pkgs.hyprlock}/bin/hyprlock"; + before_sleep_cmd = "loginctl lock-session"; + after_sleep_cmd = "hyprctl dispatch dpms on"; + }; + + listener = [ + { + timeout = 600; + on-timeout = "pidof hyprlock || ${pkgs.hyprlock}/bin/hyprlock"; + } + + { + timeout = 660; + on-timeout = "systemctl suspend"; + } + ]; }; }; + programs.hyprlock = { + enable = true; + settings = { + background = { + monitor = ""; + path = "$HOME/downloads/1.png"; # only png supported for now + # color = $color1 + + # all these options are taken from hyprland, see https://wiki.hyprland.org/Configuring/Variables/#blur for explanations + blur_size = 4; + blur_passes = 3; # 0 disables blurring + noise = 0.0117; + contrast = 1.3000; # Vibrant!!! + brightness = 0.8000; + vibrancy = 0.2100; + vibrancy_darkness = 0.0; + }; + label = [ + { + # Hours + monitor = ""; + text = ''cmd[update:1000] echo " $(date +"%H") "''; + color = "rgb(255, 255, 255, 1)"; + font_size = 112; + font_family = "Geist Mono 10"; + shadow_passes = 3; + shadow_size = 4; + + position = "0, 240"; + halign = "center"; + valign = "center"; + } + + { + # Minutes + monitor = ""; + text = ''cmd[update:1000] echo " $(date +"%M") "''; + color = "rgb(255, 255, 255, 1)"; + font_size = 112; + font_family = "Geist Mono 10"; + shadow_passes = 3; + shadow_size = 4; + + position = "0, 120"; + halign = "center"; + valign = "center"; + } + + # Today + { + monitor = ""; + text = ''cmd[update:18000000] echo " "$(date +'%A')" "''; + color = "rgb(255, 255, 255, 1)"; + font_size = 22; + font_family = "JetBrainsMono Nerd Font 10"; + + position = "0, 30"; + halign = "center"; + valign = "center"; + } + + # Week + { + monitor = ""; + text = ''cmd[update:18000000] echo " "$(date +'%d %b')" "''; + color = "rgb(255, 255, 255, 1)"; + font_size = 18; + font_family = "JetBrainsMono Nerd Font 10"; + + position = "0, 6"; + halign = "center"; + valign = "center"; + } + + { + # Degrees + monitor = ""; + # get temperature in Brisbane + text = ''cmd[update:18000000] echo "Feels like $(curl -s 'wttr.in/bne?format=%t' | tr -d '+') "''; + color = "rgb(255, 255, 255, 1)"; + font_size = 18; + font_family = "Geist Mono 10"; + + position = "0, 40"; + halign = "center"; + valign = "bottom"; + } + ]; + + input-field = { + monitor = ""; + size = "300, 50"; + outline_thickness = 3; + + dots_size = 0.26; # Scale of input-field height, 0.2 - 0.8 + dots_spacing = 0.64; # Scale of dots' absolute size, 0.0 - 1.0 + dots_center = true; + dots_rouding = -1; + + rounding = 22; + outer_color = "rgb(255, 0, 0, 1)"; + inner_color = "rgb(0, 255, 0, 1)"; + font_color = "rgb(0, 0, 255, 1)"; + fade_on_empty = true; + placeholder_text = "!!Super Secret!!"; # Text rendered in the input box when it's empty. + + position = "0, 120"; + halign = "center"; + valign = "bottom"; + }; + }; + }; + + /* + programs.hyprlock = { + enable = true; + settings = { + general = { + grace = 5; + no_fade_in = false; + disable_loading_bar = false; + }; + + # BACKGROUND + background = { + monitor = ""; + path = "../../../downloads/1.png"; + blur_passes = 0; + contrast = 0.8916; + brightness = 0.7172; + vibrancy = 0.1696; + vibrancy_darkness = 0.0; + }; + + label = [ + { + # Day-Month-Date + monitor = ""; + text = ''cmd[update:1000] echo -e "$(date +"%A, %B %d")"''; + color = "rgb(255, 255, 255, 1)"; + font_size = 28; + font_family = "JetBrainsMono Nerd Font Bold"; + position = "0, 490"; + halign = "center"; + valign = "center"; + } + # Time + { + monitor = ""; + text = ''cmd[update:1000] echo "$(date +"%I:%M")"''; + color = "rgb(255, 255, 255, 1)"; + font_size = 160; + font_family = "steelfish outline regular"; + position = "0, 370"; + halign = "center"; + valign = "center"; + } + # USER + { + monitor = ""; + text = " $USER"; + color = "rgb(255, 255, 255, 1)"; + outline_thickness = 2; + dots_size = 0.2; # Scale of input-field height, 0.2 - 0.8 + dots_spacing = 0.2; # Scale of dots' absolute size, 0.0 - 1.0 + dots_center = true; + font_size = 18; + font_family = "JetBrainsMono Nerd Font Bold"; + position = "0, -180"; + halign = "center"; + valign = "center"; + } + ]; + + # INPUT FIELD + input-field = [ + { + monitor = ""; + size = "300, 60"; + outline_thickness = 2; + dots_size = 0.2; # Scale of input-field height, 0.2 - 0.8 + dots_spacing = 0.2; # Scale of dots' absolute size, 0.0 - 1.0 + dots_center = true; + outer_color = "rgba(255, 255, 255, 0)"; + inner_color = "rgba(255, 255, 255, 0.1)"; + font_color = "rgb(255, 255, 255, 1)"; + fade_on_empty = false; + font_family = "JetBrainsMono Nerd Font Bold"; + placeholder_text = "🔒 Enter Password"; + hide_input = false; + position = "0, -250"; + halign = "center"; + valign = "center"; + } + ]; + }; + }; + */ + programs = { # these are both required for home-manager to work home-manager.enable = true; @@ -138,6 +359,7 @@ completion-replace = true; # completions replace entire word indent-heuristic = "tree-sitter"; # how indentation is computed + # TODO: make this configurable (enabled on myputer, disabled on lolcathost) middle-click-paste = true; insert-final-newline = true; # append newline to file on write @@ -361,7 +583,7 @@ # Run when the `OpenConfigEditor` keybinding is triggered editor = { - program = "nvim"; + program = "hx"; # helix args = []; }; diff --git a/hosts/lolcathost/default.nix b/hosts/lolcathost/default.nix index 85b0217..d81e477 100755 --- a/hosts/lolcathost/default.nix +++ b/hosts/lolcathost/default.nix @@ -66,18 +66,17 @@ in { # ----- SERVICES ----- services = { # Set display manager (login screen) - #displayManager = { - # sddm = { - # enable = true; - # #theme = "${import ./sddm-theme.nix { inherit pkgs; }}"; - # wayland.enable = true; # enable experimental sddm support for wayland - # }; - # defaultSession = "hyprland"; - #}; + displayManager = { + sddm = { + enable = true; + wayland.enable = true; # enable experimental sddm support for wayland + theme = "${import ./sddm-theme-corners.nix {inherit pkgs;}}"; + }; + defaultSession = "hyprland"; + }; # Enable sound - hardware.pulseaudio.enable = false; - security.rtkit.enable = true; + #hardware.pulseaudio.enable = false; pipewire = { enable = true; @@ -95,6 +94,7 @@ in { tumbler.enable = true; # Thunar image thumbnail support gvfs.enable = true; # Thunar mount, trash, and other functionality }; + security.rtkit.enable = true; # allow wheel group to use passwordless sudo users = { @@ -174,6 +174,7 @@ in { zoxide doggo tldr + btop # Pretty necessary git @@ -235,6 +236,7 @@ in { # ]; # }) nerdfonts + geist-font # for my hyprlock theme # texlive maintains a noto-emoji flake texlivePackages.noto-emoji diff --git a/hosts/lolcathost/hardware-configuration.nix b/hosts/lolcathost/hardware-configuration.nix index 1be6ce5..1abc146 100755 --- a/hosts/lolcathost/hardware-configuration.nix +++ b/hosts/lolcathost/hardware-configuration.nix @@ -1,32 +1,36 @@ # 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, ... }: - { - imports = - [ (modulesPath + "/installer/scan/not-detected.nix") - ]; + config, + lib, + pkgs, + modulesPath, + ... +}: { + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + ]; - boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "ahci" "usb_storage" "sd_mod" ]; - boot.initrd.kernelModules = [ ]; - boot.kernelModules = [ "kvm-amd" ]; - boot.extraModulePackages = [ ]; + boot.initrd.availableKernelModules = ["nvme" "xhci_pci" "ahci" "usb_storage" "sd_mod"]; + boot.initrd.kernelModules = []; + boot.kernelModules = ["kvm-amd"]; + boot.extraModulePackages = []; - fileSystems."/" = - { device = "/dev/disk/by-uuid/4bf649ce-047b-472d-b392-4c2c326362d9"; - fsType = "ext4"; - }; + fileSystems."/" = { + device = "/dev/disk/by-uuid/4bf649ce-047b-472d-b392-4c2c326362d9"; + fsType = "ext4"; + }; - fileSystems."/boot" = - { device = "/dev/disk/by-uuid/D97A-5260"; - fsType = "vfat"; - options = [ "fmask=0077" "dmask=0077" ]; - }; + fileSystems."/boot" = { + device = "/dev/disk/by-uuid/D97A-5260"; + fsType = "vfat"; + options = ["fmask=0077" "dmask=0077"]; + }; - swapDevices = - [ { device = "/dev/disk/by-uuid/bfa29193-4f83-46c3-bcb7-0d2b8323b6e0"; } - ]; + swapDevices = [ + {device = "/dev/disk/by-uuid/bfa29193-4f83-46c3-bcb7-0d2b8323b6e0";} + ]; # Enables DHCP on each ethernet and wireless interface. In case of scripted networking # (the default) this is the recommended approach. When using systemd-networkd it's diff --git a/hosts/lolcathost/sddm-theme-corners.nix b/hosts/lolcathost/sddm-theme-corners.nix new file mode 100755 index 0000000..b96abe6 --- /dev/null +++ b/hosts/lolcathost/sddm-theme-corners.nix @@ -0,0 +1,17 @@ +{pkgs}: { + sddm-theme-corners = pkgs.stdenv.mkDerivation rec { + pname = "sddm-theme-corners"; + #version = "1.0"; + #dontBuild = true; + installPhase = '' + mkdir -p $out/share/sddm/themes + cp -ar $src/corners $out/share/sddm/themes/ + ''; + src = pkgs.fetchFromGitHub { + owner = "aczw"; + repo = "sddm-theme-corners"; + rev = "6ff0ff455261badcae36cd7d151a34479f157a3c"; + sha256 = "0iiasrbl7ciyhq3z02la636as915zk9ph063ac7vm5iwny8vgwh8"; + }; + }; +} diff --git a/hosts/myputer/default.nix b/hosts/myputer/default.nix index a557b9e..fb12b72 100755 --- a/hosts/myputer/default.nix +++ b/hosts/myputer/default.nix @@ -1,38 +1,31 @@ -{ +{ pkgs, inputs, - ... -}: - -let + ... +}: let home-manager = builtins.fetchTarball { - url = "https://github.com/nix-community/home-manager/archive/master.tar.gz"; - sha256 = "0kg9iaixqygpncw7avgh1grwyjgnfc9i7k9pk8hc4xrvr8jv2l3c"; + url = "https://github.com/nix-community/home-manager/archive/master.tar.gz"; + sha256 = "0kg9iaixqygpncw7avgh1grwyjgnfc9i7k9pk8hc4xrvr8jv2l3c"; }; -in -{ +in { imports = [ ./hardware-configuration.nix - (import "${home-manager}/nixos") - inputs.spicetify-nix.nixosModules.default + (import "${home-manager}/nixos") + inputs.spicetify-nix.nixosModules.default ]; - programs.spicetify = - let - spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; - in - { - enable = true; - enabledExtensions = with spicePkgs.extensions; [ - adblock - hidePodcasts - shuffle # shuffle+ (special characters are sanitized out of extension names) - ]; - #theme = spicePkgs.themes.catppuccin; - #colorScheme = "mocha"; - }; - - + programs.spicetify = let + spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; + in { + enable = true; + enabledExtensions = with spicePkgs.extensions; [ + adblock + hidePodcasts + shuffle # shuffle+ (special characters are sanitized out of extension names) + ]; + #theme = spicePkgs.themes.catppuccin; + #colorScheme = "mocha"; + }; # Use the systemd-boot EFI boot loader. # TODO: use GRUB2 instead @@ -61,12 +54,11 @@ in #useXkbConfig = true; # use xkb.options in tty. }; - # ----- NETWORKING SECTION ----- networking.hostName = "myputer"; # Pick only one of the below networking options. # networking.wireless.enable = true; # Enables wireless support via wpa_supplicant. - networking.networkmanager.enable = true; # Easiest to use and most distros use this by default. + networking.networkmanager.enable = true; # Easiest to use and most distros use this by default. # Open ports in the firewall. # networking.firewall.allowedTCPPorts = [ ... ]; @@ -74,14 +66,13 @@ in # Or disable the firewall altogether. networking.firewall.enable = true; - # ----- SERVICES ----- services = { # Set display manager (login screen) displayManager = { sddm = { enable = true; - theme = "${import ./sddm-theme.nix { inherit pkgs; }}"; + theme = "${import ./sddm-theme.nix {inherit pkgs;}}"; # enable experimental sddm support for wayland wayland.enable = true; }; @@ -100,78 +91,78 @@ in security.sudo.wheelNeedsPassword = false; users = { # using fish as the login shell tends - # to go very poorly because it isn't - # POSIX compliant, so we'll just use - # simple Bash then :) + # to go very poorly because it isn't + # POSIX compliant, so we'll just use + # simple Bash then :) defaultUserShell = pkgs.bash; - users = { - # just me fr (personal account) - me = { - isNormalUser = true; - extraGroups = [ "wheel" ]; - shell = pkgs.bash; #pkgs.fish - packages = with pkgs; [ - firefox - nitch - starfetch - tldr - ]; - }; - - # programming/development account - dev = { - isNormalUser = true; - extraGroups = [ "wheel" ]; - shell = pkgs.bash; #pkgs.zsh - packages = with pkgs; [ - ]; - }; - - # user for my professional jobs and stuff - ae = { - isNormalUser = true; - extraGroups = [ "wheel" ]; - shell = pkgs.bash; #pkgs.fish - packages = with pkgs; [ - ]; - }; - }; + users = { + # just me fr (personal account) + me = { + isNormalUser = true; + extraGroups = ["wheel"]; + shell = pkgs.bash; #pkgs.fish + packages = with pkgs; [ + firefox + nitch + starfetch + tldr + ]; + }; + + # programming/development account + dev = { + isNormalUser = true; + extraGroups = ["wheel"]; + shell = pkgs.bash; #pkgs.zsh + packages = with pkgs; [ + ]; + }; + + # user for my professional jobs and stuff + ae = { + isNormalUser = true; + extraGroups = ["wheel"]; + shell = pkgs.bash; #pkgs.fish + packages = with pkgs; [ + ]; + }; + }; }; home-manager = { users.me = import ../../homes/me; sharedModules = [ - #inputs.nixcord.homeManagerModules.nixcord - #inputs.nixvim.homeManagerModules.nixvim - ]; + #inputs.nixcord.homeManagerModules.nixcord + #inputs.nixvim.homeManagerModules.nixvim + ]; }; # ---- SYSTEM PACKAGES ----- environment.systemPackages = with pkgs; [ # User Environment - inputs.swww.packages.${pkgs.system}.swww + inputs.swww.packages.${pkgs.system}.swww #vesktop - helvum - easyeffects - ani-cli - wl-clipboard # clipboard for wayland + helvum + easyeffects + ani-cli + wl-clipboard # clipboard for wayland - python311 # I use 3.11 since it's in a pretty stable state now - poetry # python dependency management and packaging + python311 # I use 3.11 since it's in a pretty stable state now + poetry # python dependency management and packaging # fish plugins - grc # colorise command outputs + grc # colorise command outputs httpie - curlie - zoxide - doggo + curlie + zoxide + doggo # Pretty necessary git brightnessctl - acpi + acpi # Unix Commands wget @@ -181,19 +172,18 @@ in # Enable the use of certain programs programs = { hyprland = { - enable = true; - # set the flake package - package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland; + enable = true; + # set the flake package + package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland; # make sure to also set the portal package, so that they are in sync portalPackage = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland; xwayland.enable = true; - #systemd.enable = true; - }; - + #systemd.enable = true; + }; zsh.enable = true; - fish.enable = true; + fish.enable = true; neovim = { enable = true; @@ -202,77 +192,76 @@ in vimAlias = true; configure = { customRC = '' - set number - set tabstop=4 - set shiftwidth=4 + set number + set tabstop=4 + set shiftwidth=4 ''; }; }; # I want to use fish as my login shell but it always goes terrible - # cause it isn't POSIX compliant, so instead Bash is my login and - # will just exec fish (^-^) - bash = { + # cause it isn't POSIX compliant, so instead Bash is my login and + # will just exec fish (^-^) + bash = { interactiveShellInit = '' if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]] then shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION="" exec ${pkgs.fish}/bin/fish $LOGIN_OPTION fi - ''; + ''; }; }; - - # ----- FONTS ----- fonts = { enableDefaultPackages = true; # no clue what this line does tbh packages = with pkgs; [ - (nerdfonts.override { fonts = [ "Cousine" # its already i guess - "Iosevka" # nah nah - "IosevkaTerm" # big nah - "CascadiaCode" # potential - "FiraCode" # potential - "JetBrainsMono" # for my rofi theme - "Hasklig" - "Hack"]; }) - - # texlive maintains a noto-emoji flake - texlivePackages.noto-emoji - ]; + (nerdfonts.override { + fonts = [ + "Cousine" # its already i guess + "Iosevka" # nah nah + "IosevkaTerm" # big nah + "CascadiaCode" # potential + "FiraCode" # potential + "JetBrainsMono" # for my rofi theme + "Hasklig" + "Hack" + ]; + }) - fontconfig = { - defaultFonts = { - serif = [ "Iosevka" ]; # TODO: package Iosevka Etoile since Iosevka isn't a serif font - sansSerif = [ "Iosevka "]; - monospace = [ "Cousine" ]; - emoji = [ "Noto Emoji" ]; - }; - }; + # texlive maintains a noto-emoji flake + texlivePackages.noto-emoji + ]; + + fontconfig = { + defaultFonts = { + serif = ["Iosevka"]; # TODO: package Iosevka Etoile since Iosevka isn't a serif font + sansSerif = ["Iosevka "]; + monospace = ["Cousine"]; + emoji = ["Noto Emoji"]; + }; + }; }; - # ----- STYLIX ----- - + #stylix = { # enable = true; # image = pkgs.fetchurl { # url = "https://www.pixelstalk.net/wp-content/uploads/2016/05/Epic-Anime-Awesome-Wallpapers.jpg"; # sha256 = "enQo3wqhgf0FEPHj2coOCvo7DuZv+x5rL/WIo4qPI50="; # }; - # + # # # Stylix will automatically theme applications # #autoEnable = true; # #image = ../../wallpapers/wall.png; # #image = "/home/me/nixdots/wallpapers/ghibli-esque-valley.png"; #}; - - # Enable the new CLI commands and the flakes as experimental features - nix.settings.experimental-features = [ - "nix-command" + nix.settings.experimental-features = [ + "nix-command" "flakes" ]; @@ -287,16 +276,11 @@ in # Enable the OpenSSH daemon. # services.openssh.enable = true; - # Enable OpenGL hardware = { graphics.enable = true; }; - - # DO NOT MODIFY system.stateVersion = "24.05"; # Did you read the comment? - } - diff --git a/hosts/myputer/hardware-configuration.nix b/hosts/myputer/hardware-configuration.nix index 9eb2faf..3dcf76d 100755 --- a/hosts/myputer/hardware-configuration.nix +++ b/hosts/myputer/hardware-configuration.nix @@ -1,33 +1,39 @@ # 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, ... }: - { - imports = - [ (modulesPath + "/installer/scan/not-detected.nix") - ]; + config, + lib, + pkgs, + modulesPath, + ... +}: { + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + ]; - boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "ahci" "usb_storage" "usbhid" "sd_mod" ]; - boot.initrd.kernelModules = [ ]; - boot.kernelModules = [ "kvm-amd" ]; - boot.extraModulePackages = [ ]; + boot.initrd.availableKernelModules = ["nvme" "xhci_pci" "ahci" "usb_storage" "usbhid" "sd_mod"]; + boot.initrd.kernelModules = []; + boot.kernelModules = ["kvm-amd"]; + boot.extraModulePackages = []; - fileSystems."/" = - { device = "/dev/disk/by-uuid/ff19e1b0-cacc-4270-a94b-7922f7224ae2"; - fsType = "ext4"; - }; + fileSystems."/" = { + device = "/dev/disk/by-uuid/ff19e1b0-cacc-4270-a94b-7922f7224ae2"; + fsType = "ext4"; + }; #fileSystems."/boot" = # BIOS - fileSystems."/boot" = # UEFI - { device = "/dev/disk/by-uuid/7046-177A"; + fileSystems."/boot" = + # UEFI + { + device = "/dev/disk/by-uuid/7046-177A"; fsType = "vfat"; - options = [ "fmask=0077" "dmask=0077" ]; + options = ["fmask=0077" "dmask=0077"]; }; - swapDevices = - [ { device = "/dev/disk/by-uuid/7f7e9d69-78e0-49f1-b792-6be26ed8e040"; } - ]; + swapDevices = [ + {device = "/dev/disk/by-uuid/7f7e9d69-78e0-49f1-b792-6be26ed8e040";} + ]; # Enables DHCP on each ethernet and wireless interface. In case of scripted networking # (the default) this is the recommended approach. When using systemd-networkd it's diff --git a/try-this b/try-this deleted file mode 100644 index 6287e39..0000000 --- a/try-this +++ /dev/null @@ -1 +0,0 @@ -nixos-rebuild build --flake .# --cores 8 -j 1 From b4216b35953fd2a903fa2673c6ed870393e3d849 Mon Sep 17 00:00:00 2001 From: _cry64 Date: Fri, 8 Nov 2024 14:26:30 +1000 Subject: [PATCH 022/328] added hypridle, hyprlock, and sddm + sddm-theme-corners --- INSPIRATION | 8 + README.md | 2 + TODO | 28 ++- deploy | 1 + homes/me/default.nix | 230 ++++++++++++++++++- hosts/lolcathost/default.nix | 22 +- hosts/lolcathost/hardware-configuration.nix | 46 ++-- hosts/lolcathost/sddm-theme-corners.nix | 17 ++ hosts/myputer/default.nix | 242 +++++++++----------- hosts/myputer/hardware-configuration.nix | 44 ++-- try-this | 1 - 11 files changed, 445 insertions(+), 196 deletions(-) create mode 100644 INSPIRATION create mode 100755 hosts/lolcathost/sddm-theme-corners.nix delete mode 100644 try-this diff --git a/INSPIRATION b/INSPIRATION new file mode 100644 index 0000000..2c5adf0 --- /dev/null +++ b/INSPIRATION @@ -0,0 +1,8 @@ +Godlike + https://github.com/end-4/dots-hyprland + +Gorgeous + https://github.com/prasanthrangan/hyprdots + +Very nice + https://github.com/linuxmobile/hyprland-dots diff --git a/README.md b/README.md index 0dd5535..ce2a13b 100755 --- a/README.md +++ b/README.md @@ -81,3 +81,5 @@ Really great starter config for learning how parts interact and how to generally Wiki page explaining how to install fonts and nerd fonts on NixOS 4. https://github.com/adi1090x/rofi For the Rofi theme +5. https://github.com/zDyanTB/HyprNova +For the really cool hyprlock theme diff --git a/TODO b/TODO index 489093b..8fedefc 100644 --- a/TODO +++ b/TODO @@ -17,6 +17,12 @@ Get hyprcursor working with Bibata-Modern-Ice +Get waybar (or another bar) working + +Get a GRUB theme working + +Get SDDM and a theme working + Overtime just install more programs that I need regularly: ie - btop/htop/etc @@ -24,12 +30,6 @@ Overtime just install more programs that I need regularly: ie Get a QT theme -Get waybar (or another bar) working - -Get a GRUB theme working - -Get SDDM and a theme working - Fix pipewire audio is so incredibly low (happens on laptop and PC) @@ -48,28 +48,32 @@ Get GTK Bibata Cursors to be the same size as my system cursor Fix: your 131072x1 screen size is bogus. expect trouble -Are there plugins for helix? + Search for all "TODO" items in my nix dotfiles Push nixdots to github + + Check out the Ekala Project (I joined their discord server) + Create a program that enables/disables passwordless sudo access (add to github too) - -Have helix editor look differently depending on language - (specifically don't show indent indicators when editing nix files - - Learn to package my own home-manager modules +Ideal Features: +1. AI assistant +2. searching can also be used to calculate stuff (like I do on my iPad) + + + Fork nixcord and fix documentation (the installation is confusing) But firstly the first code snippet is wrong... diff --git a/deploy b/deploy index 7e49259..b72232d 100755 --- a/deploy +++ b/deploy @@ -1,2 +1,3 @@ #!/usr/bin/env bash sudo nixos-rebuild switch --flake . +#nixos-rebuild build --flake .# --cores 8 -j 1 diff --git a/homes/me/default.nix b/homes/me/default.nix index d899f66..64de919 100755 --- a/homes/me/default.nix +++ b/homes/me/default.nix @@ -72,12 +72,233 @@ # TODO: this lowkey doesnt work... (maybe the name "Dracula" is wrong?) qt = { enable = true; - style = { - name = "Dracula"; - package = pkgs.dracula-qt5-theme; + platformTheme.name = "gtk2"; + style.name = "gtk2"; + }; + + services.hypridle = { + enable = true; + settings = { + general = { + ignore_dbus_inhibit = false; + lock_cmd = "pidof hyprlock || ${pkgs.hyprlock}/bin/hyprlock"; + before_sleep_cmd = "loginctl lock-session"; + after_sleep_cmd = "hyprctl dispatch dpms on"; + }; + + listener = [ + { + timeout = 600; + on-timeout = "pidof hyprlock || ${pkgs.hyprlock}/bin/hyprlock"; + } + + { + timeout = 660; + on-timeout = "systemctl suspend"; + } + ]; }; }; + programs.hyprlock = { + enable = true; + settings = { + background = { + monitor = ""; + path = "$HOME/downloads/1.png"; # only png supported for now + # color = $color1 + + # all these options are taken from hyprland, see https://wiki.hyprland.org/Configuring/Variables/#blur for explanations + blur_size = 4; + blur_passes = 3; # 0 disables blurring + noise = 0.0117; + contrast = 1.3000; # Vibrant!!! + brightness = 0.8000; + vibrancy = 0.2100; + vibrancy_darkness = 0.0; + }; + label = [ + { + # Hours + monitor = ""; + text = ''cmd[update:1000] echo " $(date +"%H") "''; + color = "rgb(255, 255, 255, 1)"; + font_size = 112; + font_family = "Geist Mono 10"; + shadow_passes = 3; + shadow_size = 4; + + position = "0, 240"; + halign = "center"; + valign = "center"; + } + + { + # Minutes + monitor = ""; + text = ''cmd[update:1000] echo " $(date +"%M") "''; + color = "rgb(255, 255, 255, 1)"; + font_size = 112; + font_family = "Geist Mono 10"; + shadow_passes = 3; + shadow_size = 4; + + position = "0, 120"; + halign = "center"; + valign = "center"; + } + + # Today + { + monitor = ""; + text = ''cmd[update:18000000] echo " "$(date +'%A')" "''; + color = "rgb(255, 255, 255, 1)"; + font_size = 22; + font_family = "JetBrainsMono Nerd Font 10"; + + position = "0, 30"; + halign = "center"; + valign = "center"; + } + + # Week + { + monitor = ""; + text = ''cmd[update:18000000] echo " "$(date +'%d %b')" "''; + color = "rgb(255, 255, 255, 1)"; + font_size = 18; + font_family = "JetBrainsMono Nerd Font 10"; + + position = "0, 6"; + halign = "center"; + valign = "center"; + } + + { + # Degrees + monitor = ""; + # get temperature in Brisbane + text = ''cmd[update:18000000] echo "Feels like $(curl -s 'wttr.in/bne?format=%t' | tr -d '+') "''; + color = "rgb(255, 255, 255, 1)"; + font_size = 18; + font_family = "Geist Mono 10"; + + position = "0, 40"; + halign = "center"; + valign = "bottom"; + } + ]; + + input-field = { + monitor = ""; + size = "300, 50"; + outline_thickness = 3; + + dots_size = 0.26; # Scale of input-field height, 0.2 - 0.8 + dots_spacing = 0.64; # Scale of dots' absolute size, 0.0 - 1.0 + dots_center = true; + dots_rouding = -1; + + rounding = 22; + outer_color = "rgb(255, 0, 0, 1)"; + inner_color = "rgb(0, 255, 0, 1)"; + font_color = "rgb(0, 0, 255, 1)"; + fade_on_empty = true; + placeholder_text = "!!Super Secret!!"; # Text rendered in the input box when it's empty. + + position = "0, 120"; + halign = "center"; + valign = "bottom"; + }; + }; + }; + + /* + programs.hyprlock = { + enable = true; + settings = { + general = { + grace = 5; + no_fade_in = false; + disable_loading_bar = false; + }; + + # BACKGROUND + background = { + monitor = ""; + path = "../../../downloads/1.png"; + blur_passes = 0; + contrast = 0.8916; + brightness = 0.7172; + vibrancy = 0.1696; + vibrancy_darkness = 0.0; + }; + + label = [ + { + # Day-Month-Date + monitor = ""; + text = ''cmd[update:1000] echo -e "$(date +"%A, %B %d")"''; + color = "rgb(255, 255, 255, 1)"; + font_size = 28; + font_family = "JetBrainsMono Nerd Font Bold"; + position = "0, 490"; + halign = "center"; + valign = "center"; + } + # Time + { + monitor = ""; + text = ''cmd[update:1000] echo "$(date +"%I:%M")"''; + color = "rgb(255, 255, 255, 1)"; + font_size = 160; + font_family = "steelfish outline regular"; + position = "0, 370"; + halign = "center"; + valign = "center"; + } + # USER + { + monitor = ""; + text = " $USER"; + color = "rgb(255, 255, 255, 1)"; + outline_thickness = 2; + dots_size = 0.2; # Scale of input-field height, 0.2 - 0.8 + dots_spacing = 0.2; # Scale of dots' absolute size, 0.0 - 1.0 + dots_center = true; + font_size = 18; + font_family = "JetBrainsMono Nerd Font Bold"; + position = "0, -180"; + halign = "center"; + valign = "center"; + } + ]; + + # INPUT FIELD + input-field = [ + { + monitor = ""; + size = "300, 60"; + outline_thickness = 2; + dots_size = 0.2; # Scale of input-field height, 0.2 - 0.8 + dots_spacing = 0.2; # Scale of dots' absolute size, 0.0 - 1.0 + dots_center = true; + outer_color = "rgba(255, 255, 255, 0)"; + inner_color = "rgba(255, 255, 255, 0.1)"; + font_color = "rgb(255, 255, 255, 1)"; + fade_on_empty = false; + font_family = "JetBrainsMono Nerd Font Bold"; + placeholder_text = "🔒 Enter Password"; + hide_input = false; + position = "0, -250"; + halign = "center"; + valign = "center"; + } + ]; + }; + }; + */ + programs = { # these are both required for home-manager to work home-manager.enable = true; @@ -138,6 +359,7 @@ completion-replace = true; # completions replace entire word indent-heuristic = "tree-sitter"; # how indentation is computed + # TODO: make this configurable (enabled on myputer, disabled on lolcathost) middle-click-paste = true; insert-final-newline = true; # append newline to file on write @@ -361,7 +583,7 @@ # Run when the `OpenConfigEditor` keybinding is triggered editor = { - program = "nvim"; + program = "hx"; # helix args = []; }; diff --git a/hosts/lolcathost/default.nix b/hosts/lolcathost/default.nix index 85b0217..d81e477 100755 --- a/hosts/lolcathost/default.nix +++ b/hosts/lolcathost/default.nix @@ -66,18 +66,17 @@ in { # ----- SERVICES ----- services = { # Set display manager (login screen) - #displayManager = { - # sddm = { - # enable = true; - # #theme = "${import ./sddm-theme.nix { inherit pkgs; }}"; - # wayland.enable = true; # enable experimental sddm support for wayland - # }; - # defaultSession = "hyprland"; - #}; + displayManager = { + sddm = { + enable = true; + wayland.enable = true; # enable experimental sddm support for wayland + theme = "${import ./sddm-theme-corners.nix {inherit pkgs;}}"; + }; + defaultSession = "hyprland"; + }; # Enable sound - hardware.pulseaudio.enable = false; - security.rtkit.enable = true; + #hardware.pulseaudio.enable = false; pipewire = { enable = true; @@ -95,6 +94,7 @@ in { tumbler.enable = true; # Thunar image thumbnail support gvfs.enable = true; # Thunar mount, trash, and other functionality }; + security.rtkit.enable = true; # allow wheel group to use passwordless sudo users = { @@ -174,6 +174,7 @@ in { zoxide doggo tldr + btop # Pretty necessary git @@ -235,6 +236,7 @@ in { # ]; # }) nerdfonts + geist-font # for my hyprlock theme # texlive maintains a noto-emoji flake texlivePackages.noto-emoji diff --git a/hosts/lolcathost/hardware-configuration.nix b/hosts/lolcathost/hardware-configuration.nix index 1be6ce5..1abc146 100755 --- a/hosts/lolcathost/hardware-configuration.nix +++ b/hosts/lolcathost/hardware-configuration.nix @@ -1,32 +1,36 @@ # 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, ... }: - { - imports = - [ (modulesPath + "/installer/scan/not-detected.nix") - ]; + config, + lib, + pkgs, + modulesPath, + ... +}: { + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + ]; - boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "ahci" "usb_storage" "sd_mod" ]; - boot.initrd.kernelModules = [ ]; - boot.kernelModules = [ "kvm-amd" ]; - boot.extraModulePackages = [ ]; + boot.initrd.availableKernelModules = ["nvme" "xhci_pci" "ahci" "usb_storage" "sd_mod"]; + boot.initrd.kernelModules = []; + boot.kernelModules = ["kvm-amd"]; + boot.extraModulePackages = []; - fileSystems."/" = - { device = "/dev/disk/by-uuid/4bf649ce-047b-472d-b392-4c2c326362d9"; - fsType = "ext4"; - }; + fileSystems."/" = { + device = "/dev/disk/by-uuid/4bf649ce-047b-472d-b392-4c2c326362d9"; + fsType = "ext4"; + }; - fileSystems."/boot" = - { device = "/dev/disk/by-uuid/D97A-5260"; - fsType = "vfat"; - options = [ "fmask=0077" "dmask=0077" ]; - }; + fileSystems."/boot" = { + device = "/dev/disk/by-uuid/D97A-5260"; + fsType = "vfat"; + options = ["fmask=0077" "dmask=0077"]; + }; - swapDevices = - [ { device = "/dev/disk/by-uuid/bfa29193-4f83-46c3-bcb7-0d2b8323b6e0"; } - ]; + swapDevices = [ + {device = "/dev/disk/by-uuid/bfa29193-4f83-46c3-bcb7-0d2b8323b6e0";} + ]; # Enables DHCP on each ethernet and wireless interface. In case of scripted networking # (the default) this is the recommended approach. When using systemd-networkd it's diff --git a/hosts/lolcathost/sddm-theme-corners.nix b/hosts/lolcathost/sddm-theme-corners.nix new file mode 100755 index 0000000..b96abe6 --- /dev/null +++ b/hosts/lolcathost/sddm-theme-corners.nix @@ -0,0 +1,17 @@ +{pkgs}: { + sddm-theme-corners = pkgs.stdenv.mkDerivation rec { + pname = "sddm-theme-corners"; + #version = "1.0"; + #dontBuild = true; + installPhase = '' + mkdir -p $out/share/sddm/themes + cp -ar $src/corners $out/share/sddm/themes/ + ''; + src = pkgs.fetchFromGitHub { + owner = "aczw"; + repo = "sddm-theme-corners"; + rev = "6ff0ff455261badcae36cd7d151a34479f157a3c"; + sha256 = "0iiasrbl7ciyhq3z02la636as915zk9ph063ac7vm5iwny8vgwh8"; + }; + }; +} diff --git a/hosts/myputer/default.nix b/hosts/myputer/default.nix index a557b9e..fb12b72 100755 --- a/hosts/myputer/default.nix +++ b/hosts/myputer/default.nix @@ -1,38 +1,31 @@ -{ +{ pkgs, inputs, - ... -}: - -let + ... +}: let home-manager = builtins.fetchTarball { - url = "https://github.com/nix-community/home-manager/archive/master.tar.gz"; - sha256 = "0kg9iaixqygpncw7avgh1grwyjgnfc9i7k9pk8hc4xrvr8jv2l3c"; + url = "https://github.com/nix-community/home-manager/archive/master.tar.gz"; + sha256 = "0kg9iaixqygpncw7avgh1grwyjgnfc9i7k9pk8hc4xrvr8jv2l3c"; }; -in -{ +in { imports = [ ./hardware-configuration.nix - (import "${home-manager}/nixos") - inputs.spicetify-nix.nixosModules.default + (import "${home-manager}/nixos") + inputs.spicetify-nix.nixosModules.default ]; - programs.spicetify = - let - spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; - in - { - enable = true; - enabledExtensions = with spicePkgs.extensions; [ - adblock - hidePodcasts - shuffle # shuffle+ (special characters are sanitized out of extension names) - ]; - #theme = spicePkgs.themes.catppuccin; - #colorScheme = "mocha"; - }; - - + programs.spicetify = let + spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; + in { + enable = true; + enabledExtensions = with spicePkgs.extensions; [ + adblock + hidePodcasts + shuffle # shuffle+ (special characters are sanitized out of extension names) + ]; + #theme = spicePkgs.themes.catppuccin; + #colorScheme = "mocha"; + }; # Use the systemd-boot EFI boot loader. # TODO: use GRUB2 instead @@ -61,12 +54,11 @@ in #useXkbConfig = true; # use xkb.options in tty. }; - # ----- NETWORKING SECTION ----- networking.hostName = "myputer"; # Pick only one of the below networking options. # networking.wireless.enable = true; # Enables wireless support via wpa_supplicant. - networking.networkmanager.enable = true; # Easiest to use and most distros use this by default. + networking.networkmanager.enable = true; # Easiest to use and most distros use this by default. # Open ports in the firewall. # networking.firewall.allowedTCPPorts = [ ... ]; @@ -74,14 +66,13 @@ in # Or disable the firewall altogether. networking.firewall.enable = true; - # ----- SERVICES ----- services = { # Set display manager (login screen) displayManager = { sddm = { enable = true; - theme = "${import ./sddm-theme.nix { inherit pkgs; }}"; + theme = "${import ./sddm-theme.nix {inherit pkgs;}}"; # enable experimental sddm support for wayland wayland.enable = true; }; @@ -100,78 +91,78 @@ in security.sudo.wheelNeedsPassword = false; users = { # using fish as the login shell tends - # to go very poorly because it isn't - # POSIX compliant, so we'll just use - # simple Bash then :) + # to go very poorly because it isn't + # POSIX compliant, so we'll just use + # simple Bash then :) defaultUserShell = pkgs.bash; - users = { - # just me fr (personal account) - me = { - isNormalUser = true; - extraGroups = [ "wheel" ]; - shell = pkgs.bash; #pkgs.fish - packages = with pkgs; [ - firefox - nitch - starfetch - tldr - ]; - }; - - # programming/development account - dev = { - isNormalUser = true; - extraGroups = [ "wheel" ]; - shell = pkgs.bash; #pkgs.zsh - packages = with pkgs; [ - ]; - }; - - # user for my professional jobs and stuff - ae = { - isNormalUser = true; - extraGroups = [ "wheel" ]; - shell = pkgs.bash; #pkgs.fish - packages = with pkgs; [ - ]; - }; - }; + users = { + # just me fr (personal account) + me = { + isNormalUser = true; + extraGroups = ["wheel"]; + shell = pkgs.bash; #pkgs.fish + packages = with pkgs; [ + firefox + nitch + starfetch + tldr + ]; + }; + + # programming/development account + dev = { + isNormalUser = true; + extraGroups = ["wheel"]; + shell = pkgs.bash; #pkgs.zsh + packages = with pkgs; [ + ]; + }; + + # user for my professional jobs and stuff + ae = { + isNormalUser = true; + extraGroups = ["wheel"]; + shell = pkgs.bash; #pkgs.fish + packages = with pkgs; [ + ]; + }; + }; }; home-manager = { users.me = import ../../homes/me; sharedModules = [ - #inputs.nixcord.homeManagerModules.nixcord - #inputs.nixvim.homeManagerModules.nixvim - ]; + #inputs.nixcord.homeManagerModules.nixcord + #inputs.nixvim.homeManagerModules.nixvim + ]; }; # ---- SYSTEM PACKAGES ----- environment.systemPackages = with pkgs; [ # User Environment - inputs.swww.packages.${pkgs.system}.swww + inputs.swww.packages.${pkgs.system}.swww #vesktop - helvum - easyeffects - ani-cli - wl-clipboard # clipboard for wayland + helvum + easyeffects + ani-cli + wl-clipboard # clipboard for wayland - python311 # I use 3.11 since it's in a pretty stable state now - poetry # python dependency management and packaging + python311 # I use 3.11 since it's in a pretty stable state now + poetry # python dependency management and packaging # fish plugins - grc # colorise command outputs + grc # colorise command outputs httpie - curlie - zoxide - doggo + curlie + zoxide + doggo # Pretty necessary git brightnessctl - acpi + acpi # Unix Commands wget @@ -181,19 +172,18 @@ in # Enable the use of certain programs programs = { hyprland = { - enable = true; - # set the flake package - package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland; + enable = true; + # set the flake package + package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland; # make sure to also set the portal package, so that they are in sync portalPackage = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland; xwayland.enable = true; - #systemd.enable = true; - }; - + #systemd.enable = true; + }; zsh.enable = true; - fish.enable = true; + fish.enable = true; neovim = { enable = true; @@ -202,77 +192,76 @@ in vimAlias = true; configure = { customRC = '' - set number - set tabstop=4 - set shiftwidth=4 + set number + set tabstop=4 + set shiftwidth=4 ''; }; }; # I want to use fish as my login shell but it always goes terrible - # cause it isn't POSIX compliant, so instead Bash is my login and - # will just exec fish (^-^) - bash = { + # cause it isn't POSIX compliant, so instead Bash is my login and + # will just exec fish (^-^) + bash = { interactiveShellInit = '' if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]] then shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION="" exec ${pkgs.fish}/bin/fish $LOGIN_OPTION fi - ''; + ''; }; }; - - # ----- FONTS ----- fonts = { enableDefaultPackages = true; # no clue what this line does tbh packages = with pkgs; [ - (nerdfonts.override { fonts = [ "Cousine" # its already i guess - "Iosevka" # nah nah - "IosevkaTerm" # big nah - "CascadiaCode" # potential - "FiraCode" # potential - "JetBrainsMono" # for my rofi theme - "Hasklig" - "Hack"]; }) - - # texlive maintains a noto-emoji flake - texlivePackages.noto-emoji - ]; + (nerdfonts.override { + fonts = [ + "Cousine" # its already i guess + "Iosevka" # nah nah + "IosevkaTerm" # big nah + "CascadiaCode" # potential + "FiraCode" # potential + "JetBrainsMono" # for my rofi theme + "Hasklig" + "Hack" + ]; + }) - fontconfig = { - defaultFonts = { - serif = [ "Iosevka" ]; # TODO: package Iosevka Etoile since Iosevka isn't a serif font - sansSerif = [ "Iosevka "]; - monospace = [ "Cousine" ]; - emoji = [ "Noto Emoji" ]; - }; - }; + # texlive maintains a noto-emoji flake + texlivePackages.noto-emoji + ]; + + fontconfig = { + defaultFonts = { + serif = ["Iosevka"]; # TODO: package Iosevka Etoile since Iosevka isn't a serif font + sansSerif = ["Iosevka "]; + monospace = ["Cousine"]; + emoji = ["Noto Emoji"]; + }; + }; }; - # ----- STYLIX ----- - + #stylix = { # enable = true; # image = pkgs.fetchurl { # url = "https://www.pixelstalk.net/wp-content/uploads/2016/05/Epic-Anime-Awesome-Wallpapers.jpg"; # sha256 = "enQo3wqhgf0FEPHj2coOCvo7DuZv+x5rL/WIo4qPI50="; # }; - # + # # # Stylix will automatically theme applications # #autoEnable = true; # #image = ../../wallpapers/wall.png; # #image = "/home/me/nixdots/wallpapers/ghibli-esque-valley.png"; #}; - - # Enable the new CLI commands and the flakes as experimental features - nix.settings.experimental-features = [ - "nix-command" + nix.settings.experimental-features = [ + "nix-command" "flakes" ]; @@ -287,16 +276,11 @@ in # Enable the OpenSSH daemon. # services.openssh.enable = true; - # Enable OpenGL hardware = { graphics.enable = true; }; - - # DO NOT MODIFY system.stateVersion = "24.05"; # Did you read the comment? - } - diff --git a/hosts/myputer/hardware-configuration.nix b/hosts/myputer/hardware-configuration.nix index 9eb2faf..3dcf76d 100755 --- a/hosts/myputer/hardware-configuration.nix +++ b/hosts/myputer/hardware-configuration.nix @@ -1,33 +1,39 @@ # 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, ... }: - { - imports = - [ (modulesPath + "/installer/scan/not-detected.nix") - ]; + config, + lib, + pkgs, + modulesPath, + ... +}: { + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + ]; - boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "ahci" "usb_storage" "usbhid" "sd_mod" ]; - boot.initrd.kernelModules = [ ]; - boot.kernelModules = [ "kvm-amd" ]; - boot.extraModulePackages = [ ]; + boot.initrd.availableKernelModules = ["nvme" "xhci_pci" "ahci" "usb_storage" "usbhid" "sd_mod"]; + boot.initrd.kernelModules = []; + boot.kernelModules = ["kvm-amd"]; + boot.extraModulePackages = []; - fileSystems."/" = - { device = "/dev/disk/by-uuid/ff19e1b0-cacc-4270-a94b-7922f7224ae2"; - fsType = "ext4"; - }; + fileSystems."/" = { + device = "/dev/disk/by-uuid/ff19e1b0-cacc-4270-a94b-7922f7224ae2"; + fsType = "ext4"; + }; #fileSystems."/boot" = # BIOS - fileSystems."/boot" = # UEFI - { device = "/dev/disk/by-uuid/7046-177A"; + fileSystems."/boot" = + # UEFI + { + device = "/dev/disk/by-uuid/7046-177A"; fsType = "vfat"; - options = [ "fmask=0077" "dmask=0077" ]; + options = ["fmask=0077" "dmask=0077"]; }; - swapDevices = - [ { device = "/dev/disk/by-uuid/7f7e9d69-78e0-49f1-b792-6be26ed8e040"; } - ]; + swapDevices = [ + {device = "/dev/disk/by-uuid/7f7e9d69-78e0-49f1-b792-6be26ed8e040";} + ]; # Enables DHCP on each ethernet and wireless interface. In case of scripted networking # (the default) this is the recommended approach. When using systemd-networkd it's diff --git a/try-this b/try-this deleted file mode 100644 index 6287e39..0000000 --- a/try-this +++ /dev/null @@ -1 +0,0 @@ -nixos-rebuild build --flake .# --cores 8 -j 1 From 4fcc76a32c9dc0727edd5c338549fab45de08840 Mon Sep 17 00:00:00 2001 From: Emile Clark-Boman Date: Sun, 10 Nov 2024 23:10:51 +1000 Subject: [PATCH 023/328] begun making my home-manager config modular --- TODO | 10 +- flake.lock | 102 +++- flake.nix | 13 +- homes/me/ags/config.js | 15 + homes/me/default.nix | 744 +----------------------- homes/me/wofi.nix | 192 ------ homes/modules/bat.nix | 15 + homes/modules/editor/helix.nix | 135 +++++ homes/modules/editor/nixvim.nix | 24 + homes/modules/firefox.nix | 13 + homes/modules/fish.nix | 18 + homes/modules/git.nix | 11 + homes/modules/hypr/hypridle.nix | 29 + homes/modules/hypr/hyprland.nix | 0 homes/modules/hypr/hyprlock.nix | 118 ++++ homes/modules/kanshi.nix | 60 ++ homes/modules/nixcord.nix | 16 + homes/modules/rio.nix | 68 +++ homes/modules/rofi.nix | 13 + homes/modules/wofi.nix | 183 ++++++ hosts/lolcathost/default.nix | 28 +- hosts/lolcathost/sddm-theme-corners.nix | 2 +- out.data | 724 +++++++++++++++++++++++ 23 files changed, 1586 insertions(+), 947 deletions(-) create mode 100644 homes/me/ags/config.js delete mode 100755 homes/me/wofi.nix create mode 100644 homes/modules/bat.nix create mode 100644 homes/modules/editor/helix.nix create mode 100644 homes/modules/editor/nixvim.nix create mode 100644 homes/modules/firefox.nix create mode 100644 homes/modules/fish.nix create mode 100644 homes/modules/git.nix create mode 100644 homes/modules/hypr/hypridle.nix create mode 100644 homes/modules/hypr/hyprland.nix create mode 100644 homes/modules/hypr/hyprlock.nix create mode 100644 homes/modules/kanshi.nix create mode 100644 homes/modules/nixcord.nix create mode 100644 homes/modules/rio.nix create mode 100644 homes/modules/rofi.nix create mode 100755 homes/modules/wofi.nix create mode 100644 out.data diff --git a/TODO b/TODO index 8fedefc..d91cb7b 100644 --- a/TODO +++ b/TODO @@ -14,15 +14,14 @@ Set a GTK theme & icon theme Get better wallpapers Get hyprcursor working with Bibata-Modern-Ice +Get a GRUB theme working +Get SDDM and a theme working + Get waybar (or another bar) working -Get a GRUB theme working - -Get SDDM and a theme working - Overtime just install more programs that I need regularly: ie - btop/htop/etc @@ -30,8 +29,7 @@ Overtime just install more programs that I need regularly: ie Get a QT theme -Fix pipewire audio is so incredibly low (happens on laptop and PC) - +Fix pipewire audio sometimes working and sometimes not :( Bind new terminal to SUPER+Enter instead of SUPER+Q diff --git a/flake.lock b/flake.lock index b0bac9c..6f70981 100755 --- a/flake.lock +++ b/flake.lock @@ -1,5 +1,24 @@ { "nodes": { + "ags": { + "inputs": { + "nixpkgs": "nixpkgs", + "systems": "systems" + }, + "locked": { + "lastModified": 1728326430, + "narHash": "sha256-tV1ABHuA1HItMdCTuNdA8fMB+qw7LpjvI945VwMSABI=", + "owner": "Aylur", + "repo": "ags", + "rev": "60180a184cfb32b61a1d871c058b31a3b9b0743d", + "type": "github" + }, + "original": { + "owner": "Aylur", + "repo": "ags", + "type": "github" + } + }, "aquamarine": { "inputs": { "hyprutils": [ @@ -119,7 +138,7 @@ }, "grub2-themes": { "inputs": { - "nixpkgs": "nixpkgs" + "nixpkgs": "nixpkgs_2" }, "locked": { "lastModified": 1730004881, @@ -192,9 +211,9 @@ "hyprlang": "hyprlang", "hyprutils": "hyprutils", "hyprwayland-scanner": "hyprwayland-scanner", - "nixpkgs": "nixpkgs_2", + "nixpkgs": "nixpkgs_3", "pre-commit-hooks": "pre-commit-hooks", - "systems": "systems", + "systems": "systems_2", "xdph": "xdph" }, "locked": { @@ -315,10 +334,26 @@ "type": "github" } }, + "nix-flatpak": { + "locked": { + "lastModified": 1711997201, + "narHash": "sha256-J71xzQlVYsjagA4AsVwRazhBh2rZrPpKvxTgs6UzL7c=", + "owner": "gmodena", + "repo": "nix-flatpak", + "rev": "b76fa31346db7fc958a9898f3c594696ca71c4fd", + "type": "github" + }, + "original": { + "owner": "gmodena", + "ref": "v0.4.1", + "repo": "nix-flatpak", + "type": "github" + } + }, "nixcord": { "inputs": { "flake-compat": "flake-compat_2", - "nixpkgs": "nixpkgs_3" + "nixpkgs": "nixpkgs_4" }, "locked": { "lastModified": 1730720546, @@ -336,16 +371,16 @@ }, "nixpkgs": { "locked": { - "lastModified": 1730808093, - "narHash": "sha256-oOenwoxpzQsBNi7KltgnXqq6e0+CxlfNXKn3k27w6cQ=", + "lastModified": 1725634671, + "narHash": "sha256-v3rIhsJBOMLR8e/RNWxr828tB+WywYIoajrZKFM+0Gg=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "c1a390f74b2c93f69a6805142f11a215a689cec1", + "rev": "574d1eac1c200690e27b8eb4e24887f8df7ac27c", "type": "github" }, "original": { "owner": "NixOS", - "ref": "master", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } @@ -367,6 +402,22 @@ } }, "nixpkgs_2": { + "locked": { + "lastModified": 1730808093, + "narHash": "sha256-oOenwoxpzQsBNi7KltgnXqq6e0+CxlfNXKn3k27w6cQ=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c1a390f74b2c93f69a6805142f11a215a689cec1", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "master", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { "locked": { "lastModified": 1730785428, "narHash": "sha256-Zwl8YgTVJTEum+L+0zVAWvXAGbWAuXHax3KzuejaDyo=", @@ -382,7 +433,7 @@ "type": "github" } }, - "nixpkgs_3": { + "nixpkgs_4": { "locked": { "lastModified": 1730768919, "narHash": "sha256-8AKquNnnSaJRXZxc5YmF/WfmxiHX6MMZZasRP6RRQkE=", @@ -398,13 +449,13 @@ "type": "github" } }, - "nixpkgs_4": { + "nixpkgs_5": { "locked": { - "lastModified": 1730531603, - "narHash": "sha256-Dqg6si5CqIzm87sp57j5nTaeBbWhHFaVyG7V6L8k3lY=", + "lastModified": 1730785428, + "narHash": "sha256-Zwl8YgTVJTEum+L+0zVAWvXAGbWAuXHax3KzuejaDyo=", "owner": "nixos", "repo": "nixpkgs", - "rev": "7ffd9ae656aec493492b44d0ddfb28e79a1ea25d", + "rev": "4aa36568d413aca0ea84a1684d2d46f55dbabad7", "type": "github" }, "original": { @@ -414,7 +465,7 @@ "type": "github" } }, - "nixpkgs_5": { + "nixpkgs_6": { "locked": { "lastModified": 1730200266, "narHash": "sha256-l253w0XMT8nWHGXuXqyiIC/bMvh1VRszGXgdpQlfhvU=", @@ -456,11 +507,13 @@ }, "root": { "inputs": { + "ags": "ags", "grub2-themes": "grub2-themes", "home-manager": "home-manager", "hyprland": "hyprland", + "nix-flatpak": "nix-flatpak", "nixcord": "nixcord", - "nixpkgs": "nixpkgs_4", + "nixpkgs": "nixpkgs_5", "spicetify-nix": "spicetify-nix", "swww": "swww" } @@ -489,7 +542,7 @@ "swww": { "inputs": { "flake-compat": "flake-compat_4", - "nixpkgs": "nixpkgs_5", + "nixpkgs": "nixpkgs_6", "utils": "utils" }, "locked": { @@ -522,6 +575,21 @@ } }, "systems_2": { + "locked": { + "lastModified": 1689347949, + "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", + "owner": "nix-systems", + "repo": "default-linux", + "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default-linux", + "type": "github" + } + }, + "systems_3": { "locked": { "lastModified": 1681028828, "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", @@ -538,7 +606,7 @@ }, "utils": { "inputs": { - "systems": "systems_2" + "systems": "systems_3" }, "locked": { "lastModified": 1726560853, diff --git a/flake.nix b/flake.nix index 5ca40a8..f9a840a 100755 --- a/flake.nix +++ b/flake.nix @@ -2,6 +2,7 @@ description = "Emile's Nix Dotfiles"; inputs = { + #nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05"; nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; home-manager = { @@ -14,16 +15,19 @@ inputs.nixpkgs.follows = "nixpkgs"; }; - nixcord = { - url = "github:kaylorben/nixcord"; - }; + nixcord.url = "github:kaylorben/nixcord"; - grub2-themes = {url = "github:vinceliuice/grub2-themes";}; + grub2-themes.url = "github:vinceliuice/grub2-themes"; # is this necessary? (aren't I enabling it in `configuration.nix` anyways?) hyprland.url = "github:hyprwm/Hyprland"; swww.url = "github:LGFae/swww"; + + # TODO: declarative flatpak management + nix-flatpak.url = "github:gmodena/nix-flatpak/?ref=v0.4.1"; + + ags.url = "github:Aylur/ags"; }; outputs = { @@ -63,6 +67,7 @@ modules = [ ./hosts/lolcathost + grub2-themes.nixosModules.default ]; }; }; diff --git a/homes/me/ags/config.js b/homes/me/ags/config.js new file mode 100644 index 0000000..5310091 --- /dev/null +++ b/homes/me/ags/config.js @@ -0,0 +1,15 @@ +const myLabel = Widget.Label({ + label: 'Emillllle', +}) + +const myBar = Widget.Window({ + name: 'bar', + anchor: ['top', 'left', 'right'], + child: myLabel, +}) + +App.config({ + windows: [ + myBar + ] +}) diff --git a/homes/me/default.nix b/homes/me/default.nix index 64de919..19d85d8 100755 --- a/homes/me/default.nix +++ b/homes/me/default.nix @@ -11,10 +11,19 @@ }; imports = [ - #inputs.nixcord.homeManagerModules.nixcord - # inputs.spicetify-nix.homeManagerModules.default - # ./wofi.nix - #../../modules/discord/nixcord.nix + ../modules/git.nix + ../modules/bat.nix + ../modules/fish.nix + ../modules/editor/helix.nix + + ../modules/rio.nix + ../modules/firefox.nix + ../modules/nixcord.nix + + ../modules/hypr/hypridle.nix + ../modules/hypr/hyprlock.nix + ../modules/kanshi.nix + ../modules/wofi.nix ]; /* @@ -76,418 +85,21 @@ style.name = "gtk2"; }; - services.hypridle = { - enable = true; - settings = { - general = { - ignore_dbus_inhibit = false; - lock_cmd = "pidof hyprlock || ${pkgs.hyprlock}/bin/hyprlock"; - before_sleep_cmd = "loginctl lock-session"; - after_sleep_cmd = "hyprctl dispatch dpms on"; - }; - - listener = [ - { - timeout = 600; - on-timeout = "pidof hyprlock || ${pkgs.hyprlock}/bin/hyprlock"; - } - - { - timeout = 660; - on-timeout = "systemctl suspend"; - } - ]; - }; - }; - - programs.hyprlock = { - enable = true; - settings = { - background = { - monitor = ""; - path = "$HOME/downloads/1.png"; # only png supported for now - # color = $color1 - - # all these options are taken from hyprland, see https://wiki.hyprland.org/Configuring/Variables/#blur for explanations - blur_size = 4; - blur_passes = 3; # 0 disables blurring - noise = 0.0117; - contrast = 1.3000; # Vibrant!!! - brightness = 0.8000; - vibrancy = 0.2100; - vibrancy_darkness = 0.0; - }; - label = [ - { - # Hours - monitor = ""; - text = ''cmd[update:1000] echo " $(date +"%H") "''; - color = "rgb(255, 255, 255, 1)"; - font_size = 112; - font_family = "Geist Mono 10"; - shadow_passes = 3; - shadow_size = 4; - - position = "0, 240"; - halign = "center"; - valign = "center"; - } - - { - # Minutes - monitor = ""; - text = ''cmd[update:1000] echo " $(date +"%M") "''; - color = "rgb(255, 255, 255, 1)"; - font_size = 112; - font_family = "Geist Mono 10"; - shadow_passes = 3; - shadow_size = 4; - - position = "0, 120"; - halign = "center"; - valign = "center"; - } - - # Today - { - monitor = ""; - text = ''cmd[update:18000000] echo " "$(date +'%A')" "''; - color = "rgb(255, 255, 255, 1)"; - font_size = 22; - font_family = "JetBrainsMono Nerd Font 10"; - - position = "0, 30"; - halign = "center"; - valign = "center"; - } - - # Week - { - monitor = ""; - text = ''cmd[update:18000000] echo " "$(date +'%d %b')" "''; - color = "rgb(255, 255, 255, 1)"; - font_size = 18; - font_family = "JetBrainsMono Nerd Font 10"; - - position = "0, 6"; - halign = "center"; - valign = "center"; - } - - { - # Degrees - monitor = ""; - # get temperature in Brisbane - text = ''cmd[update:18000000] echo "Feels like $(curl -s 'wttr.in/bne?format=%t' | tr -d '+') "''; - color = "rgb(255, 255, 255, 1)"; - font_size = 18; - font_family = "Geist Mono 10"; - - position = "0, 40"; - halign = "center"; - valign = "bottom"; - } - ]; - - input-field = { - monitor = ""; - size = "300, 50"; - outline_thickness = 3; - - dots_size = 0.26; # Scale of input-field height, 0.2 - 0.8 - dots_spacing = 0.64; # Scale of dots' absolute size, 0.0 - 1.0 - dots_center = true; - dots_rouding = -1; - - rounding = 22; - outer_color = "rgb(255, 0, 0, 1)"; - inner_color = "rgb(0, 255, 0, 1)"; - font_color = "rgb(0, 0, 255, 1)"; - fade_on_empty = true; - placeholder_text = "!!Super Secret!!"; # Text rendered in the input box when it's empty. - - position = "0, 120"; - halign = "center"; - valign = "bottom"; - }; - }; - }; - - /* - programs.hyprlock = { - enable = true; - settings = { - general = { - grace = 5; - no_fade_in = false; - disable_loading_bar = false; - }; - - # BACKGROUND - background = { - monitor = ""; - path = "../../../downloads/1.png"; - blur_passes = 0; - contrast = 0.8916; - brightness = 0.7172; - vibrancy = 0.1696; - vibrancy_darkness = 0.0; - }; - - label = [ - { - # Day-Month-Date - monitor = ""; - text = ''cmd[update:1000] echo -e "$(date +"%A, %B %d")"''; - color = "rgb(255, 255, 255, 1)"; - font_size = 28; - font_family = "JetBrainsMono Nerd Font Bold"; - position = "0, 490"; - halign = "center"; - valign = "center"; - } - # Time - { - monitor = ""; - text = ''cmd[update:1000] echo "$(date +"%I:%M")"''; - color = "rgb(255, 255, 255, 1)"; - font_size = 160; - font_family = "steelfish outline regular"; - position = "0, 370"; - halign = "center"; - valign = "center"; - } - # USER - { - monitor = ""; - text = " $USER"; - color = "rgb(255, 255, 255, 1)"; - outline_thickness = 2; - dots_size = 0.2; # Scale of input-field height, 0.2 - 0.8 - dots_spacing = 0.2; # Scale of dots' absolute size, 0.0 - 1.0 - dots_center = true; - font_size = 18; - font_family = "JetBrainsMono Nerd Font Bold"; - position = "0, -180"; - halign = "center"; - valign = "center"; - } - ]; - - # INPUT FIELD - input-field = [ - { - monitor = ""; - size = "300, 60"; - outline_thickness = 2; - dots_size = 0.2; # Scale of input-field height, 0.2 - 0.8 - dots_spacing = 0.2; # Scale of dots' absolute size, 0.0 - 1.0 - dots_center = true; - outer_color = "rgba(255, 255, 255, 0)"; - inner_color = "rgba(255, 255, 255, 0.1)"; - font_color = "rgb(255, 255, 255, 1)"; - fade_on_empty = false; - font_family = "JetBrainsMono Nerd Font Bold"; - placeholder_text = "🔒 Enter Password"; - hide_input = false; - position = "0, -250"; - halign = "center"; - valign = "center"; - } - ]; - }; - }; - */ - programs = { # these are both required for home-manager to work home-manager.enable = true; - git = { + ags = { enable = true; - userName = "Emile Clark-Boman"; - userEmail = "eclarkboman@gmail.com"; - }; + configDir = ./ags; - # like `/bin/cat` but with syntax highlighting - # TODO: change the pager (maybe use Github:sachaos/viddy instead) - bat = { - enable = true; - config = { - pager = "less -FR"; - # let Stylix control the theme - #theme = "Dracula"; - }; - }; - - #nixvim = { - # enable = true; - # # TODO: allow clipboard to be configurable based on system clipboard - # colorschemes.dracula.enable = true; - # plugins = { - # lualine.enable = true; - # treesitter.enable = true; - # }; - - # opts = { - # number = true; - # tabstop = 4; - # softtabstop = 4; - # shiftwidth = 4; - # }; - - # clipboard.providers.wl-copy.enable = true; - #}; - - # read https://docs.helix-editor.com/editor.html - helix = { - enable = true; - settings = { - theme = "dracula"; - editor = { - line-number = "absolute"; - popup-border = "all"; - scroll-lines = 3; - color-modes = true; # colour the mode indicator depending on mode - shell = ["zsh" "-c"]; - - auto-format = true; - auto-completion = true; # enable popup for autocomplete - completion-timeout = 250; # time before completions display - preview-completion-insert = true; - completion-trigger-len = 2; # min word length to trigger completions - completion-replace = true; # completions replace entire word - - indent-heuristic = "tree-sitter"; # how indentation is computed - # TODO: make this configurable (enabled on myputer, disabled on lolcathost) - middle-click-paste = true; - insert-final-newline = true; # append newline to file on write - - gutters = [ - "diagnostics" - "spacer" - "line-numbers" - "spacer" - "diff" - ]; - - whitespace = { - render = { - space = "none"; # "all" - tab = "none"; #"all" - nbsp = "none"; - nnbsp = "none"; - newline = "none"; - }; - characters = { - space = "·"; - nbsp = "⍽"; - nnbsp = "␣"; - tab = "→"; - newline = "⤶"; - tabpad = "·"; # Tabs will look like "→···" (depending on tab width) - }; - }; - - indent-guides = { - render = true; - character = "▏"; # "|" - skip-levels = 1; - }; - - lsp = { - enable = true; - auto-signature-help = true; # hints for function parameters - display-inlay-hints = true; # inline hints - snippets = true; - }; - - cursor-shape = { - normal = "block"; - insert = "bar"; - select = "block"; - }; - - file-picker = { - hidden = true; # show hidden files - follow-symlinks = true; - deduplicate-links = true; - git-ignore = false; # dont read .gitignore files - ignore = true; # use .ignore for helix instead of .gitignore - }; - - statusline = { - left = [ - "mode" - "spacer" - "version-control" - "spinner" - ]; - center = [ - "file-name" - "read-only-indicator" - "file-modification-indicator" - ]; - right = [ - "position" - "total-line-numbers" - "file-encoding" - "file-line-ending" - "file-type" - ]; - separator = "|"; - mode.normal = "NORMAL"; - mode.insert = "INSERT"; - mode.select = "SELECT"; - }; - }; - }; - - languages.language = [ - { - name = "nix"; - indent = { - tab-width = 2; - unit = " "; - }; - block-comment-tokens = { - start = "/*"; - end = "*/"; - }; - auto-format = true; - formatter.command = "${pkgs.alejandra}/bin/alejandra"; - } - { - name = "python"; - indent = { - tab-width = 4; - unit = " "; - }; - auto-format = false; # my python is beautiful ^_^ - rulers = [80]; - } + extraPackages = with pkgs; [ + gtksourceview + webkitgtk + accountsservice ]; }; - nixcord = { - enable = true; - config = { - frameless = true; - plugins = { - # TODO: remove this plugin - hideAttachments.enable = true; - }; - }; - }; - - firefox = { - enable = true; - policies = { - #BlockAboutConfig = true; - DefaultDownloadDirectory = "\${home}/downloads"; - }; - }; - # I want to use fish as my login shell but it always # goes terrible cause it isn't POSIX compliant, so # instead Bash is my login and it will just exec fish @@ -501,19 +113,6 @@ # ''; #}; - fish = { - enable = true; - interactiveShellInit = '' - set -g fish_greeting "Welcome weary traveler to my shop" - ''; - plugins = [ - { - name = "grc"; - src = pkgs.fishPlugins.grc.src; - } - ]; - }; - /* spicetify = let @@ -530,314 +129,9 @@ colorScheme = "mocha"; }; */ - - # The terminal I use - # TODO: this is dependent on nvim being installed - # TODO: make this into a module with a configurable editor option - rio = { - enable = true; - # Rio Config Docs: https://raphamorim.io/rio/docs/config - settings = { - theme = "dracula"; - hide-mouse-cursor-when-typing = true; - - use-fork = true; # fork (dont spawn) Rio - - padding-x = 10; - padding-y = [15 10]; # top, left - - # lines = (accumulated scroll * multiplier / divider) - scroll = { - multiplier = 3.0; - divider = 1.0; - }; - - fonts = { - size = 15; - features = []; - - regular = { - family = "JetBrainsMono Nerd Font"; # FiraCode - style = "Normal"; - weight = 400; - }; - - bold = { - family = "JetBrainsMono Nerd Font"; - style = "Normal"; - weight = 800; - }; - - italic = { - family = "JetBrainsMono Nerd Font"; - style = "Italic"; - weight = 400; - }; - - bold-italic = { - family = "JetBrainsMono Nerd Font"; - style = "Italic"; - weight = 800; - }; - }; - - # Run when the `OpenConfigEditor` keybinding is triggered - editor = { - program = "hx"; # helix - args = []; - }; - - renderer = { - performance = "High"; - backend = "Automatic"; # Vulkan - }; - }; - }; - - wofi = { - enable = true; - settings = { - location = "center"; - allow_markup = true; - width = 250; - }; - # Force the style to stop Stylix being a bitch and overwriting it - style = lib.mkForce '' - @define-color rosewater #f2d5cf; - @define-color rosewater-rgb rgb(242, 213, 207); - @define-color flamingo #eebebe; - @define-color flamingo-rgb rgb(238, 190, 190); - @define-color pink #f4b8e4; - @define-color pink-rgb rgb(244, 184, 228); - @define-color mauve #ca9ee6; - @define-color mauve-rgb rgb(202, 158, 230); - @define-color red #e78284; - @define-color red-rgb rgb(231, 130, 132); - @define-color maroon #ea999c; - @define-color maroon-rgb rgb(234, 153, 156); - @define-color peach #ef9f76; - @define-color peach-rgb rgb(239, 159, 118); - @define-color yellow #e5c890; - @define-color yellow-rgb rgb(229, 200, 144); - @define-color green #a6d189; - @define-color green-rgb rgb(166, 209, 137); - @define-color teal #81c8be; - @define-color teal-rgb rgb(129, 200, 190); - @define-color sky #99d1db; - @define-color sky-rgb rgb(153, 209, 219); - @define-color sapphire #85c1dc; - @define-color sapphire-rgb rgb(133, 193, 220); - @define-color blue #8caaee; - @define-color blue-rgb rgb(140, 170, 238); - @define-color lavender #babbf1; - @define-color lavender-rgb rgb(186, 187, 241); - @define-color text #c6d0f5; - @define-color text-rgb rgb(198, 208, 245); - @define-color subtext1 #b5bfe2; - @define-color subtext1-rgb rgb(181, 191, 226); - @define-color subtext0 #a5adce; - @define-color subtext0-rgb rgb(165, 173, 206); - @define-color overlay2 #949cbb; - @define-color overlay2-rgb rgb(148, 156, 187); - @define-color overlay1 #838ba7; - @define-color overlay1-rgb rgb(131, 139, 167); - @define-color overlay0 #737994; - @define-color overlay0-rgb rgb(115, 121, 148); - @define-color surface2 #626880; - @define-color surface2-rgb rgb(98, 104, 128); - @define-color surface1 #51576d; - @define-color surface1-rgb rgb(81, 87, 109); - @define-color surface0 #414559; - @define-color surface0-rgb rgb(65, 69, 89); - @define-color base #303446; - @define-color base-rgb rgb(48, 52, 70); - @define-color mantle #292c3c; - @define-color mantle-rgb rgb(41, 44, 60); - @define-color crust #232634; - @define-color crust-rgb rgb(35, 38, 52); - - * { - font-family: 'FiraCode Nerd Font'; - font-size: 16px; - } - - /* Window */ - window { - margin: 0px; - padding: 10px; - border: 0.16em solid @teal; - border-radius: 0.5em; - background-color: @base; - animation: slideIn 0.25s ease-in-out both; - } - - /* Slide In */ - @keyframes slideIn { - 0% { - opacity: 0; - } - - 100% { - opacity: 1; - } - } - - /* Inner Box */ - #inner-box { - margin: 5px; - padding: 10px; - border: none; - background-color: @base; - /*animation: fadeIn 0.5s ease-in-out both;*/ - } - - /* Fade In */ - @keyframes fadeIn { - 0% { - opacity: 0; - } - - 100% { - opacity: 1; - } - } - - /* Outer Box */ - #outer-box { - margin: 5px; - padding: 10px; - border: none; - background-color: @base; - } - - /* Scroll */ - #scroll { - margin: 0px; - padding: 10px; - border: none; - background-color: @base; - } - - /* Input */ - #input { - margin: 5px 20px; - padding: 10px; - border: none; - border-radius: 0.25em; - color: @text; - background-color: @base; - animation: fadeIn 0.25s ease-in-out both; - } - - #input image { - border: none; - color: @red; - } - - #input * { - outline: 4px solid @red!important; - } - - /* Text */ - #text { - margin: 5px; - border: none; - color: @text; - animation: fadeIn 0.5s ease-in-out both; - } - - #entry { - background-color: @base; - } - - #entry arrow { - border: none; - color: @teal; - } - - /* Selected Entry */ - #entry:selected { - border: 0.10em solid @teal; - border-radius: 0.25em; - } - - #entry:selected #text { - color: @teal; - } - - #entry:drop(active) { - background-color: @lavender!important; - } - ''; - }; - - rofi = { - enable = true; - package = pkgs.rofi-wayland; - font = "JetBrains Mono Nerd Font 10"; - location = "center"; - terminal = "${pkgs.rio}/bin/rio"; - }; }; # ----- SERVICES ----- - services = { - # Change monitor positions - # TODO: find a way to make this modular (ie put something different for my laptop) - # my idea is to have a "monitors" module and use kanshi for wayland - kanshi = { - enable = true; - systemdTarget = "hyprland-session.target"; - # You can find your monitors in hyprland by using `hyprctl monitors all` - settings = [ - { - # 1920x1080@144 gaming monitor - output.criteria = "HDMI-A-1"; - output.mode = "1920x1080@119.98Hz"; - output.scale = 1.0; - output.adaptiveSync = false; # Variable Refresh Rate (this can be changed for gaming) - } - { - # 4k side monitor - output.criteria = "DP-2"; - output.mode = "3840x2160@60.00Hz"; - output.scale = 2.0; - } - { - # laptop builtin screen - output.criteria = "eDP-1"; - output.mode = "1920x1080@60.02Hz"; - output.scale = 1.0; - } - - { - # This is my dual-monitor desktop setup - profile.name = "myputer"; - profile.outputs = [ - { - criteria = "DP-2"; - position = "0,0"; - } - { - criteria = "HDMI-A-1"; - position = "3840,0"; - } - ]; - } - { - # This is my laptop (lolcathost) :) - profile.name = "lolcathost"; - profile.outputs = [ - { - criteria = "eDP-1"; - position = "0,0"; - } - ]; - } - ]; - }; - }; - # Nicely reload system units when changing configs systemd.user.startServices = "sd-switch"; diff --git a/homes/me/wofi.nix b/homes/me/wofi.nix deleted file mode 100755 index 8613519..0000000 --- a/homes/me/wofi.nix +++ /dev/null @@ -1,192 +0,0 @@ -{ - lib, - config, - pkgs, - ... -}: - -{ - options = { - #enable = lib.mkEnableOption "Enable wofi and my configuration"; - }; - - config = { - programs = { - wofi = { - enable = true; - settings = { - location = "center"; - allow_markup = true; - width = 250; - }; - style = '' - @define-color rosewater #f2d5cf; - @define-color rosewater-rgb rgb(242, 213, 207); - @define-color flamingo #eebebe; - @define-color flamingo-rgb rgb(238, 190, 190); - @define-color pink #f4b8e4; - @define-color pink-rgb rgb(244, 184, 228); - @define-color mauve #ca9ee6; - @define-color mauve-rgb rgb(202, 158, 230); - @define-color red #e78284; - @define-color red-rgb rgb(231, 130, 132); - @define-color maroon #ea999c; - @define-color maroon-rgb rgb(234, 153, 156); - @define-color peach #ef9f76; - @define-color peach-rgb rgb(239, 159, 118); - @define-color yellow #e5c890; - @define-color yellow-rgb rgb(229, 200, 144); - @define-color green #a6d189; - @define-color green-rgb rgb(166, 209, 137); - @define-color teal #81c8be; - @define-color teal-rgb rgb(129, 200, 190); - @define-color sky #99d1db; - @define-color sky-rgb rgb(153, 209, 219); - @define-color sapphire #85c1dc; - @define-color sapphire-rgb rgb(133, 193, 220); - @define-color blue #8caaee; - @define-color blue-rgb rgb(140, 170, 238); - @define-color lavender #babbf1; - @define-color lavender-rgb rgb(186, 187, 241); - @define-color text #c6d0f5; - @define-color text-rgb rgb(198, 208, 245); - @define-color subtext1 #b5bfe2; - @define-color subtext1-rgb rgb(181, 191, 226); - @define-color subtext0 #a5adce; - @define-color subtext0-rgb rgb(165, 173, 206); - @define-color overlay2 #949cbb; - @define-color overlay2-rgb rgb(148, 156, 187); - @define-color overlay1 #838ba7; - @define-color overlay1-rgb rgb(131, 139, 167); - @define-color overlay0 #737994; - @define-color overlay0-rgb rgb(115, 121, 148); - @define-color surface2 #626880; - @define-color surface2-rgb rgb(98, 104, 128); - @define-color surface1 #51576d; - @define-color surface1-rgb rgb(81, 87, 109); - @define-color surface0 #414559; - @define-color surface0-rgb rgb(65, 69, 89); - @define-color base #303446; - @define-color base-rgb rgb(48, 52, 70); - @define-color mantle #292c3c; - @define-color mantle-rgb rgb(41, 44, 60); - @define-color crust #232634; - @define-color crust-rgb rgb(35, 38, 52); - - * { - font-family: 'FiraCode Nerd Font', monospace; - font-size: 16px; - } - - /* Window */ - window { - margin: 0px; - padding: 10px; - border: 0.16em solid @teal; - border-radius: 0.5em; - background-color: @base; - animation: slideIn 0.25s ease-in-out both; - } - - /* Slide In */ - @keyframes slideIn { - 0% { - opacity: 0; - } - - 100% { - opacity: 1; - } - } - - /* Inner Box */ - #inner-box { - margin: 5px; - padding: 10px; - border: none; - background-color: @base; - /*animation: fadeIn 0.5s ease-in-out both;*/ - } - - /* Fade In */ - @keyframes fadeIn { - 0% { - opacity: 0; - } - - 100% { - opacity: 1; - } - } - - /* Outer Box */ - #outer-box { - margin: 5px; - padding: 10px; - border: none; - background-color: @base; - } - - /* Scroll */ - #scroll { - margin: 0px; - padding: 10px; - border: none; - background-color: @base; - } - - /* Input */ - #input { - margin: 5px 20px; - padding: 10px; - border: none; - border-radius: 0.25em; - color: @text; - background-color: @base; - animation: fadeIn 0.25s ease-in-out both; - } - - #input image { - border: none; - color: @red; - } - - #input * { - outline: 4px solid @red!important; - } - - /* Text */ - #text { - margin: 5px; - border: none; - color: @text; - animation: fadeIn 0.5s ease-in-out both; - } - - #entry { - background-color: @base; - } - - #entry arrow { - border: none; - color: @teal; - } - - /* Selected Entry */ - #entry:selected { - border: 0.10em solid @teal; - border-radius: 0.25em; - } - - #entry:selected #text { - color: @teal; - } - - #entry:drop(active) { - background-color: @lavender!important; - } - '' - }; - }; - }; -} diff --git a/homes/modules/bat.nix b/homes/modules/bat.nix new file mode 100644 index 0000000..f29f49b --- /dev/null +++ b/homes/modules/bat.nix @@ -0,0 +1,15 @@ +{ + config, + pkgs, + ... +}: { + # like `/bin/cat` but with syntax highlighting + # TODO: change the pager (maybe use Github:sachaos/viddy instead) + programs.bat = { + enable = true; + config = { + pager = "less -FR"; + theme = "Dracula"; + }; + }; +} diff --git a/homes/modules/editor/helix.nix b/homes/modules/editor/helix.nix new file mode 100644 index 0000000..4a66841 --- /dev/null +++ b/homes/modules/editor/helix.nix @@ -0,0 +1,135 @@ +{ + config, + pkgs, + ... +}: { + # read https://docs.helix-editor.com/editor.html + programs.helix = { + enable = true; + settings = { + theme = "dracula"; + editor = { + line-number = "absolute"; + popup-border = "all"; + scroll-lines = 3; + color-modes = true; # colour the mode indicator depending on mode + shell = ["zsh" "-c"]; + + auto-format = true; + auto-completion = true; # enable popup for autocomplete + completion-timeout = 250; # time before completions display + preview-completion-insert = true; + completion-trigger-len = 2; # min word length to trigger completions + completion-replace = true; # completions replace entire word + + indent-heuristic = "tree-sitter"; # how indentation is computed + # TODO: make this configurable (enabled on myputer, disabled on lolcathost) + middle-click-paste = true; + insert-final-newline = true; # append newline to file on write + + gutters = [ + "diagnostics" + "spacer" + "line-numbers" + "spacer" + "diff" + ]; + + whitespace = { + render = { + space = "none"; # "all" + tab = "none"; #"all" + nbsp = "none"; + nnbsp = "none"; + newline = "none"; + }; + characters = { + space = "·"; + nbsp = "⍽"; + nnbsp = "␣"; + tab = "→"; + newline = "⤶"; + tabpad = "·"; # Tabs will look like "→···" (depending on tab width) + }; + }; + + indent-guides = { + render = true; + character = "▏"; # "|" + skip-levels = 1; + }; + + lsp = { + enable = true; + auto-signature-help = true; # hints for function parameters + display-inlay-hints = true; # inline hints + snippets = true; + }; + + cursor-shape = { + normal = "block"; + insert = "bar"; + select = "block"; + }; + + file-picker = { + hidden = true; # show hidden files + follow-symlinks = true; + deduplicate-links = true; + git-ignore = false; # dont read .gitignore files + ignore = true; # use .ignore for helix instead of .gitignore + }; + + statusline = { + left = [ + "mode" + "spacer" + "version-control" + "spinner" + ]; + center = [ + "file-name" + "read-only-indicator" + "file-modification-indicator" + ]; + right = [ + "position" + "total-line-numbers" + "file-encoding" + "file-line-ending" + "file-type" + ]; + separator = "|"; + mode.normal = "NORMAL"; + mode.insert = "INSERT"; + mode.select = "SELECT"; + }; + }; + }; + + languages.language = [ + { + name = "nix"; + indent = { + tab-width = 2; + unit = " "; + }; + block-comment-tokens = { + start = "/*"; + end = "*/"; + }; + auto-format = true; + formatter.command = "${pkgs.alejandra}/bin/alejandra"; + } + { + name = "python"; + indent = { + tab-width = 4; + unit = " "; + }; + auto-format = false; # my python is beautiful ^_^ + rulers = [80]; + } + ]; + }; +} diff --git a/homes/modules/editor/nixvim.nix b/homes/modules/editor/nixvim.nix new file mode 100644 index 0000000..9197417 --- /dev/null +++ b/homes/modules/editor/nixvim.nix @@ -0,0 +1,24 @@ +{ + config, + pkgs, + ... +}: { + programs.nixvim = { + enable = true; + # TODO: allow clipboard to be configurable based on system clipboard + colorschemes.dracula.enable = true; + plugins = { + lualine.enable = true; + treesitter.enable = true; + }; + + opts = { + number = true; + tabstop = 4; + softtabstop = 4; + shiftwidth = 4; + }; + + clipboard.providers.wl-copy.enable = true; + }; +} diff --git a/homes/modules/firefox.nix b/homes/modules/firefox.nix new file mode 100644 index 0000000..1ad1564 --- /dev/null +++ b/homes/modules/firefox.nix @@ -0,0 +1,13 @@ +{ + config, + pkgs, + ... +}: { + programs.firefox = { + enable = true; + policies = { + #BlockAboutConfig = true; + DefaultDownloadDirectory = "\${home}/downloads"; + }; + }; +} diff --git a/homes/modules/fish.nix b/homes/modules/fish.nix new file mode 100644 index 0000000..3cb9bc7 --- /dev/null +++ b/homes/modules/fish.nix @@ -0,0 +1,18 @@ +{ + config, + pkgs, + ... +}: { + programs.fish = { + enable = true; + interactiveShellInit = '' + set -g fish_greeting "Welcome weary traveler to my shop" + ''; + plugins = [ + { + name = "grc"; + src = pkgs.fishPlugins.grc.src; + } + ]; + }; +} diff --git a/homes/modules/git.nix b/homes/modules/git.nix new file mode 100644 index 0000000..c98ab4e --- /dev/null +++ b/homes/modules/git.nix @@ -0,0 +1,11 @@ +{ + config, + pkgs, + ... +}: { + programs.git = { + enable = true; + userName = "Emile Clark-Boman"; + userEmail = "eclarkboman@gmail.com"; + }; +} diff --git a/homes/modules/hypr/hypridle.nix b/homes/modules/hypr/hypridle.nix new file mode 100644 index 0000000..e31be07 --- /dev/null +++ b/homes/modules/hypr/hypridle.nix @@ -0,0 +1,29 @@ +{ + config, + pkgs, + ... +}: { + services.hypridle = { + enable = true; + settings = { + general = { + ignore_dbus_inhibit = false; + lock_cmd = "pidof hyprlock || ${pkgs.hyprlock}/bin/hyprlock"; + before_sleep_cmd = "loginctl lock-session"; + after_sleep_cmd = "hyprctl dispatch dpms on"; + }; + + listener = [ + { + timeout = 600; + on-timeout = "pidof hyprlock || ${pkgs.hyprlock}/bin/hyprlock"; + } + + { + timeout = 660; + on-timeout = "systemctl suspend"; + } + ]; + }; + }; +} diff --git a/homes/modules/hypr/hyprland.nix b/homes/modules/hypr/hyprland.nix new file mode 100644 index 0000000..e69de29 diff --git a/homes/modules/hypr/hyprlock.nix b/homes/modules/hypr/hyprlock.nix new file mode 100644 index 0000000..50245bc --- /dev/null +++ b/homes/modules/hypr/hyprlock.nix @@ -0,0 +1,118 @@ +{ + config, + pkgs, + ... +}: { + programs.hyprlock = { + enable = true; + settings = { + background = { + monitor = ""; + path = "$HOME/downloads/wallpaper/1380597.png"; # only png supported for now + # color = $color1 + + # all these options are taken from hyprland, see https://wiki.hyprland.org/Configuring/Variables/#blur for explanations + blur_size = 4; + blur_passes = 3; # 0 disables blurring + noise = 0.0117; + contrast = 1.3000; # Vibrant!!! + brightness = 0.8000; + vibrancy = 0.2100; + vibrancy_darkness = 0.0; + }; + label = [ + { + # Hours + monitor = ""; + text = ''cmd[update:1000] echo " $(date +"%H") "''; + color = "rgb(255, 255, 255, 1)"; + font_size = 112; + font_family = "Geist Mono 10"; + shadow_passes = 3; + shadow_size = 4; + + position = "0, 240"; + halign = "center"; + valign = "center"; + } + + { + # Minutes + monitor = ""; + text = ''cmd[update:1000] echo " $(date +"%M") "''; + color = "rgb(255, 255, 255, 1)"; + font_size = 112; + font_family = "Geist Mono 10"; + shadow_passes = 3; + shadow_size = 4; + + position = "0, 120"; + halign = "center"; + valign = "center"; + } + + # Today + { + monitor = ""; + text = ''cmd[update:18000000] echo " "$(date +'%A')" "''; + color = "rgb(255, 255, 255, 1)"; + font_size = 22; + font_family = "JetBrainsMono Nerd Font 10"; + + position = "0, 30"; + halign = "center"; + valign = "center"; + } + + # Week + { + monitor = ""; + text = ''cmd[update:18000000] echo " "$(date +'%d %b')" "''; + color = "rgb(255, 255, 255, 1)"; + font_size = 18; + font_family = "JetBrainsMono Nerd Font 10"; + + position = "0, 6"; + halign = "center"; + valign = "center"; + } + + { + # Degrees + monitor = ""; + # get temperature in Brisbane + text = ''cmd[update:18000000] echo "Feels like $(curl -s 'wttr.in/bne?format=%t' | tr -d '+') "''; + color = "rgb(255, 255, 255, 1)"; + font_size = 18; + font_family = "Geist Mono 10"; + + position = "0, 40"; + halign = "center"; + valign = "bottom"; + } + ]; + + input-field = { + monitor = ""; + size = "300, 50"; + outline_thickness = 3; + + dots_size = 0.26; # Scale of input-field height, 0.2 - 0.8 + dots_spacing = 0.64; # Scale of dots' absolute size, 0.0 - 1.0 + dots_center = true; + dots_rouding = -1; + + rounding = 22; + outer_color = "rgb(255, 0, 0, 1)"; + inner_color = "rgb(0, 255, 0, 1)"; + font_color = "rgb(0, 0, 255, 1)"; + fade_on_empty = true; + placeholder_text = "!!Super Secret!!"; # Text rendered in the input box when it's empty. + + position = "0, 120"; + halign = "center"; + valign = "bottom"; + }; + }; + }; +} diff --git a/homes/modules/kanshi.nix b/homes/modules/kanshi.nix new file mode 100644 index 0000000..906f6a8 --- /dev/null +++ b/homes/modules/kanshi.nix @@ -0,0 +1,60 @@ +{ + config, + pkgs, + ... +}: { + # Change monitor positions + # TODO: find a way to make this modular (ie put something different for my laptop) + # my idea is to have a "monitors" module and use kanshi for wayland + services.kanshi = { + enable = true; + systemdTarget = "hyprland-session.target"; + # You can find your monitors in hyprland by using `hyprctl monitors all` + settings = [ + { + # 1920x1080@144 gaming monitor + output.criteria = "HDMI-A-1"; + output.mode = "1920x1080@119.98Hz"; + output.scale = 1.0; + output.adaptiveSync = false; # Variable Refresh Rate (this can be changed for gaming) + } + { + # 4k side monitor + output.criteria = "DP-2"; + output.mode = "3840x2160@60.00Hz"; + output.scale = 2.0; + } + { + # laptop builtin screen + output.criteria = "eDP-1"; + output.mode = "1920x1080@60.02Hz"; + output.scale = 1.0; + } + + { + # This is my dual-monitor desktop setup + profile.name = "myputer"; + profile.outputs = [ + { + criteria = "DP-2"; + position = "0,0"; + } + { + criteria = "HDMI-A-1"; + position = "3840,0"; + } + ]; + } + { + # This is my laptop (lolcathost) :) + profile.name = "lolcathost"; + profile.outputs = [ + { + criteria = "eDP-1"; + position = "0,0"; + } + ]; + } + ]; + }; +} diff --git a/homes/modules/nixcord.nix b/homes/modules/nixcord.nix new file mode 100644 index 0000000..a006c0e --- /dev/null +++ b/homes/modules/nixcord.nix @@ -0,0 +1,16 @@ +{ + config, + pkgs, + ... +}: { + programs.nixcord = { + enable = true; + config = { + frameless = true; + plugins = { + # TODO: remove this plugin + hideAttachments.enable = true; + }; + }; + }; +} diff --git a/homes/modules/rio.nix b/homes/modules/rio.nix new file mode 100644 index 0000000..84ea3a2 --- /dev/null +++ b/homes/modules/rio.nix @@ -0,0 +1,68 @@ +{ + config, + pkgs, + ... +}: { + # The terminal I use + # TODO: this is dependent on nvim being installed + # TODO: make this into a module with a configurable editor option + programs.rio = { + enable = true; + # Rio Config Docs: https://raphamorim.io/rio/docs/config + settings = { + theme = "dracula"; + hide-mouse-cursor-when-typing = true; + + use-fork = true; # fork (dont spawn) Rio + + padding-x = 10; + padding-y = [15 10]; # top, left + + # lines = (accumulated scroll * multiplier / divider) + scroll = { + multiplier = 3.0; + divider = 1.0; + }; + + fonts = { + size = 15; + features = []; + + regular = { + family = "JetBrainsMono Nerd Font"; # FiraCode + style = "Normal"; + weight = 400; + }; + + bold = { + family = "JetBrainsMono Nerd Font"; + style = "Normal"; + weight = 800; + }; + + italic = { + family = "JetBrainsMono Nerd Font"; + style = "Italic"; + weight = 400; + }; + + bold-italic = { + family = "JetBrainsMono Nerd Font"; + style = "Italic"; + weight = 800; + }; + }; + + # Run when the `OpenConfigEditor` keybinding is triggered + editor = { + program = "hx"; # helix + args = []; + }; + + renderer = { + performance = "High"; + backend = "Automatic"; # Vulkan + }; + }; + }; +} diff --git a/homes/modules/rofi.nix b/homes/modules/rofi.nix new file mode 100644 index 0000000..6d05543 --- /dev/null +++ b/homes/modules/rofi.nix @@ -0,0 +1,13 @@ +{ + config, + pkgs, + ... +}: { + programs.rofi = { + enable = true; + package = pkgs.rofi-wayland; + font = "JetBrains Mono Nerd Font 10"; + location = "center"; + terminal = "${pkgs.rio}/bin/rio"; + }; +} diff --git a/homes/modules/wofi.nix b/homes/modules/wofi.nix new file mode 100755 index 0000000..81a25d3 --- /dev/null +++ b/homes/modules/wofi.nix @@ -0,0 +1,183 @@ +{ + lib, + config, + pkgs, + ... +}: { + programs.wofi = { + enable = true; + settings = { + location = "center"; + allow_markup = true; + width = 250; + }; + # Force the style to stop Stylix being a bitch and overwriting it + style = lib.mkForce '' + @define-color rosewater #f2d5cf; + @define-color rosewater-rgb rgb(242, 213, 207); + @define-color flamingo #eebebe; + @define-color flamingo-rgb rgb(238, 190, 190); + @define-color pink #f4b8e4; + @define-color pink-rgb rgb(244, 184, 228); + @define-color mauve #ca9ee6; + @define-color mauve-rgb rgb(202, 158, 230); + @define-color red #e78284; + @define-color red-rgb rgb(231, 130, 132); + @define-color maroon #ea999c; + @define-color maroon-rgb rgb(234, 153, 156); + @define-color peach #ef9f76; + @define-color peach-rgb rgb(239, 159, 118); + @define-color yellow #e5c890; + @define-color yellow-rgb rgb(229, 200, 144); + @define-color green #a6d189; + @define-color green-rgb rgb(166, 209, 137); + @define-color teal #81c8be; + @define-color teal-rgb rgb(129, 200, 190); + @define-color sky #99d1db; + @define-color sky-rgb rgb(153, 209, 219); + @define-color sapphire #85c1dc; + @define-color sapphire-rgb rgb(133, 193, 220); + @define-color blue #8caaee; + @define-color blue-rgb rgb(140, 170, 238); + @define-color lavender #babbf1; + @define-color lavender-rgb rgb(186, 187, 241); + @define-color text #c6d0f5; + @define-color text-rgb rgb(198, 208, 245); + @define-color subtext1 #b5bfe2; + @define-color subtext1-rgb rgb(181, 191, 226); + @define-color subtext0 #a5adce; + @define-color subtext0-rgb rgb(165, 173, 206); + @define-color overlay2 #949cbb; + @define-color overlay2-rgb rgb(148, 156, 187); + @define-color overlay1 #838ba7; + @define-color overlay1-rgb rgb(131, 139, 167); + @define-color overlay0 #737994; + @define-color overlay0-rgb rgb(115, 121, 148); + @define-color surface2 #626880; + @define-color surface2-rgb rgb(98, 104, 128); + @define-color surface1 #51576d; + @define-color surface1-rgb rgb(81, 87, 109); + @define-color surface0 #414559; + @define-color surface0-rgb rgb(65, 69, 89); + @define-color base #303446; + @define-color base-rgb rgb(48, 52, 70); + @define-color mantle #292c3c; + @define-color mantle-rgb rgb(41, 44, 60); + @define-color crust #232634; + @define-color crust-rgb rgb(35, 38, 52); + + * { + font-family: 'FiraCode Nerd Font'; + font-size: 16px; + } + + /* Window */ + window { + margin: 0px; + padding: 10px; + border: 0.16em solid @teal; + border-radius: 0.5em; + background-color: @base; + animation: slideIn 0.25s ease-in-out both; + } + + /* Slide In */ + @keyframes slideIn { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + /* Inner Box */ + #inner-box { + margin: 5px; + padding: 10px; + border: none; + background-color: @base; + /*animation: fadeIn 0.5s ease-in-out both;*/ + } + + /* Fade In */ + @keyframes fadeIn { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + /* Outer Box */ + #outer-box { + margin: 5px; + padding: 10px; + border: none; + background-color: @base; + } + + /* Scroll */ + #scroll { + margin: 0px; + padding: 10px; + border: none; + background-color: @base; + } + + /* Input */ + #input { + margin: 5px 20px; + padding: 10px; + border: none; + border-radius: 0.25em; + color: @text; + background-color: @base; + animation: fadeIn 0.25s ease-in-out both; + } + + #input image { + border: none; + color: @red; + } + + #input * { + outline: 4px solid @red!important; + } + + /* Text */ + #text { + margin: 5px; + border: none; + color: @text; + animation: fadeIn 0.5s ease-in-out both; + } + + #entry { + background-color: @base; + } + + #entry arrow { + border: none; + color: @teal; + } + + /* Selected Entry */ + #entry:selected { + border: 0.10em solid @teal; + border-radius: 0.25em; + } + + #entry:selected #text { + color: @teal; + } + + #entry:drop(active) { + background-color: @lavender!important; + } + ''; + }; +} diff --git a/hosts/lolcathost/default.nix b/hosts/lolcathost/default.nix index d81e477..806a6a6 100755 --- a/hosts/lolcathost/default.nix +++ b/hosts/lolcathost/default.nix @@ -1,8 +1,13 @@ { pkgs, inputs, + lib, ... }: let + #home-manager = builtins.fetchTarball { + # url = "https://github.com/nix-community/home-manager/archive/release-24.05.tar.gz"; + # sha256 = "00wp0s9b5nm5rsbwpc1wzfrkyxxmqjwsc1kcibjdbfkh69arcpsn"; + #}; home-manager = builtins.fetchTarball { url = "https://github.com/nix-community/home-manager/archive/master.tar.gz"; sha256 = "19w63qccz78v0spx03911z98w1bvlxvd07hb0ma14a4vdzi4ninj"; @@ -38,6 +43,13 @@ in { #efiInstallAsRemovable = true; # in case canTouchEfiVariables doesn't work on this system device = "nodev"; }; + # GitHub: vinceliuice/grub2-themes + grub2-theme = { + enable = true; + theme = "whitesur"; # sylish, vimix, or whitesur + footer = true; + customResolution = "1920x1080"; # Optional: Set a custom resolution + }; }; # Set your time zone. @@ -67,10 +79,11 @@ in { services = { # Set display manager (login screen) displayManager = { + # sddm relies on pkgs.libsForQt5.qt5.qtgraphicaleffects sddm = { enable = true; wayland.enable = true; # enable experimental sddm support for wayland - theme = "${import ./sddm-theme-corners.nix {inherit pkgs;}}"; + theme = "corners"; }; defaultSession = "hyprland"; }; @@ -114,6 +127,11 @@ in { firefox nitch starfetch + + # flatpak requires gnome-software + # for graphical applications + flatpak + gnome.gnome-software ]; }; @@ -126,7 +144,7 @@ in { ]; }; - # # programming/development account + # # This is the user account for servers # dev = { # isNormalUser = true; # extraGroups = ["wheel"]; @@ -149,6 +167,7 @@ in { users.me = import ../../homes/me; sharedModules = [ inputs.nixcord.homeManagerModules.nixcord + inputs.ags.homeManagerModules.default ]; }; @@ -163,6 +182,10 @@ in { wl-clipboard # clipboard for wayland kcalc # TEMP: (FOR TESTING) + (callPackage ./sddm-theme-corners.nix {}).sddm-theme-corners + # dependencies for my sddm theme: + pkgs.libsForQt5.qt5.qtgraphicaleffects + python311 # I use 3.11 since it's in a pretty stable state now poetry # python dependency management and packaging @@ -180,6 +203,7 @@ in { git brightnessctl acpi + vim # Unix Commands wget diff --git a/hosts/lolcathost/sddm-theme-corners.nix b/hosts/lolcathost/sddm-theme-corners.nix index b96abe6..ccc93f0 100755 --- a/hosts/lolcathost/sddm-theme-corners.nix +++ b/hosts/lolcathost/sddm-theme-corners.nix @@ -1,6 +1,6 @@ {pkgs}: { sddm-theme-corners = pkgs.stdenv.mkDerivation rec { - pname = "sddm-theme-corners"; + name = "sddm-theme-corners"; #version = "1.0"; #dontBuild = true; installPhase = '' diff --git a/out.data b/out.data new file mode 100644 index 0000000..fabfd34 --- /dev/null +++ b/out.data @@ -0,0 +1,724 @@ +warning: Git tree '/home/me/nixdots' is dirty +building the system configuration... +warning: Git tree '/home/me/nixdots' is dirty +error: + … while calling anonymous lambda + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/attrsets.nix:1570:24: + 1569| let f = attrPath: + 1570| zipAttrsWith (n: values: + | ^ + 1571| let here = attrPath ++ [n]; in + + … while calling the 'head' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/attrsets.nix:1574:11: + 1573| || pred here (elemAt values 1) (head values) then + 1574| head values + | ^ + 1575| else + + … while calling anonymous lambda + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/attrsets.nix:1204:18: + 1203| mapAttrs + 1204| (name: value: + | ^ + 1205| if isAttrs value && cond value + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/attrsets.nix:1207:18: + 1206| then recurse (path ++ [ name ]) value + 1207| else f (path ++ [ name ]) value); + | ^ + 1208| in + + … while calling anonymous lambda + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:254:72: + 253| # For definitions that have an associated option + 254| declaredConfig = mapAttrsRecursiveCond (v: ! isOption v) (_: v: v.value) options; + | ^ + 255| + + … while evaluating the attribute 'value' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:816:9: + 815| in warnDeprecation opt // + 816| { value = addErrorContext "while evaluating the option `${showOption loc}':" value; + | ^ + 817| inherit (res.defsFinal') highestPrio; + + … while evaluating the option `system.build.toplevel': + + … while evaluating the attribute 'mergedValue' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:851:5: + 850| # Type-check the remaining definitions, and merge them. Or throw if no definitions. + 851| mergedValue = + | ^ + 852| if isDefined then + + … while evaluating a branch condition + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:852:7: + 851| mergedValue = + 852| if isDefined then + | ^ + 853| if all (def: type.check def.value) defsFinal then type.merge loc defsFinal + + … while evaluating the attribute 'values' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:845:9: + 844| in { + 845| values = defs'''; + | ^ + 846| inherit (defs'') highestPrio; + + … while evaluating a branch condition + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:841:11: + 840| # Avoid sorting if we don't have to. + 841| if any (def: def.value._type or "" == "order") defs''.values + | ^ + 842| then sortProperties defs''.values + + … while calling the 'any' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:841:14: + 840| # Avoid sorting if we don't have to. + 841| if any (def: def.value._type or "" == "order") defs''.values + | ^ + 842| then sortProperties defs''.values + + … while evaluating the attribute 'values' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:944:7: + 943| in { + 944| values = concatMap (def: if getPrio def == highestPrio then [(strip def)] else []) defs; + | ^ + 945| inherit highestPrio; + + … while calling the 'concatMap' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:944:16: + 943| in { + 944| values = concatMap (def: if getPrio def == highestPrio then [(strip def)] else []) defs; + | ^ + 945| inherit highestPrio; + + … while calling the 'concatMap' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:831:17: + 830| # Process mkMerge and mkIf properties. + 831| defs' = concatMap (m: + | ^ + 832| map (value: { inherit (m) file; inherit value; }) (addErrorContext "while evaluating definitions from `${m.file}':" (dischargeProperties m.value)) + + … while calling anonymous lambda + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:831:28: + 830| # Process mkMerge and mkIf properties. + 831| defs' = concatMap (m: + | ^ + 832| map (value: { inherit (m) file; inherit value; }) (addErrorContext "while evaluating definitions from `${m.file}':" (dischargeProperties m.value)) + + … while calling the 'map' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:832:11: + 831| defs' = concatMap (m: + 832| map (value: { inherit (m) file; inherit value; }) (addErrorContext "while evaluating definitions from `${m.file}':" (dischargeProperties m.value)) + | ^ + 833| ) defs; + + … while evaluating definitions from `/nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/nixos/modules/system/activation/top-level.nix': + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:832:128: + 831| defs' = concatMap (m: + 832| map (value: { inherit (m) file; inherit value; }) (addErrorContext "while evaluating definitions from `${m.file}':" (dischargeProperties m.value)) + | ^ + 833| ) defs; + + … while calling 'dischargeProperties' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:903:25: + 902| */ + 903| dischargeProperties = def: + | ^ + 904| if def._type or "" == "merge" then + + … while evaluating a branch condition + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:904:5: + 903| dischargeProperties = def: + 904| if def._type or "" == "merge" then + | ^ + 905| concatMap dischargeProperties def.contents + + … while evaluating the attribute 'value' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:614:53: + 613| (n: value: + 614| [{ inherit (module) file; inherit value; }] + | ^ + 615| ) + + … while evaluating a branch condition + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/nixos/modules/system/activation/top-level.nix:72:26: + 71| + 72| baseSystemAssertWarn = if failedAssertions != [] + | ^ + 73| then throw "\nFailed assertions:\n${concatStringsSep "\n" (map (x: "- ${x}") failedAssertions)}" + + … while calling the 'map' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/nixos/modules/system/activation/top-level.nix:70:22: + 69| + 70| failedAssertions = map (x: x.message) (filter (x: !x.assertion) config.assertions); + | ^ + 71| + + … while calling the 'filter' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/nixos/modules/system/activation/top-level.nix:70:42: + 69| + 70| failedAssertions = map (x: x.message) (filter (x: !x.assertion) config.assertions); + | ^ + 71| + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/nixos/modules/system/activation/top-level.nix:70:67: + 69| + 70| failedAssertions = map (x: x.message) (filter (x: !x.assertion) config.assertions); + | ^ + 71| + + … while calling anonymous lambda + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/attrsets.nix:1204:18: + 1203| mapAttrs + 1204| (name: value: + | ^ + 1205| if isAttrs value && cond value + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/attrsets.nix:1207:18: + 1206| then recurse (path ++ [ name ]) value + 1207| else f (path ++ [ name ]) value); + | ^ + 1208| in + + … while calling anonymous lambda + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:254:72: + 253| # For definitions that have an associated option + 254| declaredConfig = mapAttrsRecursiveCond (v: ! isOption v) (_: v: v.value) options; + | ^ + 255| + + … while evaluating the attribute 'value' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:816:9: + 815| in warnDeprecation opt // + 816| { value = addErrorContext "while evaluating the option `${showOption loc}':" value; + | ^ + 817| inherit (res.defsFinal') highestPrio; + + … while evaluating the option `assertions': + + (10 duplicate frames omitted) + + … while evaluating definitions from `/nix/store/78sgjxjd6p9wns5mriffngcrvxp9sfaa-source/nixos/common.nix': + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:832:128: + 831| defs' = concatMap (m: + 832| map (value: { inherit (m) file; inherit value; }) (addErrorContext "while evaluating definitions from `${m.file}':" (dischargeProperties m.value)) + | ^ + 833| ) defs; + + … while calling 'dischargeProperties' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:903:25: + 902| */ + 903| dischargeProperties = def: + | ^ + 904| if def._type or "" == "merge" then + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:909:11: + 908| if def.condition then + 909| dischargeProperties def.content + | ^ + 910| else + + … while calling 'dischargeProperties' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:903:25: + 902| */ + 903| dischargeProperties = def: + | ^ + 904| if def._type or "" == "merge" then + + … while evaluating a branch condition + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:904:5: + 903| dischargeProperties = def: + 904| if def._type or "" == "merge" then + | ^ + 905| concatMap dischargeProperties def.contents + + … while evaluating the attribute 'content' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:1008:25: + 1007| { _type = "if"; + 1008| inherit condition content; + | ^ + 1009| }; + + … from call site + at /nix/store/78sgjxjd6p9wns5mriffngcrvxp9sfaa-source/nixos/common.nix:110:20: + 109| + 110| assertions = flatten (flip mapAttrsToList cfg.users (user: config: + | ^ + 111| flip map config.assertions (assertion: { + + … while calling 'flatten' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/lists.nix:431:13: + 430| */ + 431| flatten = x: + | ^ + 432| if isList x + + … while calling the 'concatMap' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/lists.nix:433:10: + 432| if isList x + 433| then concatMap (y: flatten y) x + | ^ + 434| else [x]; + + … while calling anonymous lambda + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/lists.nix:433:21: + 432| if isList x + 433| then concatMap (y: flatten y) x + | ^ + 434| else [x]; + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/lists.nix:433:24: + 432| if isList x + 433| then concatMap (y: flatten y) x + | ^ + 434| else [x]; + + … while calling 'flatten' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/lists.nix:431:13: + 430| */ + 431| flatten = x: + | ^ + 432| if isList x + + … while evaluating a branch condition + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/lists.nix:432:5: + 431| flatten = x: + 432| if isList x + | ^ + 433| then concatMap (y: flatten y) x + + … while calling the 'isList' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/lists.nix:432:8: + 431| flatten = x: + 432| if isList x + | ^ + 433| then concatMap (y: flatten y) x + + … while calling anonymous lambda + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/attrsets.nix:1095:10: + 1094| attrs: + 1095| map (name: f name attrs.${name}) (attrNames attrs); + | ^ + 1096| + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/attrsets.nix:1095:16: + 1094| attrs: + 1095| map (name: f name attrs.${name}) (attrNames attrs); + | ^ + 1096| + + … while calling anonymous lambda + at /nix/store/78sgjxjd6p9wns5mriffngcrvxp9sfaa-source/nixos/common.nix:110:66: + 109| + 110| assertions = flatten (flip mapAttrsToList cfg.users (user: config: + | ^ + 111| flip map config.assertions (assertion: { + + … from call site + at /nix/store/78sgjxjd6p9wns5mriffngcrvxp9sfaa-source/nixos/common.nix:111:9: + 110| assertions = flatten (flip mapAttrsToList cfg.users (user: config: + 111| flip map config.assertions (assertion: { + | ^ + 112| inherit (assertion) assertion; + + … while calling 'flip' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/trivial.nix:317:16: + 316| */ + 317| flip = f: a: b: f b a; + | ^ + 318| + + … while calling the 'map' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/trivial.nix:317:19: + 316| */ + 317| flip = f: a: b: f b a; + | ^ + 318| + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/attrsets.nix:1095:23: + 1094| attrs: + 1095| map (name: f name attrs.${name}) (attrNames attrs); + | ^ + 1096| + + … while calling anonymous lambda + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/types.nix:577:22: + 576| merge = loc: defs: + 577| mapAttrs (n: v: v.value) (filterAttrs (n: v: v ? value) (zipAttrsWith (name: defs: + | ^ + 578| (mergeDefinitions (loc ++ [name]) elemType defs).optionalValue + + … while evaluating the attribute 'value' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:864:27: + 863| optionalValue = + 864| if isDefined then { value = mergedValue; } + | ^ + 865| else {}; + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:853:59: + 852| if isDefined then + 853| if all (def: type.check def.value) defsFinal then type.merge loc defsFinal + | ^ + 854| else let allInvalid = filter (def: ! type.check def.value) defsFinal; + + … while calling 'merge' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/types.nix:881:22: + 880| check = x: isAttrs x || isFunction x || path.check x; + 881| merge = loc: defs: + | ^ + 882| (base.extendModules { + + … while evaluating the attribute 'config' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:334:9: + 333| options = checked options; + 334| config = checked (removeAttrs config [ "_module" ]); + | ^ + 335| _module = checked (config._module); + + … while calling the 'seq' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:334:18: + 333| options = checked options; + 334| config = checked (removeAttrs config [ "_module" ]); + | ^ + 335| _module = checked (config._module); + + … while evaluating a branch condition + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:273:9: + 272| checkUnmatched = + 273| if config._module.check && config._module.freeformType == null && merged.unmatchedDefns != [] then + | ^ + 274| let + + … in the left operand of the AND (&&) operator + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:273:72: + 272| checkUnmatched = + 273| if config._module.check && config._module.freeformType == null && merged.unmatchedDefns != [] then + | ^ + 274| let + + … in the left operand of the AND (&&) operator + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:273:33: + 272| checkUnmatched = + 273| if config._module.check && config._module.freeformType == null && merged.unmatchedDefns != [] then + | ^ + 274| let + + … while evaluating a branch condition + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:266:12: + 265| + 266| in if declaredConfig._module.freeformType == null then declaredConfig + | ^ + 267| # Because all definitions that had an associated option ended in + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:254:28: + 253| # For definitions that have an associated option + 254| declaredConfig = mapAttrsRecursiveCond (v: ! isOption v) (_: v: v.value) options; + | ^ + 255| + + … while calling 'mapAttrsRecursiveCond' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/attrsets.nix:1200:5: + 1199| f: + 1200| set: + | ^ + 1201| let + + … while calling the 'mapAttrs' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/attrsets.nix:1209:5: + 1208| in + 1209| recurse [ ] set; + | ^ + 1210| + + … while evaluating the attribute 'matchedOptions' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:692:15: + 691| in { + 692| inherit matchedOptions; + | ^ + 693| + + … while calling the 'mapAttrs' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:683:24: + 682| + 683| matchedOptions = mapAttrs (n: v: v.matchedOptions) resultsByName; + | ^ + 684| + + … while calling the 'mapAttrs' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:636:23: + 635| + 636| resultsByName = mapAttrs (name: decls: + | ^ + 637| # We're descending into attribute ‘name’. + + … while calling the 'zipAttrsWith' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:553:9: + 552| declsByName = + 553| zipAttrsWith + | ^ + 554| (n: concatLists) + + … while calling the 'map' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:555:12: + 554| (n: concatLists) + 555| (map + | ^ + 556| (module: let subtree = module.options; in + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:246:33: + 245| ({ inherit lib options config specialArgs; } // specialArgs); + 246| in mergeModules prefix (reverseList collected); + | ^ + 247| + + … while calling 'reverseList' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/lists.nix:1116:17: + 1115| */ + 1116| reverseList = xs: + | ^ + 1117| let l = length xs; in genList (n: elemAt xs (l - n - 1)) l; + + … while calling the 'genList' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/lists.nix:1117:27: + 1116| reverseList = xs: + 1117| let l = length xs; in genList (n: elemAt xs (l - n - 1)) l; + | ^ + 1118| + + … while evaluating the second argument passed to builtins.genList + + … while calling the 'length' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/lists.nix:1117:13: + 1116| reverseList = xs: + 1117| let l = length xs; in genList (n: elemAt xs (l - n - 1)) l; + | ^ + 1118| + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:241:25: + 240| merged = + 241| let collected = collectModules + | ^ + 242| class + + … while calling anonymous lambda + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:452:37: + 451| + 452| in modulesPath: initialModules: args: + | ^ + 453| filterModules modulesPath (collectStructuredModules unknownModule "" initialModules args); + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:453:7: + 452| in modulesPath: initialModules: args: + 453| filterModules modulesPath (collectStructuredModules unknownModule "" initialModules args); + | ^ + 454| + + … while calling 'filterModules' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:420:36: + 419| # modules recursively. It returns the final list of unique-by-key modules + 420| filterModules = modulesPath: { disabled, modules }: + | ^ + 421| let + + … while calling the 'map' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:447:12: + 446| keyFilter = filter (attrs: ! elem attrs.key disabledKeys); + 447| in map (attrs: attrs.module) (genericClosure { + | ^ + 448| startSet = keyFilter modules; + + … while calling the 'genericClosure' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:447:39: + 446| keyFilter = filter (attrs: ! elem attrs.key disabledKeys); + 447| in map (attrs: attrs.module) (genericClosure { + | ^ + 448| startSet = keyFilter modules; + + … while calling the 'filter' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:448:22: + 447| in map (attrs: attrs.module) (genericClosure { + 448| startSet = keyFilter modules; + | ^ + 449| operator = attrs: keyFilter attrs.modules; + + … while calling anonymous lambda + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:446:31: + 445| disabledKeys = concatMap ({ file, disabled }: map (moduleKey file) disabled) disabled; + 446| keyFilter = filter (attrs: ! elem attrs.key disabledKeys); + | ^ + 447| in map (attrs: attrs.module) (genericClosure { + + … in the argument of the not operator + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:446:40: + 445| disabledKeys = concatMap ({ file, disabled }: map (moduleKey file) disabled) disabled; + 446| keyFilter = filter (attrs: ! elem attrs.key disabledKeys); + | ^ + 447| in map (attrs: attrs.module) (genericClosure { + + … while calling the 'elem' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:446:40: + 445| disabledKeys = concatMap ({ file, disabled }: map (moduleKey file) disabled) disabled; + 446| keyFilter = filter (attrs: ! elem attrs.key disabledKeys); + | ^ + 447| in map (attrs: attrs.module) (genericClosure { + + … while calling the 'concatMap' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:445:26: + 444| + 445| disabledKeys = concatMap ({ file, disabled }: map (moduleKey file) disabled) disabled; + | ^ + 446| keyFilter = filter (attrs: ! elem attrs.key disabledKeys); + + … while calling the 'concatLists' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:402:24: + 401| collectResults = modules: { + 402| disabled = concatLists (catAttrs "disabled" modules); + | ^ + 403| inherit modules; + + … while evaluating the attribute 'disabled' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:402:13: + 401| collectResults = modules: { + 402| disabled = concatLists (catAttrs "disabled" modules); + | ^ + 403| inherit modules; + + … while calling the 'concatLists' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:402:24: + 401| collectResults = modules: { + 402| disabled = concatLists (catAttrs "disabled" modules); + | ^ + 403| inherit modules; + + … while evaluating the attribute 'disabled' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:402:13: + 401| collectResults = modules: { + 402| disabled = concatLists (catAttrs "disabled" modules); + | ^ + 403| inherit modules; + + … while calling the 'concatLists' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:402:24: + 401| collectResults = modules: { + 402| disabled = concatLists (catAttrs "disabled" modules); + | ^ + 403| inherit modules; + + … while evaluating a branch condition + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:413:25: + 412| modules = collectedImports.modules; + 413| disabled = (if module.disabledModules != [] then [{ file = module._file; disabled = module.disabledModules; }] else []) ++ collectedImports.disabled; + | ^ + 414| }) initialModules); + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:407:22: + 406| let + 407| module = checkModule (loadModule args parentFile "${parentKey}:anon-${toString n}" x); + | ^ + 408| collectedImports = collectStructuredModules module._file module.key module.imports args; + + … while calling anonymous lambda + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:366:11: + 365| then + 366| m: + | ^ + 367| if m._class != null -> m._class == class + + … while evaluating a branch condition + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:367:13: + 366| m: + 367| if m._class != null -> m._class == class + | ^ + 368| then m + + … in the left operand of the IMPL (->) operator + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:367:33: + 366| m: + 367| if m._class != null -> m._class == class + | ^ + 368| then m + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:407:35: + 406| let + 407| module = checkModule (loadModule args parentFile "${parentKey}:anon-${toString n}" x); + | ^ + 408| collectedImports = collectStructuredModules module._file module.key module.imports args; + + … while calling 'loadModule' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:348:53: + 347| # Like unifyModuleSyntax, but also imports paths and calls functions if necessary + 348| loadModule = args: fallbackFile: fallbackKey: m: + | ^ + 349| if isFunction m then + + … while evaluating a branch condition + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:349:9: + 348| loadModule = args: fallbackFile: fallbackKey: m: + 349| if isFunction m then + | ^ + 350| unifyModuleSyntax fallbackFile fallbackKey (applyModuleArgs fallbackKey m args) + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:349:12: + 348| loadModule = args: fallbackFile: fallbackKey: m: + 349| if isFunction m then + | ^ + 350| unifyModuleSyntax fallbackFile fallbackKey (applyModuleArgs fallbackKey m args) + + … while calling 'isFunction' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/trivial.nix:1000:16: + 999| */ + 1000| isFunction = f: builtins.isFunction f || + | ^ + 1001| (f ? __functor && isFunction (f.__functor f)); + + … in the left operand of the OR (||) operator + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/trivial.nix:1000:41: + 999| */ + 1000| isFunction = f: builtins.isFunction f || + | ^ + 1001| (f ? __functor && isFunction (f.__functor f)); + + … while calling the 'isFunction' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/trivial.nix:1000:19: + 999| */ + 1000| isFunction = f: builtins.isFunction f || + | ^ + 1001| (f ? __functor && isFunction (f.__functor f)); + + … while calling the 'elemAt' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/lists.nix:334:43: + 333| */ + 334| imap1 = f: list: genList (n: f (n + 1) (elemAt list n)) (length list); + | ^ + 335| + + … while calling the 'import' builtin + at /nix/store/d46k1bziqlp4h2657vc56cmy3llxh4gg-source/homes/me/default.nix:14:7: + 13| imports = [ + 14| (import ./helix.nix { inherit pkgs; } ) + | ^ + 15| # inputs.spicetify-nix.homeManagerModules.default + + error: path '/nix/store/d46k1bziqlp4h2657vc56cmy3llxh4gg-source/homes/me/helix.nix' does not exist From b03961b3dc484bc11b41f6c98dd092aa7e989cf6 Mon Sep 17 00:00:00 2001 From: _cry64 Date: Sun, 10 Nov 2024 23:10:51 +1000 Subject: [PATCH 024/328] begun making my home-manager config modular --- TODO | 10 +- flake.lock | 102 +++- flake.nix | 13 +- homes/me/ags/config.js | 15 + homes/me/default.nix | 744 +----------------------- homes/me/wofi.nix | 192 ------ homes/modules/bat.nix | 15 + homes/modules/editor/helix.nix | 135 +++++ homes/modules/editor/nixvim.nix | 24 + homes/modules/firefox.nix | 13 + homes/modules/fish.nix | 18 + homes/modules/git.nix | 11 + homes/modules/hypr/hypridle.nix | 29 + homes/modules/hypr/hyprland.nix | 0 homes/modules/hypr/hyprlock.nix | 118 ++++ homes/modules/kanshi.nix | 60 ++ homes/modules/nixcord.nix | 16 + homes/modules/rio.nix | 68 +++ homes/modules/rofi.nix | 13 + homes/modules/wofi.nix | 183 ++++++ hosts/lolcathost/default.nix | 28 +- hosts/lolcathost/sddm-theme-corners.nix | 2 +- out.data | 724 +++++++++++++++++++++++ 23 files changed, 1586 insertions(+), 947 deletions(-) create mode 100644 homes/me/ags/config.js delete mode 100755 homes/me/wofi.nix create mode 100644 homes/modules/bat.nix create mode 100644 homes/modules/editor/helix.nix create mode 100644 homes/modules/editor/nixvim.nix create mode 100644 homes/modules/firefox.nix create mode 100644 homes/modules/fish.nix create mode 100644 homes/modules/git.nix create mode 100644 homes/modules/hypr/hypridle.nix create mode 100644 homes/modules/hypr/hyprland.nix create mode 100644 homes/modules/hypr/hyprlock.nix create mode 100644 homes/modules/kanshi.nix create mode 100644 homes/modules/nixcord.nix create mode 100644 homes/modules/rio.nix create mode 100644 homes/modules/rofi.nix create mode 100755 homes/modules/wofi.nix create mode 100644 out.data diff --git a/TODO b/TODO index 8fedefc..d91cb7b 100644 --- a/TODO +++ b/TODO @@ -14,15 +14,14 @@ Set a GTK theme & icon theme Get better wallpapers Get hyprcursor working with Bibata-Modern-Ice +Get a GRUB theme working +Get SDDM and a theme working + Get waybar (or another bar) working -Get a GRUB theme working - -Get SDDM and a theme working - Overtime just install more programs that I need regularly: ie - btop/htop/etc @@ -30,8 +29,7 @@ Overtime just install more programs that I need regularly: ie Get a QT theme -Fix pipewire audio is so incredibly low (happens on laptop and PC) - +Fix pipewire audio sometimes working and sometimes not :( Bind new terminal to SUPER+Enter instead of SUPER+Q diff --git a/flake.lock b/flake.lock index b0bac9c..6f70981 100755 --- a/flake.lock +++ b/flake.lock @@ -1,5 +1,24 @@ { "nodes": { + "ags": { + "inputs": { + "nixpkgs": "nixpkgs", + "systems": "systems" + }, + "locked": { + "lastModified": 1728326430, + "narHash": "sha256-tV1ABHuA1HItMdCTuNdA8fMB+qw7LpjvI945VwMSABI=", + "owner": "Aylur", + "repo": "ags", + "rev": "60180a184cfb32b61a1d871c058b31a3b9b0743d", + "type": "github" + }, + "original": { + "owner": "Aylur", + "repo": "ags", + "type": "github" + } + }, "aquamarine": { "inputs": { "hyprutils": [ @@ -119,7 +138,7 @@ }, "grub2-themes": { "inputs": { - "nixpkgs": "nixpkgs" + "nixpkgs": "nixpkgs_2" }, "locked": { "lastModified": 1730004881, @@ -192,9 +211,9 @@ "hyprlang": "hyprlang", "hyprutils": "hyprutils", "hyprwayland-scanner": "hyprwayland-scanner", - "nixpkgs": "nixpkgs_2", + "nixpkgs": "nixpkgs_3", "pre-commit-hooks": "pre-commit-hooks", - "systems": "systems", + "systems": "systems_2", "xdph": "xdph" }, "locked": { @@ -315,10 +334,26 @@ "type": "github" } }, + "nix-flatpak": { + "locked": { + "lastModified": 1711997201, + "narHash": "sha256-J71xzQlVYsjagA4AsVwRazhBh2rZrPpKvxTgs6UzL7c=", + "owner": "gmodena", + "repo": "nix-flatpak", + "rev": "b76fa31346db7fc958a9898f3c594696ca71c4fd", + "type": "github" + }, + "original": { + "owner": "gmodena", + "ref": "v0.4.1", + "repo": "nix-flatpak", + "type": "github" + } + }, "nixcord": { "inputs": { "flake-compat": "flake-compat_2", - "nixpkgs": "nixpkgs_3" + "nixpkgs": "nixpkgs_4" }, "locked": { "lastModified": 1730720546, @@ -336,16 +371,16 @@ }, "nixpkgs": { "locked": { - "lastModified": 1730808093, - "narHash": "sha256-oOenwoxpzQsBNi7KltgnXqq6e0+CxlfNXKn3k27w6cQ=", + "lastModified": 1725634671, + "narHash": "sha256-v3rIhsJBOMLR8e/RNWxr828tB+WywYIoajrZKFM+0Gg=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "c1a390f74b2c93f69a6805142f11a215a689cec1", + "rev": "574d1eac1c200690e27b8eb4e24887f8df7ac27c", "type": "github" }, "original": { "owner": "NixOS", - "ref": "master", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } @@ -367,6 +402,22 @@ } }, "nixpkgs_2": { + "locked": { + "lastModified": 1730808093, + "narHash": "sha256-oOenwoxpzQsBNi7KltgnXqq6e0+CxlfNXKn3k27w6cQ=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c1a390f74b2c93f69a6805142f11a215a689cec1", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "master", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { "locked": { "lastModified": 1730785428, "narHash": "sha256-Zwl8YgTVJTEum+L+0zVAWvXAGbWAuXHax3KzuejaDyo=", @@ -382,7 +433,7 @@ "type": "github" } }, - "nixpkgs_3": { + "nixpkgs_4": { "locked": { "lastModified": 1730768919, "narHash": "sha256-8AKquNnnSaJRXZxc5YmF/WfmxiHX6MMZZasRP6RRQkE=", @@ -398,13 +449,13 @@ "type": "github" } }, - "nixpkgs_4": { + "nixpkgs_5": { "locked": { - "lastModified": 1730531603, - "narHash": "sha256-Dqg6si5CqIzm87sp57j5nTaeBbWhHFaVyG7V6L8k3lY=", + "lastModified": 1730785428, + "narHash": "sha256-Zwl8YgTVJTEum+L+0zVAWvXAGbWAuXHax3KzuejaDyo=", "owner": "nixos", "repo": "nixpkgs", - "rev": "7ffd9ae656aec493492b44d0ddfb28e79a1ea25d", + "rev": "4aa36568d413aca0ea84a1684d2d46f55dbabad7", "type": "github" }, "original": { @@ -414,7 +465,7 @@ "type": "github" } }, - "nixpkgs_5": { + "nixpkgs_6": { "locked": { "lastModified": 1730200266, "narHash": "sha256-l253w0XMT8nWHGXuXqyiIC/bMvh1VRszGXgdpQlfhvU=", @@ -456,11 +507,13 @@ }, "root": { "inputs": { + "ags": "ags", "grub2-themes": "grub2-themes", "home-manager": "home-manager", "hyprland": "hyprland", + "nix-flatpak": "nix-flatpak", "nixcord": "nixcord", - "nixpkgs": "nixpkgs_4", + "nixpkgs": "nixpkgs_5", "spicetify-nix": "spicetify-nix", "swww": "swww" } @@ -489,7 +542,7 @@ "swww": { "inputs": { "flake-compat": "flake-compat_4", - "nixpkgs": "nixpkgs_5", + "nixpkgs": "nixpkgs_6", "utils": "utils" }, "locked": { @@ -522,6 +575,21 @@ } }, "systems_2": { + "locked": { + "lastModified": 1689347949, + "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", + "owner": "nix-systems", + "repo": "default-linux", + "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default-linux", + "type": "github" + } + }, + "systems_3": { "locked": { "lastModified": 1681028828, "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", @@ -538,7 +606,7 @@ }, "utils": { "inputs": { - "systems": "systems_2" + "systems": "systems_3" }, "locked": { "lastModified": 1726560853, diff --git a/flake.nix b/flake.nix index 5ca40a8..f9a840a 100755 --- a/flake.nix +++ b/flake.nix @@ -2,6 +2,7 @@ description = "Emile's Nix Dotfiles"; inputs = { + #nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05"; nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; home-manager = { @@ -14,16 +15,19 @@ inputs.nixpkgs.follows = "nixpkgs"; }; - nixcord = { - url = "github:kaylorben/nixcord"; - }; + nixcord.url = "github:kaylorben/nixcord"; - grub2-themes = {url = "github:vinceliuice/grub2-themes";}; + grub2-themes.url = "github:vinceliuice/grub2-themes"; # is this necessary? (aren't I enabling it in `configuration.nix` anyways?) hyprland.url = "github:hyprwm/Hyprland"; swww.url = "github:LGFae/swww"; + + # TODO: declarative flatpak management + nix-flatpak.url = "github:gmodena/nix-flatpak/?ref=v0.4.1"; + + ags.url = "github:Aylur/ags"; }; outputs = { @@ -63,6 +67,7 @@ modules = [ ./hosts/lolcathost + grub2-themes.nixosModules.default ]; }; }; diff --git a/homes/me/ags/config.js b/homes/me/ags/config.js new file mode 100644 index 0000000..5310091 --- /dev/null +++ b/homes/me/ags/config.js @@ -0,0 +1,15 @@ +const myLabel = Widget.Label({ + label: 'Emillllle', +}) + +const myBar = Widget.Window({ + name: 'bar', + anchor: ['top', 'left', 'right'], + child: myLabel, +}) + +App.config({ + windows: [ + myBar + ] +}) diff --git a/homes/me/default.nix b/homes/me/default.nix index 64de919..19d85d8 100755 --- a/homes/me/default.nix +++ b/homes/me/default.nix @@ -11,10 +11,19 @@ }; imports = [ - #inputs.nixcord.homeManagerModules.nixcord - # inputs.spicetify-nix.homeManagerModules.default - # ./wofi.nix - #../../modules/discord/nixcord.nix + ../modules/git.nix + ../modules/bat.nix + ../modules/fish.nix + ../modules/editor/helix.nix + + ../modules/rio.nix + ../modules/firefox.nix + ../modules/nixcord.nix + + ../modules/hypr/hypridle.nix + ../modules/hypr/hyprlock.nix + ../modules/kanshi.nix + ../modules/wofi.nix ]; /* @@ -76,418 +85,21 @@ style.name = "gtk2"; }; - services.hypridle = { - enable = true; - settings = { - general = { - ignore_dbus_inhibit = false; - lock_cmd = "pidof hyprlock || ${pkgs.hyprlock}/bin/hyprlock"; - before_sleep_cmd = "loginctl lock-session"; - after_sleep_cmd = "hyprctl dispatch dpms on"; - }; - - listener = [ - { - timeout = 600; - on-timeout = "pidof hyprlock || ${pkgs.hyprlock}/bin/hyprlock"; - } - - { - timeout = 660; - on-timeout = "systemctl suspend"; - } - ]; - }; - }; - - programs.hyprlock = { - enable = true; - settings = { - background = { - monitor = ""; - path = "$HOME/downloads/1.png"; # only png supported for now - # color = $color1 - - # all these options are taken from hyprland, see https://wiki.hyprland.org/Configuring/Variables/#blur for explanations - blur_size = 4; - blur_passes = 3; # 0 disables blurring - noise = 0.0117; - contrast = 1.3000; # Vibrant!!! - brightness = 0.8000; - vibrancy = 0.2100; - vibrancy_darkness = 0.0; - }; - label = [ - { - # Hours - monitor = ""; - text = ''cmd[update:1000] echo " $(date +"%H") "''; - color = "rgb(255, 255, 255, 1)"; - font_size = 112; - font_family = "Geist Mono 10"; - shadow_passes = 3; - shadow_size = 4; - - position = "0, 240"; - halign = "center"; - valign = "center"; - } - - { - # Minutes - monitor = ""; - text = ''cmd[update:1000] echo " $(date +"%M") "''; - color = "rgb(255, 255, 255, 1)"; - font_size = 112; - font_family = "Geist Mono 10"; - shadow_passes = 3; - shadow_size = 4; - - position = "0, 120"; - halign = "center"; - valign = "center"; - } - - # Today - { - monitor = ""; - text = ''cmd[update:18000000] echo " "$(date +'%A')" "''; - color = "rgb(255, 255, 255, 1)"; - font_size = 22; - font_family = "JetBrainsMono Nerd Font 10"; - - position = "0, 30"; - halign = "center"; - valign = "center"; - } - - # Week - { - monitor = ""; - text = ''cmd[update:18000000] echo " "$(date +'%d %b')" "''; - color = "rgb(255, 255, 255, 1)"; - font_size = 18; - font_family = "JetBrainsMono Nerd Font 10"; - - position = "0, 6"; - halign = "center"; - valign = "center"; - } - - { - # Degrees - monitor = ""; - # get temperature in Brisbane - text = ''cmd[update:18000000] echo "Feels like $(curl -s 'wttr.in/bne?format=%t' | tr -d '+') "''; - color = "rgb(255, 255, 255, 1)"; - font_size = 18; - font_family = "Geist Mono 10"; - - position = "0, 40"; - halign = "center"; - valign = "bottom"; - } - ]; - - input-field = { - monitor = ""; - size = "300, 50"; - outline_thickness = 3; - - dots_size = 0.26; # Scale of input-field height, 0.2 - 0.8 - dots_spacing = 0.64; # Scale of dots' absolute size, 0.0 - 1.0 - dots_center = true; - dots_rouding = -1; - - rounding = 22; - outer_color = "rgb(255, 0, 0, 1)"; - inner_color = "rgb(0, 255, 0, 1)"; - font_color = "rgb(0, 0, 255, 1)"; - fade_on_empty = true; - placeholder_text = "!!Super Secret!!"; # Text rendered in the input box when it's empty. - - position = "0, 120"; - halign = "center"; - valign = "bottom"; - }; - }; - }; - - /* - programs.hyprlock = { - enable = true; - settings = { - general = { - grace = 5; - no_fade_in = false; - disable_loading_bar = false; - }; - - # BACKGROUND - background = { - monitor = ""; - path = "../../../downloads/1.png"; - blur_passes = 0; - contrast = 0.8916; - brightness = 0.7172; - vibrancy = 0.1696; - vibrancy_darkness = 0.0; - }; - - label = [ - { - # Day-Month-Date - monitor = ""; - text = ''cmd[update:1000] echo -e "$(date +"%A, %B %d")"''; - color = "rgb(255, 255, 255, 1)"; - font_size = 28; - font_family = "JetBrainsMono Nerd Font Bold"; - position = "0, 490"; - halign = "center"; - valign = "center"; - } - # Time - { - monitor = ""; - text = ''cmd[update:1000] echo "$(date +"%I:%M")"''; - color = "rgb(255, 255, 255, 1)"; - font_size = 160; - font_family = "steelfish outline regular"; - position = "0, 370"; - halign = "center"; - valign = "center"; - } - # USER - { - monitor = ""; - text = " $USER"; - color = "rgb(255, 255, 255, 1)"; - outline_thickness = 2; - dots_size = 0.2; # Scale of input-field height, 0.2 - 0.8 - dots_spacing = 0.2; # Scale of dots' absolute size, 0.0 - 1.0 - dots_center = true; - font_size = 18; - font_family = "JetBrainsMono Nerd Font Bold"; - position = "0, -180"; - halign = "center"; - valign = "center"; - } - ]; - - # INPUT FIELD - input-field = [ - { - monitor = ""; - size = "300, 60"; - outline_thickness = 2; - dots_size = 0.2; # Scale of input-field height, 0.2 - 0.8 - dots_spacing = 0.2; # Scale of dots' absolute size, 0.0 - 1.0 - dots_center = true; - outer_color = "rgba(255, 255, 255, 0)"; - inner_color = "rgba(255, 255, 255, 0.1)"; - font_color = "rgb(255, 255, 255, 1)"; - fade_on_empty = false; - font_family = "JetBrainsMono Nerd Font Bold"; - placeholder_text = "🔒 Enter Password"; - hide_input = false; - position = "0, -250"; - halign = "center"; - valign = "center"; - } - ]; - }; - }; - */ - programs = { # these are both required for home-manager to work home-manager.enable = true; - git = { + ags = { enable = true; - userName = "Emile Clark-Boman"; - userEmail = "eclarkboman@gmail.com"; - }; + configDir = ./ags; - # like `/bin/cat` but with syntax highlighting - # TODO: change the pager (maybe use Github:sachaos/viddy instead) - bat = { - enable = true; - config = { - pager = "less -FR"; - # let Stylix control the theme - #theme = "Dracula"; - }; - }; - - #nixvim = { - # enable = true; - # # TODO: allow clipboard to be configurable based on system clipboard - # colorschemes.dracula.enable = true; - # plugins = { - # lualine.enable = true; - # treesitter.enable = true; - # }; - - # opts = { - # number = true; - # tabstop = 4; - # softtabstop = 4; - # shiftwidth = 4; - # }; - - # clipboard.providers.wl-copy.enable = true; - #}; - - # read https://docs.helix-editor.com/editor.html - helix = { - enable = true; - settings = { - theme = "dracula"; - editor = { - line-number = "absolute"; - popup-border = "all"; - scroll-lines = 3; - color-modes = true; # colour the mode indicator depending on mode - shell = ["zsh" "-c"]; - - auto-format = true; - auto-completion = true; # enable popup for autocomplete - completion-timeout = 250; # time before completions display - preview-completion-insert = true; - completion-trigger-len = 2; # min word length to trigger completions - completion-replace = true; # completions replace entire word - - indent-heuristic = "tree-sitter"; # how indentation is computed - # TODO: make this configurable (enabled on myputer, disabled on lolcathost) - middle-click-paste = true; - insert-final-newline = true; # append newline to file on write - - gutters = [ - "diagnostics" - "spacer" - "line-numbers" - "spacer" - "diff" - ]; - - whitespace = { - render = { - space = "none"; # "all" - tab = "none"; #"all" - nbsp = "none"; - nnbsp = "none"; - newline = "none"; - }; - characters = { - space = "·"; - nbsp = "⍽"; - nnbsp = "␣"; - tab = "→"; - newline = "⤶"; - tabpad = "·"; # Tabs will look like "→···" (depending on tab width) - }; - }; - - indent-guides = { - render = true; - character = "▏"; # "|" - skip-levels = 1; - }; - - lsp = { - enable = true; - auto-signature-help = true; # hints for function parameters - display-inlay-hints = true; # inline hints - snippets = true; - }; - - cursor-shape = { - normal = "block"; - insert = "bar"; - select = "block"; - }; - - file-picker = { - hidden = true; # show hidden files - follow-symlinks = true; - deduplicate-links = true; - git-ignore = false; # dont read .gitignore files - ignore = true; # use .ignore for helix instead of .gitignore - }; - - statusline = { - left = [ - "mode" - "spacer" - "version-control" - "spinner" - ]; - center = [ - "file-name" - "read-only-indicator" - "file-modification-indicator" - ]; - right = [ - "position" - "total-line-numbers" - "file-encoding" - "file-line-ending" - "file-type" - ]; - separator = "|"; - mode.normal = "NORMAL"; - mode.insert = "INSERT"; - mode.select = "SELECT"; - }; - }; - }; - - languages.language = [ - { - name = "nix"; - indent = { - tab-width = 2; - unit = " "; - }; - block-comment-tokens = { - start = "/*"; - end = "*/"; - }; - auto-format = true; - formatter.command = "${pkgs.alejandra}/bin/alejandra"; - } - { - name = "python"; - indent = { - tab-width = 4; - unit = " "; - }; - auto-format = false; # my python is beautiful ^_^ - rulers = [80]; - } + extraPackages = with pkgs; [ + gtksourceview + webkitgtk + accountsservice ]; }; - nixcord = { - enable = true; - config = { - frameless = true; - plugins = { - # TODO: remove this plugin - hideAttachments.enable = true; - }; - }; - }; - - firefox = { - enable = true; - policies = { - #BlockAboutConfig = true; - DefaultDownloadDirectory = "\${home}/downloads"; - }; - }; - # I want to use fish as my login shell but it always # goes terrible cause it isn't POSIX compliant, so # instead Bash is my login and it will just exec fish @@ -501,19 +113,6 @@ # ''; #}; - fish = { - enable = true; - interactiveShellInit = '' - set -g fish_greeting "Welcome weary traveler to my shop" - ''; - plugins = [ - { - name = "grc"; - src = pkgs.fishPlugins.grc.src; - } - ]; - }; - /* spicetify = let @@ -530,314 +129,9 @@ colorScheme = "mocha"; }; */ - - # The terminal I use - # TODO: this is dependent on nvim being installed - # TODO: make this into a module with a configurable editor option - rio = { - enable = true; - # Rio Config Docs: https://raphamorim.io/rio/docs/config - settings = { - theme = "dracula"; - hide-mouse-cursor-when-typing = true; - - use-fork = true; # fork (dont spawn) Rio - - padding-x = 10; - padding-y = [15 10]; # top, left - - # lines = (accumulated scroll * multiplier / divider) - scroll = { - multiplier = 3.0; - divider = 1.0; - }; - - fonts = { - size = 15; - features = []; - - regular = { - family = "JetBrainsMono Nerd Font"; # FiraCode - style = "Normal"; - weight = 400; - }; - - bold = { - family = "JetBrainsMono Nerd Font"; - style = "Normal"; - weight = 800; - }; - - italic = { - family = "JetBrainsMono Nerd Font"; - style = "Italic"; - weight = 400; - }; - - bold-italic = { - family = "JetBrainsMono Nerd Font"; - style = "Italic"; - weight = 800; - }; - }; - - # Run when the `OpenConfigEditor` keybinding is triggered - editor = { - program = "hx"; # helix - args = []; - }; - - renderer = { - performance = "High"; - backend = "Automatic"; # Vulkan - }; - }; - }; - - wofi = { - enable = true; - settings = { - location = "center"; - allow_markup = true; - width = 250; - }; - # Force the style to stop Stylix being a bitch and overwriting it - style = lib.mkForce '' - @define-color rosewater #f2d5cf; - @define-color rosewater-rgb rgb(242, 213, 207); - @define-color flamingo #eebebe; - @define-color flamingo-rgb rgb(238, 190, 190); - @define-color pink #f4b8e4; - @define-color pink-rgb rgb(244, 184, 228); - @define-color mauve #ca9ee6; - @define-color mauve-rgb rgb(202, 158, 230); - @define-color red #e78284; - @define-color red-rgb rgb(231, 130, 132); - @define-color maroon #ea999c; - @define-color maroon-rgb rgb(234, 153, 156); - @define-color peach #ef9f76; - @define-color peach-rgb rgb(239, 159, 118); - @define-color yellow #e5c890; - @define-color yellow-rgb rgb(229, 200, 144); - @define-color green #a6d189; - @define-color green-rgb rgb(166, 209, 137); - @define-color teal #81c8be; - @define-color teal-rgb rgb(129, 200, 190); - @define-color sky #99d1db; - @define-color sky-rgb rgb(153, 209, 219); - @define-color sapphire #85c1dc; - @define-color sapphire-rgb rgb(133, 193, 220); - @define-color blue #8caaee; - @define-color blue-rgb rgb(140, 170, 238); - @define-color lavender #babbf1; - @define-color lavender-rgb rgb(186, 187, 241); - @define-color text #c6d0f5; - @define-color text-rgb rgb(198, 208, 245); - @define-color subtext1 #b5bfe2; - @define-color subtext1-rgb rgb(181, 191, 226); - @define-color subtext0 #a5adce; - @define-color subtext0-rgb rgb(165, 173, 206); - @define-color overlay2 #949cbb; - @define-color overlay2-rgb rgb(148, 156, 187); - @define-color overlay1 #838ba7; - @define-color overlay1-rgb rgb(131, 139, 167); - @define-color overlay0 #737994; - @define-color overlay0-rgb rgb(115, 121, 148); - @define-color surface2 #626880; - @define-color surface2-rgb rgb(98, 104, 128); - @define-color surface1 #51576d; - @define-color surface1-rgb rgb(81, 87, 109); - @define-color surface0 #414559; - @define-color surface0-rgb rgb(65, 69, 89); - @define-color base #303446; - @define-color base-rgb rgb(48, 52, 70); - @define-color mantle #292c3c; - @define-color mantle-rgb rgb(41, 44, 60); - @define-color crust #232634; - @define-color crust-rgb rgb(35, 38, 52); - - * { - font-family: 'FiraCode Nerd Font'; - font-size: 16px; - } - - /* Window */ - window { - margin: 0px; - padding: 10px; - border: 0.16em solid @teal; - border-radius: 0.5em; - background-color: @base; - animation: slideIn 0.25s ease-in-out both; - } - - /* Slide In */ - @keyframes slideIn { - 0% { - opacity: 0; - } - - 100% { - opacity: 1; - } - } - - /* Inner Box */ - #inner-box { - margin: 5px; - padding: 10px; - border: none; - background-color: @base; - /*animation: fadeIn 0.5s ease-in-out both;*/ - } - - /* Fade In */ - @keyframes fadeIn { - 0% { - opacity: 0; - } - - 100% { - opacity: 1; - } - } - - /* Outer Box */ - #outer-box { - margin: 5px; - padding: 10px; - border: none; - background-color: @base; - } - - /* Scroll */ - #scroll { - margin: 0px; - padding: 10px; - border: none; - background-color: @base; - } - - /* Input */ - #input { - margin: 5px 20px; - padding: 10px; - border: none; - border-radius: 0.25em; - color: @text; - background-color: @base; - animation: fadeIn 0.25s ease-in-out both; - } - - #input image { - border: none; - color: @red; - } - - #input * { - outline: 4px solid @red!important; - } - - /* Text */ - #text { - margin: 5px; - border: none; - color: @text; - animation: fadeIn 0.5s ease-in-out both; - } - - #entry { - background-color: @base; - } - - #entry arrow { - border: none; - color: @teal; - } - - /* Selected Entry */ - #entry:selected { - border: 0.10em solid @teal; - border-radius: 0.25em; - } - - #entry:selected #text { - color: @teal; - } - - #entry:drop(active) { - background-color: @lavender!important; - } - ''; - }; - - rofi = { - enable = true; - package = pkgs.rofi-wayland; - font = "JetBrains Mono Nerd Font 10"; - location = "center"; - terminal = "${pkgs.rio}/bin/rio"; - }; }; # ----- SERVICES ----- - services = { - # Change monitor positions - # TODO: find a way to make this modular (ie put something different for my laptop) - # my idea is to have a "monitors" module and use kanshi for wayland - kanshi = { - enable = true; - systemdTarget = "hyprland-session.target"; - # You can find your monitors in hyprland by using `hyprctl monitors all` - settings = [ - { - # 1920x1080@144 gaming monitor - output.criteria = "HDMI-A-1"; - output.mode = "1920x1080@119.98Hz"; - output.scale = 1.0; - output.adaptiveSync = false; # Variable Refresh Rate (this can be changed for gaming) - } - { - # 4k side monitor - output.criteria = "DP-2"; - output.mode = "3840x2160@60.00Hz"; - output.scale = 2.0; - } - { - # laptop builtin screen - output.criteria = "eDP-1"; - output.mode = "1920x1080@60.02Hz"; - output.scale = 1.0; - } - - { - # This is my dual-monitor desktop setup - profile.name = "myputer"; - profile.outputs = [ - { - criteria = "DP-2"; - position = "0,0"; - } - { - criteria = "HDMI-A-1"; - position = "3840,0"; - } - ]; - } - { - # This is my laptop (lolcathost) :) - profile.name = "lolcathost"; - profile.outputs = [ - { - criteria = "eDP-1"; - position = "0,0"; - } - ]; - } - ]; - }; - }; - # Nicely reload system units when changing configs systemd.user.startServices = "sd-switch"; diff --git a/homes/me/wofi.nix b/homes/me/wofi.nix deleted file mode 100755 index 8613519..0000000 --- a/homes/me/wofi.nix +++ /dev/null @@ -1,192 +0,0 @@ -{ - lib, - config, - pkgs, - ... -}: - -{ - options = { - #enable = lib.mkEnableOption "Enable wofi and my configuration"; - }; - - config = { - programs = { - wofi = { - enable = true; - settings = { - location = "center"; - allow_markup = true; - width = 250; - }; - style = '' - @define-color rosewater #f2d5cf; - @define-color rosewater-rgb rgb(242, 213, 207); - @define-color flamingo #eebebe; - @define-color flamingo-rgb rgb(238, 190, 190); - @define-color pink #f4b8e4; - @define-color pink-rgb rgb(244, 184, 228); - @define-color mauve #ca9ee6; - @define-color mauve-rgb rgb(202, 158, 230); - @define-color red #e78284; - @define-color red-rgb rgb(231, 130, 132); - @define-color maroon #ea999c; - @define-color maroon-rgb rgb(234, 153, 156); - @define-color peach #ef9f76; - @define-color peach-rgb rgb(239, 159, 118); - @define-color yellow #e5c890; - @define-color yellow-rgb rgb(229, 200, 144); - @define-color green #a6d189; - @define-color green-rgb rgb(166, 209, 137); - @define-color teal #81c8be; - @define-color teal-rgb rgb(129, 200, 190); - @define-color sky #99d1db; - @define-color sky-rgb rgb(153, 209, 219); - @define-color sapphire #85c1dc; - @define-color sapphire-rgb rgb(133, 193, 220); - @define-color blue #8caaee; - @define-color blue-rgb rgb(140, 170, 238); - @define-color lavender #babbf1; - @define-color lavender-rgb rgb(186, 187, 241); - @define-color text #c6d0f5; - @define-color text-rgb rgb(198, 208, 245); - @define-color subtext1 #b5bfe2; - @define-color subtext1-rgb rgb(181, 191, 226); - @define-color subtext0 #a5adce; - @define-color subtext0-rgb rgb(165, 173, 206); - @define-color overlay2 #949cbb; - @define-color overlay2-rgb rgb(148, 156, 187); - @define-color overlay1 #838ba7; - @define-color overlay1-rgb rgb(131, 139, 167); - @define-color overlay0 #737994; - @define-color overlay0-rgb rgb(115, 121, 148); - @define-color surface2 #626880; - @define-color surface2-rgb rgb(98, 104, 128); - @define-color surface1 #51576d; - @define-color surface1-rgb rgb(81, 87, 109); - @define-color surface0 #414559; - @define-color surface0-rgb rgb(65, 69, 89); - @define-color base #303446; - @define-color base-rgb rgb(48, 52, 70); - @define-color mantle #292c3c; - @define-color mantle-rgb rgb(41, 44, 60); - @define-color crust #232634; - @define-color crust-rgb rgb(35, 38, 52); - - * { - font-family: 'FiraCode Nerd Font', monospace; - font-size: 16px; - } - - /* Window */ - window { - margin: 0px; - padding: 10px; - border: 0.16em solid @teal; - border-radius: 0.5em; - background-color: @base; - animation: slideIn 0.25s ease-in-out both; - } - - /* Slide In */ - @keyframes slideIn { - 0% { - opacity: 0; - } - - 100% { - opacity: 1; - } - } - - /* Inner Box */ - #inner-box { - margin: 5px; - padding: 10px; - border: none; - background-color: @base; - /*animation: fadeIn 0.5s ease-in-out both;*/ - } - - /* Fade In */ - @keyframes fadeIn { - 0% { - opacity: 0; - } - - 100% { - opacity: 1; - } - } - - /* Outer Box */ - #outer-box { - margin: 5px; - padding: 10px; - border: none; - background-color: @base; - } - - /* Scroll */ - #scroll { - margin: 0px; - padding: 10px; - border: none; - background-color: @base; - } - - /* Input */ - #input { - margin: 5px 20px; - padding: 10px; - border: none; - border-radius: 0.25em; - color: @text; - background-color: @base; - animation: fadeIn 0.25s ease-in-out both; - } - - #input image { - border: none; - color: @red; - } - - #input * { - outline: 4px solid @red!important; - } - - /* Text */ - #text { - margin: 5px; - border: none; - color: @text; - animation: fadeIn 0.5s ease-in-out both; - } - - #entry { - background-color: @base; - } - - #entry arrow { - border: none; - color: @teal; - } - - /* Selected Entry */ - #entry:selected { - border: 0.10em solid @teal; - border-radius: 0.25em; - } - - #entry:selected #text { - color: @teal; - } - - #entry:drop(active) { - background-color: @lavender!important; - } - '' - }; - }; - }; -} diff --git a/homes/modules/bat.nix b/homes/modules/bat.nix new file mode 100644 index 0000000..f29f49b --- /dev/null +++ b/homes/modules/bat.nix @@ -0,0 +1,15 @@ +{ + config, + pkgs, + ... +}: { + # like `/bin/cat` but with syntax highlighting + # TODO: change the pager (maybe use Github:sachaos/viddy instead) + programs.bat = { + enable = true; + config = { + pager = "less -FR"; + theme = "Dracula"; + }; + }; +} diff --git a/homes/modules/editor/helix.nix b/homes/modules/editor/helix.nix new file mode 100644 index 0000000..4a66841 --- /dev/null +++ b/homes/modules/editor/helix.nix @@ -0,0 +1,135 @@ +{ + config, + pkgs, + ... +}: { + # read https://docs.helix-editor.com/editor.html + programs.helix = { + enable = true; + settings = { + theme = "dracula"; + editor = { + line-number = "absolute"; + popup-border = "all"; + scroll-lines = 3; + color-modes = true; # colour the mode indicator depending on mode + shell = ["zsh" "-c"]; + + auto-format = true; + auto-completion = true; # enable popup for autocomplete + completion-timeout = 250; # time before completions display + preview-completion-insert = true; + completion-trigger-len = 2; # min word length to trigger completions + completion-replace = true; # completions replace entire word + + indent-heuristic = "tree-sitter"; # how indentation is computed + # TODO: make this configurable (enabled on myputer, disabled on lolcathost) + middle-click-paste = true; + insert-final-newline = true; # append newline to file on write + + gutters = [ + "diagnostics" + "spacer" + "line-numbers" + "spacer" + "diff" + ]; + + whitespace = { + render = { + space = "none"; # "all" + tab = "none"; #"all" + nbsp = "none"; + nnbsp = "none"; + newline = "none"; + }; + characters = { + space = "·"; + nbsp = "⍽"; + nnbsp = "␣"; + tab = "→"; + newline = "⤶"; + tabpad = "·"; # Tabs will look like "→···" (depending on tab width) + }; + }; + + indent-guides = { + render = true; + character = "▏"; # "|" + skip-levels = 1; + }; + + lsp = { + enable = true; + auto-signature-help = true; # hints for function parameters + display-inlay-hints = true; # inline hints + snippets = true; + }; + + cursor-shape = { + normal = "block"; + insert = "bar"; + select = "block"; + }; + + file-picker = { + hidden = true; # show hidden files + follow-symlinks = true; + deduplicate-links = true; + git-ignore = false; # dont read .gitignore files + ignore = true; # use .ignore for helix instead of .gitignore + }; + + statusline = { + left = [ + "mode" + "spacer" + "version-control" + "spinner" + ]; + center = [ + "file-name" + "read-only-indicator" + "file-modification-indicator" + ]; + right = [ + "position" + "total-line-numbers" + "file-encoding" + "file-line-ending" + "file-type" + ]; + separator = "|"; + mode.normal = "NORMAL"; + mode.insert = "INSERT"; + mode.select = "SELECT"; + }; + }; + }; + + languages.language = [ + { + name = "nix"; + indent = { + tab-width = 2; + unit = " "; + }; + block-comment-tokens = { + start = "/*"; + end = "*/"; + }; + auto-format = true; + formatter.command = "${pkgs.alejandra}/bin/alejandra"; + } + { + name = "python"; + indent = { + tab-width = 4; + unit = " "; + }; + auto-format = false; # my python is beautiful ^_^ + rulers = [80]; + } + ]; + }; +} diff --git a/homes/modules/editor/nixvim.nix b/homes/modules/editor/nixvim.nix new file mode 100644 index 0000000..9197417 --- /dev/null +++ b/homes/modules/editor/nixvim.nix @@ -0,0 +1,24 @@ +{ + config, + pkgs, + ... +}: { + programs.nixvim = { + enable = true; + # TODO: allow clipboard to be configurable based on system clipboard + colorschemes.dracula.enable = true; + plugins = { + lualine.enable = true; + treesitter.enable = true; + }; + + opts = { + number = true; + tabstop = 4; + softtabstop = 4; + shiftwidth = 4; + }; + + clipboard.providers.wl-copy.enable = true; + }; +} diff --git a/homes/modules/firefox.nix b/homes/modules/firefox.nix new file mode 100644 index 0000000..1ad1564 --- /dev/null +++ b/homes/modules/firefox.nix @@ -0,0 +1,13 @@ +{ + config, + pkgs, + ... +}: { + programs.firefox = { + enable = true; + policies = { + #BlockAboutConfig = true; + DefaultDownloadDirectory = "\${home}/downloads"; + }; + }; +} diff --git a/homes/modules/fish.nix b/homes/modules/fish.nix new file mode 100644 index 0000000..3cb9bc7 --- /dev/null +++ b/homes/modules/fish.nix @@ -0,0 +1,18 @@ +{ + config, + pkgs, + ... +}: { + programs.fish = { + enable = true; + interactiveShellInit = '' + set -g fish_greeting "Welcome weary traveler to my shop" + ''; + plugins = [ + { + name = "grc"; + src = pkgs.fishPlugins.grc.src; + } + ]; + }; +} diff --git a/homes/modules/git.nix b/homes/modules/git.nix new file mode 100644 index 0000000..c98ab4e --- /dev/null +++ b/homes/modules/git.nix @@ -0,0 +1,11 @@ +{ + config, + pkgs, + ... +}: { + programs.git = { + enable = true; + userName = "Emile Clark-Boman"; + userEmail = "eclarkboman@gmail.com"; + }; +} diff --git a/homes/modules/hypr/hypridle.nix b/homes/modules/hypr/hypridle.nix new file mode 100644 index 0000000..e31be07 --- /dev/null +++ b/homes/modules/hypr/hypridle.nix @@ -0,0 +1,29 @@ +{ + config, + pkgs, + ... +}: { + services.hypridle = { + enable = true; + settings = { + general = { + ignore_dbus_inhibit = false; + lock_cmd = "pidof hyprlock || ${pkgs.hyprlock}/bin/hyprlock"; + before_sleep_cmd = "loginctl lock-session"; + after_sleep_cmd = "hyprctl dispatch dpms on"; + }; + + listener = [ + { + timeout = 600; + on-timeout = "pidof hyprlock || ${pkgs.hyprlock}/bin/hyprlock"; + } + + { + timeout = 660; + on-timeout = "systemctl suspend"; + } + ]; + }; + }; +} diff --git a/homes/modules/hypr/hyprland.nix b/homes/modules/hypr/hyprland.nix new file mode 100644 index 0000000..e69de29 diff --git a/homes/modules/hypr/hyprlock.nix b/homes/modules/hypr/hyprlock.nix new file mode 100644 index 0000000..50245bc --- /dev/null +++ b/homes/modules/hypr/hyprlock.nix @@ -0,0 +1,118 @@ +{ + config, + pkgs, + ... +}: { + programs.hyprlock = { + enable = true; + settings = { + background = { + monitor = ""; + path = "$HOME/downloads/wallpaper/1380597.png"; # only png supported for now + # color = $color1 + + # all these options are taken from hyprland, see https://wiki.hyprland.org/Configuring/Variables/#blur for explanations + blur_size = 4; + blur_passes = 3; # 0 disables blurring + noise = 0.0117; + contrast = 1.3000; # Vibrant!!! + brightness = 0.8000; + vibrancy = 0.2100; + vibrancy_darkness = 0.0; + }; + label = [ + { + # Hours + monitor = ""; + text = ''cmd[update:1000] echo " $(date +"%H") "''; + color = "rgb(255, 255, 255, 1)"; + font_size = 112; + font_family = "Geist Mono 10"; + shadow_passes = 3; + shadow_size = 4; + + position = "0, 240"; + halign = "center"; + valign = "center"; + } + + { + # Minutes + monitor = ""; + text = ''cmd[update:1000] echo " $(date +"%M") "''; + color = "rgb(255, 255, 255, 1)"; + font_size = 112; + font_family = "Geist Mono 10"; + shadow_passes = 3; + shadow_size = 4; + + position = "0, 120"; + halign = "center"; + valign = "center"; + } + + # Today + { + monitor = ""; + text = ''cmd[update:18000000] echo " "$(date +'%A')" "''; + color = "rgb(255, 255, 255, 1)"; + font_size = 22; + font_family = "JetBrainsMono Nerd Font 10"; + + position = "0, 30"; + halign = "center"; + valign = "center"; + } + + # Week + { + monitor = ""; + text = ''cmd[update:18000000] echo " "$(date +'%d %b')" "''; + color = "rgb(255, 255, 255, 1)"; + font_size = 18; + font_family = "JetBrainsMono Nerd Font 10"; + + position = "0, 6"; + halign = "center"; + valign = "center"; + } + + { + # Degrees + monitor = ""; + # get temperature in Brisbane + text = ''cmd[update:18000000] echo "Feels like $(curl -s 'wttr.in/bne?format=%t' | tr -d '+') "''; + color = "rgb(255, 255, 255, 1)"; + font_size = 18; + font_family = "Geist Mono 10"; + + position = "0, 40"; + halign = "center"; + valign = "bottom"; + } + ]; + + input-field = { + monitor = ""; + size = "300, 50"; + outline_thickness = 3; + + dots_size = 0.26; # Scale of input-field height, 0.2 - 0.8 + dots_spacing = 0.64; # Scale of dots' absolute size, 0.0 - 1.0 + dots_center = true; + dots_rouding = -1; + + rounding = 22; + outer_color = "rgb(255, 0, 0, 1)"; + inner_color = "rgb(0, 255, 0, 1)"; + font_color = "rgb(0, 0, 255, 1)"; + fade_on_empty = true; + placeholder_text = "!!Super Secret!!"; # Text rendered in the input box when it's empty. + + position = "0, 120"; + halign = "center"; + valign = "bottom"; + }; + }; + }; +} diff --git a/homes/modules/kanshi.nix b/homes/modules/kanshi.nix new file mode 100644 index 0000000..906f6a8 --- /dev/null +++ b/homes/modules/kanshi.nix @@ -0,0 +1,60 @@ +{ + config, + pkgs, + ... +}: { + # Change monitor positions + # TODO: find a way to make this modular (ie put something different for my laptop) + # my idea is to have a "monitors" module and use kanshi for wayland + services.kanshi = { + enable = true; + systemdTarget = "hyprland-session.target"; + # You can find your monitors in hyprland by using `hyprctl monitors all` + settings = [ + { + # 1920x1080@144 gaming monitor + output.criteria = "HDMI-A-1"; + output.mode = "1920x1080@119.98Hz"; + output.scale = 1.0; + output.adaptiveSync = false; # Variable Refresh Rate (this can be changed for gaming) + } + { + # 4k side monitor + output.criteria = "DP-2"; + output.mode = "3840x2160@60.00Hz"; + output.scale = 2.0; + } + { + # laptop builtin screen + output.criteria = "eDP-1"; + output.mode = "1920x1080@60.02Hz"; + output.scale = 1.0; + } + + { + # This is my dual-monitor desktop setup + profile.name = "myputer"; + profile.outputs = [ + { + criteria = "DP-2"; + position = "0,0"; + } + { + criteria = "HDMI-A-1"; + position = "3840,0"; + } + ]; + } + { + # This is my laptop (lolcathost) :) + profile.name = "lolcathost"; + profile.outputs = [ + { + criteria = "eDP-1"; + position = "0,0"; + } + ]; + } + ]; + }; +} diff --git a/homes/modules/nixcord.nix b/homes/modules/nixcord.nix new file mode 100644 index 0000000..a006c0e --- /dev/null +++ b/homes/modules/nixcord.nix @@ -0,0 +1,16 @@ +{ + config, + pkgs, + ... +}: { + programs.nixcord = { + enable = true; + config = { + frameless = true; + plugins = { + # TODO: remove this plugin + hideAttachments.enable = true; + }; + }; + }; +} diff --git a/homes/modules/rio.nix b/homes/modules/rio.nix new file mode 100644 index 0000000..84ea3a2 --- /dev/null +++ b/homes/modules/rio.nix @@ -0,0 +1,68 @@ +{ + config, + pkgs, + ... +}: { + # The terminal I use + # TODO: this is dependent on nvim being installed + # TODO: make this into a module with a configurable editor option + programs.rio = { + enable = true; + # Rio Config Docs: https://raphamorim.io/rio/docs/config + settings = { + theme = "dracula"; + hide-mouse-cursor-when-typing = true; + + use-fork = true; # fork (dont spawn) Rio + + padding-x = 10; + padding-y = [15 10]; # top, left + + # lines = (accumulated scroll * multiplier / divider) + scroll = { + multiplier = 3.0; + divider = 1.0; + }; + + fonts = { + size = 15; + features = []; + + regular = { + family = "JetBrainsMono Nerd Font"; # FiraCode + style = "Normal"; + weight = 400; + }; + + bold = { + family = "JetBrainsMono Nerd Font"; + style = "Normal"; + weight = 800; + }; + + italic = { + family = "JetBrainsMono Nerd Font"; + style = "Italic"; + weight = 400; + }; + + bold-italic = { + family = "JetBrainsMono Nerd Font"; + style = "Italic"; + weight = 800; + }; + }; + + # Run when the `OpenConfigEditor` keybinding is triggered + editor = { + program = "hx"; # helix + args = []; + }; + + renderer = { + performance = "High"; + backend = "Automatic"; # Vulkan + }; + }; + }; +} diff --git a/homes/modules/rofi.nix b/homes/modules/rofi.nix new file mode 100644 index 0000000..6d05543 --- /dev/null +++ b/homes/modules/rofi.nix @@ -0,0 +1,13 @@ +{ + config, + pkgs, + ... +}: { + programs.rofi = { + enable = true; + package = pkgs.rofi-wayland; + font = "JetBrains Mono Nerd Font 10"; + location = "center"; + terminal = "${pkgs.rio}/bin/rio"; + }; +} diff --git a/homes/modules/wofi.nix b/homes/modules/wofi.nix new file mode 100755 index 0000000..81a25d3 --- /dev/null +++ b/homes/modules/wofi.nix @@ -0,0 +1,183 @@ +{ + lib, + config, + pkgs, + ... +}: { + programs.wofi = { + enable = true; + settings = { + location = "center"; + allow_markup = true; + width = 250; + }; + # Force the style to stop Stylix being a bitch and overwriting it + style = lib.mkForce '' + @define-color rosewater #f2d5cf; + @define-color rosewater-rgb rgb(242, 213, 207); + @define-color flamingo #eebebe; + @define-color flamingo-rgb rgb(238, 190, 190); + @define-color pink #f4b8e4; + @define-color pink-rgb rgb(244, 184, 228); + @define-color mauve #ca9ee6; + @define-color mauve-rgb rgb(202, 158, 230); + @define-color red #e78284; + @define-color red-rgb rgb(231, 130, 132); + @define-color maroon #ea999c; + @define-color maroon-rgb rgb(234, 153, 156); + @define-color peach #ef9f76; + @define-color peach-rgb rgb(239, 159, 118); + @define-color yellow #e5c890; + @define-color yellow-rgb rgb(229, 200, 144); + @define-color green #a6d189; + @define-color green-rgb rgb(166, 209, 137); + @define-color teal #81c8be; + @define-color teal-rgb rgb(129, 200, 190); + @define-color sky #99d1db; + @define-color sky-rgb rgb(153, 209, 219); + @define-color sapphire #85c1dc; + @define-color sapphire-rgb rgb(133, 193, 220); + @define-color blue #8caaee; + @define-color blue-rgb rgb(140, 170, 238); + @define-color lavender #babbf1; + @define-color lavender-rgb rgb(186, 187, 241); + @define-color text #c6d0f5; + @define-color text-rgb rgb(198, 208, 245); + @define-color subtext1 #b5bfe2; + @define-color subtext1-rgb rgb(181, 191, 226); + @define-color subtext0 #a5adce; + @define-color subtext0-rgb rgb(165, 173, 206); + @define-color overlay2 #949cbb; + @define-color overlay2-rgb rgb(148, 156, 187); + @define-color overlay1 #838ba7; + @define-color overlay1-rgb rgb(131, 139, 167); + @define-color overlay0 #737994; + @define-color overlay0-rgb rgb(115, 121, 148); + @define-color surface2 #626880; + @define-color surface2-rgb rgb(98, 104, 128); + @define-color surface1 #51576d; + @define-color surface1-rgb rgb(81, 87, 109); + @define-color surface0 #414559; + @define-color surface0-rgb rgb(65, 69, 89); + @define-color base #303446; + @define-color base-rgb rgb(48, 52, 70); + @define-color mantle #292c3c; + @define-color mantle-rgb rgb(41, 44, 60); + @define-color crust #232634; + @define-color crust-rgb rgb(35, 38, 52); + + * { + font-family: 'FiraCode Nerd Font'; + font-size: 16px; + } + + /* Window */ + window { + margin: 0px; + padding: 10px; + border: 0.16em solid @teal; + border-radius: 0.5em; + background-color: @base; + animation: slideIn 0.25s ease-in-out both; + } + + /* Slide In */ + @keyframes slideIn { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + /* Inner Box */ + #inner-box { + margin: 5px; + padding: 10px; + border: none; + background-color: @base; + /*animation: fadeIn 0.5s ease-in-out both;*/ + } + + /* Fade In */ + @keyframes fadeIn { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + /* Outer Box */ + #outer-box { + margin: 5px; + padding: 10px; + border: none; + background-color: @base; + } + + /* Scroll */ + #scroll { + margin: 0px; + padding: 10px; + border: none; + background-color: @base; + } + + /* Input */ + #input { + margin: 5px 20px; + padding: 10px; + border: none; + border-radius: 0.25em; + color: @text; + background-color: @base; + animation: fadeIn 0.25s ease-in-out both; + } + + #input image { + border: none; + color: @red; + } + + #input * { + outline: 4px solid @red!important; + } + + /* Text */ + #text { + margin: 5px; + border: none; + color: @text; + animation: fadeIn 0.5s ease-in-out both; + } + + #entry { + background-color: @base; + } + + #entry arrow { + border: none; + color: @teal; + } + + /* Selected Entry */ + #entry:selected { + border: 0.10em solid @teal; + border-radius: 0.25em; + } + + #entry:selected #text { + color: @teal; + } + + #entry:drop(active) { + background-color: @lavender!important; + } + ''; + }; +} diff --git a/hosts/lolcathost/default.nix b/hosts/lolcathost/default.nix index d81e477..806a6a6 100755 --- a/hosts/lolcathost/default.nix +++ b/hosts/lolcathost/default.nix @@ -1,8 +1,13 @@ { pkgs, inputs, + lib, ... }: let + #home-manager = builtins.fetchTarball { + # url = "https://github.com/nix-community/home-manager/archive/release-24.05.tar.gz"; + # sha256 = "00wp0s9b5nm5rsbwpc1wzfrkyxxmqjwsc1kcibjdbfkh69arcpsn"; + #}; home-manager = builtins.fetchTarball { url = "https://github.com/nix-community/home-manager/archive/master.tar.gz"; sha256 = "19w63qccz78v0spx03911z98w1bvlxvd07hb0ma14a4vdzi4ninj"; @@ -38,6 +43,13 @@ in { #efiInstallAsRemovable = true; # in case canTouchEfiVariables doesn't work on this system device = "nodev"; }; + # GitHub: vinceliuice/grub2-themes + grub2-theme = { + enable = true; + theme = "whitesur"; # sylish, vimix, or whitesur + footer = true; + customResolution = "1920x1080"; # Optional: Set a custom resolution + }; }; # Set your time zone. @@ -67,10 +79,11 @@ in { services = { # Set display manager (login screen) displayManager = { + # sddm relies on pkgs.libsForQt5.qt5.qtgraphicaleffects sddm = { enable = true; wayland.enable = true; # enable experimental sddm support for wayland - theme = "${import ./sddm-theme-corners.nix {inherit pkgs;}}"; + theme = "corners"; }; defaultSession = "hyprland"; }; @@ -114,6 +127,11 @@ in { firefox nitch starfetch + + # flatpak requires gnome-software + # for graphical applications + flatpak + gnome.gnome-software ]; }; @@ -126,7 +144,7 @@ in { ]; }; - # # programming/development account + # # This is the user account for servers # dev = { # isNormalUser = true; # extraGroups = ["wheel"]; @@ -149,6 +167,7 @@ in { users.me = import ../../homes/me; sharedModules = [ inputs.nixcord.homeManagerModules.nixcord + inputs.ags.homeManagerModules.default ]; }; @@ -163,6 +182,10 @@ in { wl-clipboard # clipboard for wayland kcalc # TEMP: (FOR TESTING) + (callPackage ./sddm-theme-corners.nix {}).sddm-theme-corners + # dependencies for my sddm theme: + pkgs.libsForQt5.qt5.qtgraphicaleffects + python311 # I use 3.11 since it's in a pretty stable state now poetry # python dependency management and packaging @@ -180,6 +203,7 @@ in { git brightnessctl acpi + vim # Unix Commands wget diff --git a/hosts/lolcathost/sddm-theme-corners.nix b/hosts/lolcathost/sddm-theme-corners.nix index b96abe6..ccc93f0 100755 --- a/hosts/lolcathost/sddm-theme-corners.nix +++ b/hosts/lolcathost/sddm-theme-corners.nix @@ -1,6 +1,6 @@ {pkgs}: { sddm-theme-corners = pkgs.stdenv.mkDerivation rec { - pname = "sddm-theme-corners"; + name = "sddm-theme-corners"; #version = "1.0"; #dontBuild = true; installPhase = '' diff --git a/out.data b/out.data new file mode 100644 index 0000000..fabfd34 --- /dev/null +++ b/out.data @@ -0,0 +1,724 @@ +warning: Git tree '/home/me/nixdots' is dirty +building the system configuration... +warning: Git tree '/home/me/nixdots' is dirty +error: + … while calling anonymous lambda + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/attrsets.nix:1570:24: + 1569| let f = attrPath: + 1570| zipAttrsWith (n: values: + | ^ + 1571| let here = attrPath ++ [n]; in + + … while calling the 'head' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/attrsets.nix:1574:11: + 1573| || pred here (elemAt values 1) (head values) then + 1574| head values + | ^ + 1575| else + + … while calling anonymous lambda + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/attrsets.nix:1204:18: + 1203| mapAttrs + 1204| (name: value: + | ^ + 1205| if isAttrs value && cond value + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/attrsets.nix:1207:18: + 1206| then recurse (path ++ [ name ]) value + 1207| else f (path ++ [ name ]) value); + | ^ + 1208| in + + … while calling anonymous lambda + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:254:72: + 253| # For definitions that have an associated option + 254| declaredConfig = mapAttrsRecursiveCond (v: ! isOption v) (_: v: v.value) options; + | ^ + 255| + + … while evaluating the attribute 'value' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:816:9: + 815| in warnDeprecation opt // + 816| { value = addErrorContext "while evaluating the option `${showOption loc}':" value; + | ^ + 817| inherit (res.defsFinal') highestPrio; + + … while evaluating the option `system.build.toplevel': + + … while evaluating the attribute 'mergedValue' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:851:5: + 850| # Type-check the remaining definitions, and merge them. Or throw if no definitions. + 851| mergedValue = + | ^ + 852| if isDefined then + + … while evaluating a branch condition + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:852:7: + 851| mergedValue = + 852| if isDefined then + | ^ + 853| if all (def: type.check def.value) defsFinal then type.merge loc defsFinal + + … while evaluating the attribute 'values' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:845:9: + 844| in { + 845| values = defs'''; + | ^ + 846| inherit (defs'') highestPrio; + + … while evaluating a branch condition + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:841:11: + 840| # Avoid sorting if we don't have to. + 841| if any (def: def.value._type or "" == "order") defs''.values + | ^ + 842| then sortProperties defs''.values + + … while calling the 'any' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:841:14: + 840| # Avoid sorting if we don't have to. + 841| if any (def: def.value._type or "" == "order") defs''.values + | ^ + 842| then sortProperties defs''.values + + … while evaluating the attribute 'values' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:944:7: + 943| in { + 944| values = concatMap (def: if getPrio def == highestPrio then [(strip def)] else []) defs; + | ^ + 945| inherit highestPrio; + + … while calling the 'concatMap' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:944:16: + 943| in { + 944| values = concatMap (def: if getPrio def == highestPrio then [(strip def)] else []) defs; + | ^ + 945| inherit highestPrio; + + … while calling the 'concatMap' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:831:17: + 830| # Process mkMerge and mkIf properties. + 831| defs' = concatMap (m: + | ^ + 832| map (value: { inherit (m) file; inherit value; }) (addErrorContext "while evaluating definitions from `${m.file}':" (dischargeProperties m.value)) + + … while calling anonymous lambda + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:831:28: + 830| # Process mkMerge and mkIf properties. + 831| defs' = concatMap (m: + | ^ + 832| map (value: { inherit (m) file; inherit value; }) (addErrorContext "while evaluating definitions from `${m.file}':" (dischargeProperties m.value)) + + … while calling the 'map' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:832:11: + 831| defs' = concatMap (m: + 832| map (value: { inherit (m) file; inherit value; }) (addErrorContext "while evaluating definitions from `${m.file}':" (dischargeProperties m.value)) + | ^ + 833| ) defs; + + … while evaluating definitions from `/nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/nixos/modules/system/activation/top-level.nix': + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:832:128: + 831| defs' = concatMap (m: + 832| map (value: { inherit (m) file; inherit value; }) (addErrorContext "while evaluating definitions from `${m.file}':" (dischargeProperties m.value)) + | ^ + 833| ) defs; + + … while calling 'dischargeProperties' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:903:25: + 902| */ + 903| dischargeProperties = def: + | ^ + 904| if def._type or "" == "merge" then + + … while evaluating a branch condition + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:904:5: + 903| dischargeProperties = def: + 904| if def._type or "" == "merge" then + | ^ + 905| concatMap dischargeProperties def.contents + + … while evaluating the attribute 'value' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:614:53: + 613| (n: value: + 614| [{ inherit (module) file; inherit value; }] + | ^ + 615| ) + + … while evaluating a branch condition + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/nixos/modules/system/activation/top-level.nix:72:26: + 71| + 72| baseSystemAssertWarn = if failedAssertions != [] + | ^ + 73| then throw "\nFailed assertions:\n${concatStringsSep "\n" (map (x: "- ${x}") failedAssertions)}" + + … while calling the 'map' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/nixos/modules/system/activation/top-level.nix:70:22: + 69| + 70| failedAssertions = map (x: x.message) (filter (x: !x.assertion) config.assertions); + | ^ + 71| + + … while calling the 'filter' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/nixos/modules/system/activation/top-level.nix:70:42: + 69| + 70| failedAssertions = map (x: x.message) (filter (x: !x.assertion) config.assertions); + | ^ + 71| + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/nixos/modules/system/activation/top-level.nix:70:67: + 69| + 70| failedAssertions = map (x: x.message) (filter (x: !x.assertion) config.assertions); + | ^ + 71| + + … while calling anonymous lambda + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/attrsets.nix:1204:18: + 1203| mapAttrs + 1204| (name: value: + | ^ + 1205| if isAttrs value && cond value + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/attrsets.nix:1207:18: + 1206| then recurse (path ++ [ name ]) value + 1207| else f (path ++ [ name ]) value); + | ^ + 1208| in + + … while calling anonymous lambda + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:254:72: + 253| # For definitions that have an associated option + 254| declaredConfig = mapAttrsRecursiveCond (v: ! isOption v) (_: v: v.value) options; + | ^ + 255| + + … while evaluating the attribute 'value' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:816:9: + 815| in warnDeprecation opt // + 816| { value = addErrorContext "while evaluating the option `${showOption loc}':" value; + | ^ + 817| inherit (res.defsFinal') highestPrio; + + … while evaluating the option `assertions': + + (10 duplicate frames omitted) + + … while evaluating definitions from `/nix/store/78sgjxjd6p9wns5mriffngcrvxp9sfaa-source/nixos/common.nix': + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:832:128: + 831| defs' = concatMap (m: + 832| map (value: { inherit (m) file; inherit value; }) (addErrorContext "while evaluating definitions from `${m.file}':" (dischargeProperties m.value)) + | ^ + 833| ) defs; + + … while calling 'dischargeProperties' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:903:25: + 902| */ + 903| dischargeProperties = def: + | ^ + 904| if def._type or "" == "merge" then + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:909:11: + 908| if def.condition then + 909| dischargeProperties def.content + | ^ + 910| else + + … while calling 'dischargeProperties' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:903:25: + 902| */ + 903| dischargeProperties = def: + | ^ + 904| if def._type or "" == "merge" then + + … while evaluating a branch condition + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:904:5: + 903| dischargeProperties = def: + 904| if def._type or "" == "merge" then + | ^ + 905| concatMap dischargeProperties def.contents + + … while evaluating the attribute 'content' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:1008:25: + 1007| { _type = "if"; + 1008| inherit condition content; + | ^ + 1009| }; + + … from call site + at /nix/store/78sgjxjd6p9wns5mriffngcrvxp9sfaa-source/nixos/common.nix:110:20: + 109| + 110| assertions = flatten (flip mapAttrsToList cfg.users (user: config: + | ^ + 111| flip map config.assertions (assertion: { + + … while calling 'flatten' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/lists.nix:431:13: + 430| */ + 431| flatten = x: + | ^ + 432| if isList x + + … while calling the 'concatMap' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/lists.nix:433:10: + 432| if isList x + 433| then concatMap (y: flatten y) x + | ^ + 434| else [x]; + + … while calling anonymous lambda + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/lists.nix:433:21: + 432| if isList x + 433| then concatMap (y: flatten y) x + | ^ + 434| else [x]; + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/lists.nix:433:24: + 432| if isList x + 433| then concatMap (y: flatten y) x + | ^ + 434| else [x]; + + … while calling 'flatten' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/lists.nix:431:13: + 430| */ + 431| flatten = x: + | ^ + 432| if isList x + + … while evaluating a branch condition + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/lists.nix:432:5: + 431| flatten = x: + 432| if isList x + | ^ + 433| then concatMap (y: flatten y) x + + … while calling the 'isList' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/lists.nix:432:8: + 431| flatten = x: + 432| if isList x + | ^ + 433| then concatMap (y: flatten y) x + + … while calling anonymous lambda + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/attrsets.nix:1095:10: + 1094| attrs: + 1095| map (name: f name attrs.${name}) (attrNames attrs); + | ^ + 1096| + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/attrsets.nix:1095:16: + 1094| attrs: + 1095| map (name: f name attrs.${name}) (attrNames attrs); + | ^ + 1096| + + … while calling anonymous lambda + at /nix/store/78sgjxjd6p9wns5mriffngcrvxp9sfaa-source/nixos/common.nix:110:66: + 109| + 110| assertions = flatten (flip mapAttrsToList cfg.users (user: config: + | ^ + 111| flip map config.assertions (assertion: { + + … from call site + at /nix/store/78sgjxjd6p9wns5mriffngcrvxp9sfaa-source/nixos/common.nix:111:9: + 110| assertions = flatten (flip mapAttrsToList cfg.users (user: config: + 111| flip map config.assertions (assertion: { + | ^ + 112| inherit (assertion) assertion; + + … while calling 'flip' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/trivial.nix:317:16: + 316| */ + 317| flip = f: a: b: f b a; + | ^ + 318| + + … while calling the 'map' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/trivial.nix:317:19: + 316| */ + 317| flip = f: a: b: f b a; + | ^ + 318| + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/attrsets.nix:1095:23: + 1094| attrs: + 1095| map (name: f name attrs.${name}) (attrNames attrs); + | ^ + 1096| + + … while calling anonymous lambda + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/types.nix:577:22: + 576| merge = loc: defs: + 577| mapAttrs (n: v: v.value) (filterAttrs (n: v: v ? value) (zipAttrsWith (name: defs: + | ^ + 578| (mergeDefinitions (loc ++ [name]) elemType defs).optionalValue + + … while evaluating the attribute 'value' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:864:27: + 863| optionalValue = + 864| if isDefined then { value = mergedValue; } + | ^ + 865| else {}; + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:853:59: + 852| if isDefined then + 853| if all (def: type.check def.value) defsFinal then type.merge loc defsFinal + | ^ + 854| else let allInvalid = filter (def: ! type.check def.value) defsFinal; + + … while calling 'merge' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/types.nix:881:22: + 880| check = x: isAttrs x || isFunction x || path.check x; + 881| merge = loc: defs: + | ^ + 882| (base.extendModules { + + … while evaluating the attribute 'config' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:334:9: + 333| options = checked options; + 334| config = checked (removeAttrs config [ "_module" ]); + | ^ + 335| _module = checked (config._module); + + … while calling the 'seq' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:334:18: + 333| options = checked options; + 334| config = checked (removeAttrs config [ "_module" ]); + | ^ + 335| _module = checked (config._module); + + … while evaluating a branch condition + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:273:9: + 272| checkUnmatched = + 273| if config._module.check && config._module.freeformType == null && merged.unmatchedDefns != [] then + | ^ + 274| let + + … in the left operand of the AND (&&) operator + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:273:72: + 272| checkUnmatched = + 273| if config._module.check && config._module.freeformType == null && merged.unmatchedDefns != [] then + | ^ + 274| let + + … in the left operand of the AND (&&) operator + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:273:33: + 272| checkUnmatched = + 273| if config._module.check && config._module.freeformType == null && merged.unmatchedDefns != [] then + | ^ + 274| let + + … while evaluating a branch condition + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:266:12: + 265| + 266| in if declaredConfig._module.freeformType == null then declaredConfig + | ^ + 267| # Because all definitions that had an associated option ended in + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:254:28: + 253| # For definitions that have an associated option + 254| declaredConfig = mapAttrsRecursiveCond (v: ! isOption v) (_: v: v.value) options; + | ^ + 255| + + … while calling 'mapAttrsRecursiveCond' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/attrsets.nix:1200:5: + 1199| f: + 1200| set: + | ^ + 1201| let + + … while calling the 'mapAttrs' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/attrsets.nix:1209:5: + 1208| in + 1209| recurse [ ] set; + | ^ + 1210| + + … while evaluating the attribute 'matchedOptions' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:692:15: + 691| in { + 692| inherit matchedOptions; + | ^ + 693| + + … while calling the 'mapAttrs' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:683:24: + 682| + 683| matchedOptions = mapAttrs (n: v: v.matchedOptions) resultsByName; + | ^ + 684| + + … while calling the 'mapAttrs' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:636:23: + 635| + 636| resultsByName = mapAttrs (name: decls: + | ^ + 637| # We're descending into attribute ‘name’. + + … while calling the 'zipAttrsWith' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:553:9: + 552| declsByName = + 553| zipAttrsWith + | ^ + 554| (n: concatLists) + + … while calling the 'map' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:555:12: + 554| (n: concatLists) + 555| (map + | ^ + 556| (module: let subtree = module.options; in + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:246:33: + 245| ({ inherit lib options config specialArgs; } // specialArgs); + 246| in mergeModules prefix (reverseList collected); + | ^ + 247| + + … while calling 'reverseList' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/lists.nix:1116:17: + 1115| */ + 1116| reverseList = xs: + | ^ + 1117| let l = length xs; in genList (n: elemAt xs (l - n - 1)) l; + + … while calling the 'genList' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/lists.nix:1117:27: + 1116| reverseList = xs: + 1117| let l = length xs; in genList (n: elemAt xs (l - n - 1)) l; + | ^ + 1118| + + … while evaluating the second argument passed to builtins.genList + + … while calling the 'length' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/lists.nix:1117:13: + 1116| reverseList = xs: + 1117| let l = length xs; in genList (n: elemAt xs (l - n - 1)) l; + | ^ + 1118| + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:241:25: + 240| merged = + 241| let collected = collectModules + | ^ + 242| class + + … while calling anonymous lambda + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:452:37: + 451| + 452| in modulesPath: initialModules: args: + | ^ + 453| filterModules modulesPath (collectStructuredModules unknownModule "" initialModules args); + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:453:7: + 452| in modulesPath: initialModules: args: + 453| filterModules modulesPath (collectStructuredModules unknownModule "" initialModules args); + | ^ + 454| + + … while calling 'filterModules' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:420:36: + 419| # modules recursively. It returns the final list of unique-by-key modules + 420| filterModules = modulesPath: { disabled, modules }: + | ^ + 421| let + + … while calling the 'map' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:447:12: + 446| keyFilter = filter (attrs: ! elem attrs.key disabledKeys); + 447| in map (attrs: attrs.module) (genericClosure { + | ^ + 448| startSet = keyFilter modules; + + … while calling the 'genericClosure' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:447:39: + 446| keyFilter = filter (attrs: ! elem attrs.key disabledKeys); + 447| in map (attrs: attrs.module) (genericClosure { + | ^ + 448| startSet = keyFilter modules; + + … while calling the 'filter' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:448:22: + 447| in map (attrs: attrs.module) (genericClosure { + 448| startSet = keyFilter modules; + | ^ + 449| operator = attrs: keyFilter attrs.modules; + + … while calling anonymous lambda + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:446:31: + 445| disabledKeys = concatMap ({ file, disabled }: map (moduleKey file) disabled) disabled; + 446| keyFilter = filter (attrs: ! elem attrs.key disabledKeys); + | ^ + 447| in map (attrs: attrs.module) (genericClosure { + + … in the argument of the not operator + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:446:40: + 445| disabledKeys = concatMap ({ file, disabled }: map (moduleKey file) disabled) disabled; + 446| keyFilter = filter (attrs: ! elem attrs.key disabledKeys); + | ^ + 447| in map (attrs: attrs.module) (genericClosure { + + … while calling the 'elem' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:446:40: + 445| disabledKeys = concatMap ({ file, disabled }: map (moduleKey file) disabled) disabled; + 446| keyFilter = filter (attrs: ! elem attrs.key disabledKeys); + | ^ + 447| in map (attrs: attrs.module) (genericClosure { + + … while calling the 'concatMap' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:445:26: + 444| + 445| disabledKeys = concatMap ({ file, disabled }: map (moduleKey file) disabled) disabled; + | ^ + 446| keyFilter = filter (attrs: ! elem attrs.key disabledKeys); + + … while calling the 'concatLists' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:402:24: + 401| collectResults = modules: { + 402| disabled = concatLists (catAttrs "disabled" modules); + | ^ + 403| inherit modules; + + … while evaluating the attribute 'disabled' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:402:13: + 401| collectResults = modules: { + 402| disabled = concatLists (catAttrs "disabled" modules); + | ^ + 403| inherit modules; + + … while calling the 'concatLists' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:402:24: + 401| collectResults = modules: { + 402| disabled = concatLists (catAttrs "disabled" modules); + | ^ + 403| inherit modules; + + … while evaluating the attribute 'disabled' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:402:13: + 401| collectResults = modules: { + 402| disabled = concatLists (catAttrs "disabled" modules); + | ^ + 403| inherit modules; + + … while calling the 'concatLists' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:402:24: + 401| collectResults = modules: { + 402| disabled = concatLists (catAttrs "disabled" modules); + | ^ + 403| inherit modules; + + … while evaluating a branch condition + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:413:25: + 412| modules = collectedImports.modules; + 413| disabled = (if module.disabledModules != [] then [{ file = module._file; disabled = module.disabledModules; }] else []) ++ collectedImports.disabled; + | ^ + 414| }) initialModules); + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:407:22: + 406| let + 407| module = checkModule (loadModule args parentFile "${parentKey}:anon-${toString n}" x); + | ^ + 408| collectedImports = collectStructuredModules module._file module.key module.imports args; + + … while calling anonymous lambda + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:366:11: + 365| then + 366| m: + | ^ + 367| if m._class != null -> m._class == class + + … while evaluating a branch condition + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:367:13: + 366| m: + 367| if m._class != null -> m._class == class + | ^ + 368| then m + + … in the left operand of the IMPL (->) operator + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:367:33: + 366| m: + 367| if m._class != null -> m._class == class + | ^ + 368| then m + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:407:35: + 406| let + 407| module = checkModule (loadModule args parentFile "${parentKey}:anon-${toString n}" x); + | ^ + 408| collectedImports = collectStructuredModules module._file module.key module.imports args; + + … while calling 'loadModule' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:348:53: + 347| # Like unifyModuleSyntax, but also imports paths and calls functions if necessary + 348| loadModule = args: fallbackFile: fallbackKey: m: + | ^ + 349| if isFunction m then + + … while evaluating a branch condition + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:349:9: + 348| loadModule = args: fallbackFile: fallbackKey: m: + 349| if isFunction m then + | ^ + 350| unifyModuleSyntax fallbackFile fallbackKey (applyModuleArgs fallbackKey m args) + + … from call site + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/modules.nix:349:12: + 348| loadModule = args: fallbackFile: fallbackKey: m: + 349| if isFunction m then + | ^ + 350| unifyModuleSyntax fallbackFile fallbackKey (applyModuleArgs fallbackKey m args) + + … while calling 'isFunction' + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/trivial.nix:1000:16: + 999| */ + 1000| isFunction = f: builtins.isFunction f || + | ^ + 1001| (f ? __functor && isFunction (f.__functor f)); + + … in the left operand of the OR (||) operator + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/trivial.nix:1000:41: + 999| */ + 1000| isFunction = f: builtins.isFunction f || + | ^ + 1001| (f ? __functor && isFunction (f.__functor f)); + + … while calling the 'isFunction' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/trivial.nix:1000:19: + 999| */ + 1000| isFunction = f: builtins.isFunction f || + | ^ + 1001| (f ? __functor && isFunction (f.__functor f)); + + … while calling the 'elemAt' builtin + at /nix/store/sh0v21n9zc03b94qjj4jkkg5mbsjkpzr-source/lib/lists.nix:334:43: + 333| */ + 334| imap1 = f: list: genList (n: f (n + 1) (elemAt list n)) (length list); + | ^ + 335| + + … while calling the 'import' builtin + at /nix/store/d46k1bziqlp4h2657vc56cmy3llxh4gg-source/homes/me/default.nix:14:7: + 13| imports = [ + 14| (import ./helix.nix { inherit pkgs; } ) + | ^ + 15| # inputs.spicetify-nix.homeManagerModules.default + + error: path '/nix/store/d46k1bziqlp4h2657vc56cmy3llxh4gg-source/homes/me/helix.nix' does not exist From 41595493a3b0df81455f5594e410b05970844de5 Mon Sep 17 00:00:00 2001 From: Emile Clark-Boman Date: Mon, 11 Nov 2024 10:21:22 +1000 Subject: [PATCH 025/328] added end-4's ags config --- homes/me/ags-mine/config.js | 21 + homes/me/ags-mine/widgets/bar.ts | 38 + .../ags/assets/icons/ai-openai-symbolic.svg | 1 + .../ags/assets/icons/ai-oxygen-symbolic.svg | 54 + homes/me/ags/assets/icons/ai-zukijourney.png | Bin 0 -> 312911 bytes homes/me/ags/assets/icons/arch-symbolic.svg | 113 ++ .../me/ags/assets/icons/cachyos-symbolic.svg | 318 ++++++ .../assets/icons/cloudflare-dns-symbolic.svg | 10 + .../ags/assets/icons/crosshair-symbolic.svg | 65 ++ homes/me/ags/assets/icons/debian-symbolic.svg | 91 ++ .../ags/assets/icons/endeavouros-symbolic.svg | 96 ++ homes/me/ags/assets/icons/fedora-symbolic.svg | 38 + .../me/ags/assets/icons/flatpak-symbolic.svg | 52 + homes/me/ags/assets/icons/github-symbolic.svg | 40 + .../assets/icons/google-gemini-symbolic.svg | 56 + homes/me/ags/assets/icons/linux-symbolic.svg | 113 ++ homes/me/ags/assets/icons/nixos-symbolic.svg | 77 ++ homes/me/ags/assets/icons/ollama-symbolic.svg | 60 ++ homes/me/ags/assets/icons/openai-symbolic.svg | 38 + .../ags/assets/icons/openrouter-symbolic.svg | 39 + homes/me/ags/assets/icons/ubuntu-symbolic.svg | 85 ++ .../sourceviewtheme-dark-monokai-license.txt | 339 ++++++ .../assets/themes/sourceviewtheme-light.xml | 95 ++ .../me/ags/assets/themes/sourceviewtheme.xml | 121 +++ homes/me/ags/config.js | 90 +- homes/me/ags/config_overviewOnly.js | 24 + homes/me/ags/i18n/i18n.js | 55 + homes/me/ags/i18n/locales/Default.json | 241 +++++ homes/me/ags/i18n/locales/zh_CN.json | 241 +++++ homes/me/ags/init.js | 30 + .../ags/modules/.commondata/hyprlanddata.js | 27 + homes/me/ags/modules/.commondata/quotes.js | 14 + homes/me/ags/modules/.commondata/weather.js | 94 ++ .../.commonwidgets/cairo_circularprogress.js | 106 ++ .../cairo_navigationindicator.js | 71 ++ .../.commonwidgets/cairo_roundedcorner.js | 50 + .../modules/.commonwidgets/cairo_slider.js | 49 + .../.commonwidgets/clickcloseregion.js | 23 + .../modules/.commonwidgets/configwidgets.js | 219 ++++ .../modules/.commonwidgets/materialicon.js | 7 + .../modules/.commonwidgets/notification.js | 462 ++++++++ .../ags/modules/.commonwidgets/statusicons.js | 306 ++++++ .../.commonwidgets/statusicons_languages.js | 62 ++ .../modules/.commonwidgets/tabcontainer.js | 279 +++++ .../modules/.configuration/user_options.js | 262 +++++ homes/me/ags/modules/.miscutils/files.js | 14 + homes/me/ags/modules/.miscutils/icons.js | 28 + homes/me/ags/modules/.miscutils/mathfuncs.js | 4 + homes/me/ags/modules/.miscutils/md2pango.js | 78 ++ homes/me/ags/modules/.miscutils/system.js | 61 ++ .../modules/.widgethacks/advancedrevealers.js | 86 ++ .../ags/modules/.widgethacks/popupwindow.js | 36 + .../ags/modules/.widgetutils/clickthrough.js | 4 + .../ags/modules/.widgetutils/cursorhover.js | 57 + homes/me/ags/modules/.widgetutils/keybind.js | 25 + .../modules/bar/focus/workspaces_hyprland.js | 213 ++++ .../ags/modules/bar/focus/workspaces_sway.js | 183 ++++ homes/me/ags/modules/bar/main.js | 129 +++ homes/me/ags/modules/bar/normal/music.js | 230 ++++ homes/me/ags/modules/bar/normal/spaceleft.js | 78 ++ homes/me/ags/modules/bar/normal/spaceright.js | 91 ++ homes/me/ags/modules/bar/normal/system.js | 236 +++++ homes/me/ags/modules/bar/normal/tray.js | 36 + .../modules/bar/normal/workspaces_hyprland.js | 224 ++++ .../ags/modules/bar/normal/workspaces_sway.js | 183 ++++ .../ags/modules/cheatsheet/data_keybinds.js | 122 +++ .../modules/cheatsheet/data_periodictable.js | 195 ++++ homes/me/ags/modules/cheatsheet/keybinds.js | 126 +++ homes/me/ags/modules/cheatsheet/main.js | 146 +++ .../ags/modules/cheatsheet/periodictable.js | 94 ++ homes/me/ags/modules/crosshair/main.js | 21 + .../desktopbackground/data_quicklaunches.js | 14 + .../me/ags/modules/desktopbackground/main.js | 24 + .../ags/modules/desktopbackground/system.js | 161 +++ .../desktopbackground/timeandlaunches.js | 74 ++ .../modules/desktopbackground/wallpaper.js | 119 +++ homes/me/ags/modules/dock/dock.js | 300 ++++++ homes/me/ags/modules/dock/icons.js | 63 ++ homes/me/ags/modules/dock/main.js | 12 + .../me/ags/modules/indicators/colorscheme.js | 264 +++++ .../ags/modules/indicators/indicatorvalues.js | 124 +++ homes/me/ags/modules/indicators/main.js | 32 + .../ags/modules/indicators/musiccontrols.js | 408 +++++++ .../modules/indicators/notificationpopups.js | 45 + .../onscreenkeyboard/data_keyboardlayouts.js | 218 ++++ homes/me/ags/modules/onscreenkeyboard/main.js | 11 + .../onscreenkeyboard/onscreenkeyboard.js | 267 +++++ homes/me/ags/modules/overview/actions.js | 28 + homes/me/ags/modules/overview/main.js | 28 + .../me/ags/modules/overview/miscfunctions.js | 165 +++ .../ags/modules/overview/overview_hyprland.js | 431 ++++++++ .../me/ags/modules/overview/searchbuttons.js | 189 ++++ homes/me/ags/modules/overview/searchitem.js | 65 ++ .../me/ags/modules/overview/windowcontent.js | 213 ++++ homes/me/ags/modules/screencorners/main.js | 38 + homes/me/ags/modules/session/main.js | 14 + homes/me/ags/modules/session/sessionscreen.js | 134 +++ .../modules/sideleft/apis/ai_chatmessage.js | 365 +++++++ homes/me/ags/modules/sideleft/apis/booru.js | 518 +++++++++ homes/me/ags/modules/sideleft/apis/chatgpt.js | 355 +++++++ homes/me/ags/modules/sideleft/apis/gemini.js | 288 +++++ homes/me/ags/modules/sideleft/apis/waifu.js | 419 ++++++++ homes/me/ags/modules/sideleft/apiwidgets.js | 223 ++++ homes/me/ags/modules/sideleft/main.js | 18 + homes/me/ags/modules/sideleft/sideleft.js | 121 +++ homes/me/ags/modules/sideleft/toolbox.js | 20 + .../ags/modules/sideleft/tools/changeres.sh | 99 ++ homes/me/ags/modules/sideleft/tools/color.js | 198 ++++ .../ags/modules/sideleft/tools/colorpicker.js | 283 +++++ homes/me/ags/modules/sideleft/tools/module.js | 57 + homes/me/ags/modules/sideleft/tools/name.js | 26 + .../modules/sideleft/tools/quickscripts.js | 103 ++ homes/me/ags/modules/sideright/calendar.js | 203 ++++ .../ags/modules/sideright/calendar_layout.js | 85 ++ .../sideright/centermodules/audiocontrols.js | 217 ++++ .../sideright/centermodules/bluetooth.js | 160 +++ .../sideright/centermodules/configure.js | 130 +++ .../centermodules/notificationlist.js | 176 +++ .../sideright/centermodules/wifinetworks.js | 216 ++++ homes/me/ags/modules/sideright/main.js | 18 + .../me/ags/modules/sideright/quicktoggles.js | 267 +++++ homes/me/ags/modules/sideright/sideright.js | 188 ++++ homes/me/ags/modules/sideright/todolist.js | 224 ++++ homes/me/ags/scripts/README.md | 3 + .../scripts/color_generation/applycolor.sh | 182 ++++ .../ags/scripts/color_generation/colorgen.sh | 94 ++ .../generate_colors_material.py | 182 ++++ .../color_generation/pywal_to_material.scss | 57 + .../scripts/color_generation/randomwall.sh | 4 + .../schemes/scheme_morevibrant.py | 44 + .../specials/_material_badapple-l.scss | 29 + .../specials/_material_badapple.scss | 29 + .../scripts/color_generation/switchcolor.sh | 39 + .../scripts/color_generation/switchwall.sh | 40 + homes/me/ags/scripts/grimblast.sh | 277 +++++ homes/me/ags/scripts/hyprland/get_keybinds.py | 222 ++++ .../ags/scripts/hyprland/workspace_action.sh | 2 + .../quickscripts/nixos-trim-generations.sh | 243 +++++ homes/me/ags/scripts/record-script.sh | 29 + homes/me/ags/scripts/sway/swayToRelativeWs.sh | 30 + .../ags/scripts/templates/fuzzel/fuzzel.ini | 21 + .../scripts/templates/gradience/preset.json | 144 +++ .../templates/hypr/hyprland/colors.conf | 34 + .../ags/scripts/templates/hypr/hyprlock.conf | 102 ++ .../templates/terminal/scheme-base.json | 38 + .../templates/terminal/scheme-monochrome.json | 36 + .../scripts/templates/terminal/sequences.txt | 1 + .../me/ags/scripts/wayland-idle-inhibitor.py | 83 ++ homes/me/ags/scss/_bar.scss | 409 +++++++ homes/me/ags/scss/_cheatsheet.scss | 168 +++ homes/me/ags/scss/_colors.scss | 99 ++ homes/me/ags/scss/_common.scss | 319 ++++++ homes/me/ags/scss/_desktopbackground.scss | 92 ++ homes/me/ags/scss/_dock.scss | 42 + homes/me/ags/scss/_lib_classes.scss | 514 +++++++++ homes/me/ags/scss/_lib_mixins.scss | 177 ++++ homes/me/ags/scss/_music.scss | 156 +++ homes/me/ags/scss/_notifications.scss | 255 +++++ homes/me/ags/scss/_osd.scss | 205 ++++ homes/me/ags/scss/_osk.scss | 119 +++ homes/me/ags/scss/_overview.scss | 139 +++ homes/me/ags/scss/_session.scss | 40 + homes/me/ags/scss/_sidebars.scss | 999 ++++++++++++++++++ homes/me/ags/scss/_wal.scss | 8 + homes/me/ags/scss/fallback/_material.scss | 76 ++ homes/me/ags/scss/main.scss | 42 + homes/me/ags/services/booru.js | 156 +++ homes/me/ags/services/brightness.js | 143 +++ homes/me/ags/services/darkmode.js | 39 + homes/me/ags/services/gemini.js | 328 ++++++ homes/me/ags/services/gpt.js | 292 +++++ homes/me/ags/services/indicator.js | 38 + homes/me/ags/services/messages.js | 61 ++ homes/me/ags/services/sway.js | 400 +++++++ homes/me/ags/services/todo.js | 83 ++ homes/me/ags/services/waifus.js | 150 +++ homes/me/ags/services/wallpaper.js | 70 ++ homes/me/ags/user_options.js | 9 + homes/me/ags/variables.js | 84 ++ hosts/lolcathost/default.nix | 2 +- 180 files changed, 23456 insertions(+), 13 deletions(-) create mode 100644 homes/me/ags-mine/config.js create mode 100644 homes/me/ags-mine/widgets/bar.ts create mode 120000 homes/me/ags/assets/icons/ai-openai-symbolic.svg create mode 100644 homes/me/ags/assets/icons/ai-oxygen-symbolic.svg create mode 100644 homes/me/ags/assets/icons/ai-zukijourney.png create mode 100644 homes/me/ags/assets/icons/arch-symbolic.svg create mode 100644 homes/me/ags/assets/icons/cachyos-symbolic.svg create mode 100644 homes/me/ags/assets/icons/cloudflare-dns-symbolic.svg create mode 100644 homes/me/ags/assets/icons/crosshair-symbolic.svg create mode 100644 homes/me/ags/assets/icons/debian-symbolic.svg create mode 100644 homes/me/ags/assets/icons/endeavouros-symbolic.svg create mode 100644 homes/me/ags/assets/icons/fedora-symbolic.svg create mode 100644 homes/me/ags/assets/icons/flatpak-symbolic.svg create mode 100644 homes/me/ags/assets/icons/github-symbolic.svg create mode 100644 homes/me/ags/assets/icons/google-gemini-symbolic.svg create mode 100644 homes/me/ags/assets/icons/linux-symbolic.svg create mode 100644 homes/me/ags/assets/icons/nixos-symbolic.svg create mode 100644 homes/me/ags/assets/icons/ollama-symbolic.svg create mode 100644 homes/me/ags/assets/icons/openai-symbolic.svg create mode 100644 homes/me/ags/assets/icons/openrouter-symbolic.svg create mode 100644 homes/me/ags/assets/icons/ubuntu-symbolic.svg create mode 100644 homes/me/ags/assets/themes/sourceviewtheme-dark-monokai-license.txt create mode 100644 homes/me/ags/assets/themes/sourceviewtheme-light.xml create mode 100644 homes/me/ags/assets/themes/sourceviewtheme.xml create mode 100644 homes/me/ags/config_overviewOnly.js create mode 100755 homes/me/ags/i18n/i18n.js create mode 100755 homes/me/ags/i18n/locales/Default.json create mode 100755 homes/me/ags/i18n/locales/zh_CN.json create mode 100644 homes/me/ags/init.js create mode 100644 homes/me/ags/modules/.commondata/hyprlanddata.js create mode 100644 homes/me/ags/modules/.commondata/quotes.js create mode 100644 homes/me/ags/modules/.commondata/weather.js create mode 100644 homes/me/ags/modules/.commonwidgets/cairo_circularprogress.js create mode 100644 homes/me/ags/modules/.commonwidgets/cairo_navigationindicator.js create mode 100644 homes/me/ags/modules/.commonwidgets/cairo_roundedcorner.js create mode 100644 homes/me/ags/modules/.commonwidgets/cairo_slider.js create mode 100644 homes/me/ags/modules/.commonwidgets/clickcloseregion.js create mode 100644 homes/me/ags/modules/.commonwidgets/configwidgets.js create mode 100644 homes/me/ags/modules/.commonwidgets/materialicon.js create mode 100644 homes/me/ags/modules/.commonwidgets/notification.js create mode 100644 homes/me/ags/modules/.commonwidgets/statusicons.js create mode 100644 homes/me/ags/modules/.commonwidgets/statusicons_languages.js create mode 100644 homes/me/ags/modules/.commonwidgets/tabcontainer.js create mode 100644 homes/me/ags/modules/.configuration/user_options.js create mode 100644 homes/me/ags/modules/.miscutils/files.js create mode 100644 homes/me/ags/modules/.miscutils/icons.js create mode 100644 homes/me/ags/modules/.miscutils/mathfuncs.js create mode 100644 homes/me/ags/modules/.miscutils/md2pango.js create mode 100644 homes/me/ags/modules/.miscutils/system.js create mode 100644 homes/me/ags/modules/.widgethacks/advancedrevealers.js create mode 100644 homes/me/ags/modules/.widgethacks/popupwindow.js create mode 100644 homes/me/ags/modules/.widgetutils/clickthrough.js create mode 100644 homes/me/ags/modules/.widgetutils/cursorhover.js create mode 100644 homes/me/ags/modules/.widgetutils/keybind.js create mode 100644 homes/me/ags/modules/bar/focus/workspaces_hyprland.js create mode 100644 homes/me/ags/modules/bar/focus/workspaces_sway.js create mode 100644 homes/me/ags/modules/bar/main.js create mode 100644 homes/me/ags/modules/bar/normal/music.js create mode 100644 homes/me/ags/modules/bar/normal/spaceleft.js create mode 100644 homes/me/ags/modules/bar/normal/spaceright.js create mode 100644 homes/me/ags/modules/bar/normal/system.js create mode 100644 homes/me/ags/modules/bar/normal/tray.js create mode 100644 homes/me/ags/modules/bar/normal/workspaces_hyprland.js create mode 100644 homes/me/ags/modules/bar/normal/workspaces_sway.js create mode 100644 homes/me/ags/modules/cheatsheet/data_keybinds.js create mode 100644 homes/me/ags/modules/cheatsheet/data_periodictable.js create mode 100644 homes/me/ags/modules/cheatsheet/keybinds.js create mode 100644 homes/me/ags/modules/cheatsheet/main.js create mode 100644 homes/me/ags/modules/cheatsheet/periodictable.js create mode 100644 homes/me/ags/modules/crosshair/main.js create mode 100644 homes/me/ags/modules/desktopbackground/data_quicklaunches.js create mode 100644 homes/me/ags/modules/desktopbackground/main.js create mode 100644 homes/me/ags/modules/desktopbackground/system.js create mode 100644 homes/me/ags/modules/desktopbackground/timeandlaunches.js create mode 100644 homes/me/ags/modules/desktopbackground/wallpaper.js create mode 100755 homes/me/ags/modules/dock/dock.js create mode 100644 homes/me/ags/modules/dock/icons.js create mode 100644 homes/me/ags/modules/dock/main.js create mode 100644 homes/me/ags/modules/indicators/colorscheme.js create mode 100644 homes/me/ags/modules/indicators/indicatorvalues.js create mode 100644 homes/me/ags/modules/indicators/main.js create mode 100644 homes/me/ags/modules/indicators/musiccontrols.js create mode 100644 homes/me/ags/modules/indicators/notificationpopups.js create mode 100644 homes/me/ags/modules/onscreenkeyboard/data_keyboardlayouts.js create mode 100644 homes/me/ags/modules/onscreenkeyboard/main.js create mode 100644 homes/me/ags/modules/onscreenkeyboard/onscreenkeyboard.js create mode 100644 homes/me/ags/modules/overview/actions.js create mode 100644 homes/me/ags/modules/overview/main.js create mode 100644 homes/me/ags/modules/overview/miscfunctions.js create mode 100644 homes/me/ags/modules/overview/overview_hyprland.js create mode 100644 homes/me/ags/modules/overview/searchbuttons.js create mode 100644 homes/me/ags/modules/overview/searchitem.js create mode 100644 homes/me/ags/modules/overview/windowcontent.js create mode 100644 homes/me/ags/modules/screencorners/main.js create mode 100644 homes/me/ags/modules/session/main.js create mode 100644 homes/me/ags/modules/session/sessionscreen.js create mode 100644 homes/me/ags/modules/sideleft/apis/ai_chatmessage.js create mode 100644 homes/me/ags/modules/sideleft/apis/booru.js create mode 100644 homes/me/ags/modules/sideleft/apis/chatgpt.js create mode 100644 homes/me/ags/modules/sideleft/apis/gemini.js create mode 100644 homes/me/ags/modules/sideleft/apis/waifu.js create mode 100644 homes/me/ags/modules/sideleft/apiwidgets.js create mode 100644 homes/me/ags/modules/sideleft/main.js create mode 100644 homes/me/ags/modules/sideleft/sideleft.js create mode 100644 homes/me/ags/modules/sideleft/toolbox.js create mode 100644 homes/me/ags/modules/sideleft/tools/changeres.sh create mode 100644 homes/me/ags/modules/sideleft/tools/color.js create mode 100644 homes/me/ags/modules/sideleft/tools/colorpicker.js create mode 100644 homes/me/ags/modules/sideleft/tools/module.js create mode 100644 homes/me/ags/modules/sideleft/tools/name.js create mode 100644 homes/me/ags/modules/sideleft/tools/quickscripts.js create mode 100644 homes/me/ags/modules/sideright/calendar.js create mode 100644 homes/me/ags/modules/sideright/calendar_layout.js create mode 100644 homes/me/ags/modules/sideright/centermodules/audiocontrols.js create mode 100644 homes/me/ags/modules/sideright/centermodules/bluetooth.js create mode 100644 homes/me/ags/modules/sideright/centermodules/configure.js create mode 100644 homes/me/ags/modules/sideright/centermodules/notificationlist.js create mode 100644 homes/me/ags/modules/sideright/centermodules/wifinetworks.js create mode 100644 homes/me/ags/modules/sideright/main.js create mode 100644 homes/me/ags/modules/sideright/quicktoggles.js create mode 100644 homes/me/ags/modules/sideright/sideright.js create mode 100644 homes/me/ags/modules/sideright/todolist.js create mode 100644 homes/me/ags/scripts/README.md create mode 100755 homes/me/ags/scripts/color_generation/applycolor.sh create mode 100755 homes/me/ags/scripts/color_generation/colorgen.sh create mode 100755 homes/me/ags/scripts/color_generation/generate_colors_material.py create mode 100644 homes/me/ags/scripts/color_generation/pywal_to_material.scss create mode 100755 homes/me/ags/scripts/color_generation/randomwall.sh create mode 100644 homes/me/ags/scripts/color_generation/schemes/scheme_morevibrant.py create mode 100644 homes/me/ags/scripts/color_generation/specials/_material_badapple-l.scss create mode 100644 homes/me/ags/scripts/color_generation/specials/_material_badapple.scss create mode 100755 homes/me/ags/scripts/color_generation/switchcolor.sh create mode 100755 homes/me/ags/scripts/color_generation/switchwall.sh create mode 100755 homes/me/ags/scripts/grimblast.sh create mode 100755 homes/me/ags/scripts/hyprland/get_keybinds.py create mode 100755 homes/me/ags/scripts/hyprland/workspace_action.sh create mode 100755 homes/me/ags/scripts/quickscripts/nixos-trim-generations.sh create mode 100755 homes/me/ags/scripts/record-script.sh create mode 100755 homes/me/ags/scripts/sway/swayToRelativeWs.sh create mode 100644 homes/me/ags/scripts/templates/fuzzel/fuzzel.ini create mode 100644 homes/me/ags/scripts/templates/gradience/preset.json create mode 100644 homes/me/ags/scripts/templates/hypr/hyprland/colors.conf create mode 100644 homes/me/ags/scripts/templates/hypr/hyprlock.conf create mode 100644 homes/me/ags/scripts/templates/terminal/scheme-base.json create mode 100644 homes/me/ags/scripts/templates/terminal/scheme-monochrome.json create mode 100644 homes/me/ags/scripts/templates/terminal/sequences.txt create mode 100755 homes/me/ags/scripts/wayland-idle-inhibitor.py create mode 100644 homes/me/ags/scss/_bar.scss create mode 100644 homes/me/ags/scss/_cheatsheet.scss create mode 100644 homes/me/ags/scss/_colors.scss create mode 100644 homes/me/ags/scss/_common.scss create mode 100644 homes/me/ags/scss/_desktopbackground.scss create mode 100644 homes/me/ags/scss/_dock.scss create mode 100644 homes/me/ags/scss/_lib_classes.scss create mode 100644 homes/me/ags/scss/_lib_mixins.scss create mode 100644 homes/me/ags/scss/_music.scss create mode 100644 homes/me/ags/scss/_notifications.scss create mode 100644 homes/me/ags/scss/_osd.scss create mode 100644 homes/me/ags/scss/_osk.scss create mode 100644 homes/me/ags/scss/_overview.scss create mode 100644 homes/me/ags/scss/_session.scss create mode 100644 homes/me/ags/scss/_sidebars.scss create mode 100644 homes/me/ags/scss/_wal.scss create mode 100644 homes/me/ags/scss/fallback/_material.scss create mode 100644 homes/me/ags/scss/main.scss create mode 100644 homes/me/ags/services/booru.js create mode 100644 homes/me/ags/services/brightness.js create mode 100644 homes/me/ags/services/darkmode.js create mode 100644 homes/me/ags/services/gemini.js create mode 100644 homes/me/ags/services/gpt.js create mode 100644 homes/me/ags/services/indicator.js create mode 100644 homes/me/ags/services/messages.js create mode 100644 homes/me/ags/services/sway.js create mode 100644 homes/me/ags/services/todo.js create mode 100644 homes/me/ags/services/waifus.js create mode 100644 homes/me/ags/services/wallpaper.js create mode 100644 homes/me/ags/user_options.js create mode 100644 homes/me/ags/variables.js diff --git a/homes/me/ags-mine/config.js b/homes/me/ags-mine/config.js new file mode 100644 index 0000000..0bc06b5 --- /dev/null +++ b/homes/me/ags-mine/config.js @@ -0,0 +1,21 @@ +const date = Variable('', { + poll: [1000, 'date'], +}) + +const Bar = (monitor = 0) => Widget.Window({ + monitor, + name: 'bar${monitor}', + anchor: ['top', 'left', 'right'], + child: Widget.Label({ label: date.bind() }), + }) + +App.config({ + style: "./style.css", + // icons: "./assets", + windows: [ + Bar() + ] + // gtkTheme: "Adwaita-dark", + // cursorTheme: "Qogir", + // iconTheme: "MoreWaita",[] +}) diff --git a/homes/me/ags-mine/widgets/bar.ts b/homes/me/ags-mine/widgets/bar.ts new file mode 100644 index 0000000..8f361ac --- /dev/null +++ b/homes/me/ags-mine/widgets/bar.ts @@ -0,0 +1,38 @@ +import options from "options"p + +const { start, center, end } = options.bar.layout + +// place all your bar widgets in here +const widgets = { + expander: () => Widget.Box({ expand: true}), +} + + +//export type BarWidget = keyof typeof widget; + +export default (monitor: number) => Widget.Window({ + monitor, + class_name: "bar", + name: "bar-${monitor}", + // anchor: position.bind().as(pos => [pos, "left", "right"]), + anchor: ["top", "left", "right"], + child: Widget.CenterBox({ + // ensure bar is shown + css: "min-width: 2px; min-height: 2px;" + startWidget: Widget.Box({ + hexpand: true, + // map all start widgets to be childen + childen: start.bind().as(s => s.map(w => widgets[w]())) + }), + centerWidget: Widget.Box({ + hpack: "center", + // map all center widgets to be childen + childen: center.bind().as(c => c.map(w => widgets[w]())) + }), + endWidget: Widget.Box({ + hexpand: true + // map all end widgets to be childen + childen: end.bind().as(e => e.map(w => widgets[w]())) + }), + }) +}) diff --git a/homes/me/ags/assets/icons/ai-openai-symbolic.svg b/homes/me/ags/assets/icons/ai-openai-symbolic.svg new file mode 120000 index 0000000..c9ee0b3 --- /dev/null +++ b/homes/me/ags/assets/icons/ai-openai-symbolic.svg @@ -0,0 +1 @@ +openai-symbolic.svg \ No newline at end of file diff --git a/homes/me/ags/assets/icons/ai-oxygen-symbolic.svg b/homes/me/ags/assets/icons/ai-oxygen-symbolic.svg new file mode 100644 index 0000000..5e1cc19 --- /dev/null +++ b/homes/me/ags/assets/icons/ai-oxygen-symbolic.svg @@ -0,0 +1,54 @@ + + + + + + + + + + diff --git a/homes/me/ags/assets/icons/ai-zukijourney.png b/homes/me/ags/assets/icons/ai-zukijourney.png new file mode 100644 index 0000000000000000000000000000000000000000..917335e7284b2ffc8fc222c126016e23bbbc07ce GIT binary patch literal 312911 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%0DKatMTME;}uCcai8B9&%P`0b}`D}7} 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 z + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/homes/me/ags/assets/icons/cachyos-symbolic.svg b/homes/me/ags/assets/icons/cachyos-symbolic.svg new file mode 100644 index 0000000..4a9db19 --- /dev/null +++ b/homes/me/ags/assets/icons/cachyos-symbolic.svg @@ -0,0 +1,318 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/homes/me/ags/assets/icons/cloudflare-dns-symbolic.svg b/homes/me/ags/assets/icons/cloudflare-dns-symbolic.svg new file mode 100644 index 0000000..bd48d3c --- /dev/null +++ b/homes/me/ags/assets/icons/cloudflare-dns-symbolic.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/homes/me/ags/assets/icons/crosshair-symbolic.svg b/homes/me/ags/assets/icons/crosshair-symbolic.svg new file mode 100644 index 0000000..2296749 --- /dev/null +++ b/homes/me/ags/assets/icons/crosshair-symbolic.svg @@ -0,0 +1,65 @@ + + + + + + + ionicons-v5_logos + + + + ionicons-v5_logos + + + + + + diff --git a/homes/me/ags/assets/icons/debian-symbolic.svg b/homes/me/ags/assets/icons/debian-symbolic.svg new file mode 100644 index 0000000..252f853 --- /dev/null +++ b/homes/me/ags/assets/icons/debian-symbolic.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/homes/me/ags/assets/icons/endeavouros-symbolic.svg b/homes/me/ags/assets/icons/endeavouros-symbolic.svg new file mode 100644 index 0000000..3be4cc4 --- /dev/null +++ b/homes/me/ags/assets/icons/endeavouros-symbolic.svg @@ -0,0 +1,96 @@ + + + + + EndeavourOS Logo + + + + image/svg+xml + + EndeavourOS Logo + + + + + + + + + + + + + + + + + + + diff --git a/homes/me/ags/assets/icons/fedora-symbolic.svg b/homes/me/ags/assets/icons/fedora-symbolic.svg new file mode 100644 index 0000000..1a4e8c8 --- /dev/null +++ b/homes/me/ags/assets/icons/fedora-symbolic.svg @@ -0,0 +1,38 @@ + + + + + + + diff --git a/homes/me/ags/assets/icons/flatpak-symbolic.svg b/homes/me/ags/assets/icons/flatpak-symbolic.svg new file mode 100644 index 0000000..0c2bf62 --- /dev/null +++ b/homes/me/ags/assets/icons/flatpak-symbolic.svg @@ -0,0 +1,52 @@ + + + + + Flatpak + + + + + Flatpak + + + + diff --git a/homes/me/ags/assets/icons/github-symbolic.svg b/homes/me/ags/assets/icons/github-symbolic.svg new file mode 100644 index 0000000..c1c9f19 --- /dev/null +++ b/homes/me/ags/assets/icons/github-symbolic.svg @@ -0,0 +1,40 @@ + + + + + + diff --git a/homes/me/ags/assets/icons/google-gemini-symbolic.svg b/homes/me/ags/assets/icons/google-gemini-symbolic.svg new file mode 100644 index 0000000..9de741b --- /dev/null +++ b/homes/me/ags/assets/icons/google-gemini-symbolic.svg @@ -0,0 +1,56 @@ + + + + + + + ionicons-v5_logos + + + + + ionicons-v5_logos + + + + diff --git a/homes/me/ags/assets/icons/linux-symbolic.svg b/homes/me/ags/assets/icons/linux-symbolic.svg new file mode 100644 index 0000000..63f9c7e --- /dev/null +++ b/homes/me/ags/assets/icons/linux-symbolic.svg @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/homes/me/ags/assets/icons/nixos-symbolic.svg b/homes/me/ags/assets/icons/nixos-symbolic.svg new file mode 100644 index 0000000..b697b0d --- /dev/null +++ b/homes/me/ags/assets/icons/nixos-symbolic.svg @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + diff --git a/homes/me/ags/assets/icons/ollama-symbolic.svg b/homes/me/ags/assets/icons/ollama-symbolic.svg new file mode 100644 index 0000000..0145481 --- /dev/null +++ b/homes/me/ags/assets/icons/ollama-symbolic.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + + diff --git a/homes/me/ags/assets/icons/openai-symbolic.svg b/homes/me/ags/assets/icons/openai-symbolic.svg new file mode 100644 index 0000000..8ffc912 --- /dev/null +++ b/homes/me/ags/assets/icons/openai-symbolic.svg @@ -0,0 +1,38 @@ + + + + + + diff --git a/homes/me/ags/assets/icons/openrouter-symbolic.svg b/homes/me/ags/assets/icons/openrouter-symbolic.svg new file mode 100644 index 0000000..32aaaf5 --- /dev/null +++ b/homes/me/ags/assets/icons/openrouter-symbolic.svg @@ -0,0 +1,39 @@ + + + + + + diff --git a/homes/me/ags/assets/icons/ubuntu-symbolic.svg b/homes/me/ags/assets/icons/ubuntu-symbolic.svg new file mode 100644 index 0000000..07746c9 --- /dev/null +++ b/homes/me/ags/assets/icons/ubuntu-symbolic.svg @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/homes/me/ags/assets/themes/sourceviewtheme-dark-monokai-license.txt b/homes/me/ags/assets/themes/sourceviewtheme-dark-monokai-license.txt new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/homes/me/ags/assets/themes/sourceviewtheme-dark-monokai-license.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/homes/me/ags/assets/themes/sourceviewtheme-light.xml b/homes/me/ags/assets/themes/sourceviewtheme-light.xml new file mode 100644 index 0000000..bf39bfb --- /dev/null +++ b/homes/me/ags/assets/themes/sourceviewtheme-light.xml @@ -0,0 +1,95 @@ + + + end_4 + <_description>Catppuccin port but very random + +