{ inputs, outputs, lib, config, pkgs, ... }: { nixpkgs = { config.allowUnfree = true; }; imports = [ #inputs.nixcord.homeManagerModules.nixcord # inputs.spicetify-nix.homeManagerModules.default # ./wofi.nix #../../modules/discord/nixcord.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"; pointerCursor = { gtk.enable = true; # x11.enable = true # dont enable since im on hyprland package = pkgs.bibata-cursors; name = "Bibata-Modern-Ice"; size = 16; }; }; 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; 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; 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 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]; } ]; }; 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 #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 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 = "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 = "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 = { # 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"; home.stateVersion = "24.05"; # don't change this }