{lib, pkgs, config, ...}: let inherit (lib) mkIf mkMerge ; cfg = config.jfrikker; in { options.jfrikker = { enable = lib.mkEnableOption "Joe Frikker's configuration"; desktop.enable = lib.mkEnableOption "Desktop (GUI) applications"; redbook.enable = lib.mkEnableOption "Redbook-specific configuration"; }; config = mkIf cfg.enable (mkMerge [ { home.packages = with pkgs; [ rlwrap (sbcl.withPackages (ps: with ps; [ alexandria cl-markup cl-mock clack clack-handler-woo dbi defstar dexador fare-csv group-by lack-request lack-response local-time log4cl mito myway prove prove-asdf replic serapeum shasht slynk smug split-sequence str sxql-composer trivia trivial-mmap trivial-ws trivial-open-browser trivial-timeout uuid ])) ]; } { home.packages = with pkgs; [ rage age-plugin-yubikey yubikey-manager ]; } { home.packages = with pkgs; [ dust fd ripgrep tokei xh ]; programs.eza = { enable = true; enableBashIntegration = true; enableZshIntegration = true; icons = "auto"; }; } { home.packages = with pkgs; [ ledger ]; } { home.packages = with pkgs; [ nil nixfmt ]; } { home.packages = with pkgs; [ magic-wormhole ]; } (mkIf cfg.redbook.enable { home.packages = with pkgs; [ openssh ]; }) (mkIf cfg.desktop.enable { home.packages = with pkgs; [ google-chrome nerd-fonts.jetbrains-mono nerd-fonts.symbols-only (iosevka-bin.override { variant = "Aile"; }) (iosevka-bin.override { variant = "Etoile"; }) (iosevka-bin.override { variant = "SGr-IosevkaTermSS14"; }) nerd-fonts.symbols-only keymapp proton-pass wireshark ]; fonts.fontconfig.enable = true; }) (mkIf (cfg.redbook.enable && cfg.desktop.enable) { home.packages = with pkgs; [ linear notion-app (slack.overrideAttrs { version = "4.50.143"; src = pkgs.fetchurl { url = "https://downloads.slack-edge.com/desktop-releases/mac/arm64/4.50.143/Slack-4.50.143-macOS.dmg"; hash = "sha256-f5oYi8NPKXWpDcowFYMUjptbQs4V9hK2bm1TuaQeJn0="; }; }) teams ]; }) { programs = { bash.enable = true; gh.enable = true; home-manager.enable = true; jq.enable = true; lazygit.enable = true; zoxide.enable = true; }; } { programs.bat = { enable = true; config.style = "numbers"; }; } { programs.nix-index.enable = true; programs.nix-index-database.comma.enable = true; } { programs.direnv = { enable = true; nix-direnv.enable = true; }; } { programs.fzf = { defaultCommand = "fd --type f"; fileWidgetCommand = "fd --type f"; fileWidgetOptions = ["--preview" "'bat --color=always --style=numbers --line-range=:500 {}'"]; changeDirWidgetCommand = "fd --type d"; tmux.enableShellIntegration = true; }; } { programs.git = { enable = true; settings.user.name = "Joe Frikker"; settings.user.email = "joe@redbookcattle.com"; settings.github.user = "joe@redbookcattle.com"; settings.merge.conflictstyle = "zdiff3"; }; programs.delta = { enable = true; enableGitIntegration = true; }; } { programs.helix = { enable = true; defaultEditor = true; settings.editor = { auto-format = false; auto-pairs = false; auto-save.after-delay.enable = true; auto-save.after-delay.timeout = 1000; cursorline = true; idle-timeout = 0; rulers = [120]; text-width = 100; lsp.goto-reference-include-declaration = false; cursor-shape.insert = "bar"; smart-tab.supersede-menu = true; whitespace.render.newline = "all"; }; settings.keys.normal.space = { space = "file_picker"; "," = "buffer_picker"; # b = "@:sh wezterm cli spawn --cwd . -- tig blame %"; }; languages.language-server.eslint = { args = ["--stdio"]; command = "vscode-eslint-language-server"; config.nodePath = ""; config.quiet = false; config.rulesCustomizations = []; config.run = "onType"; config.validate = "on"; config.codeAction.disableRuleComment.enable = true; config.codeAction.disableRuleComment.location = "separateLine"; config.codeAction.showDocumentation.enable = true; config.problems.shortenToSingleLine = false; }; languages.language-server.jdtls.config.java = { autobuild.enabled = true; completion.maxResults = 1000; format.settings.url = "https://raw.githubusercontent.com/google/styleguide/gh-pages/eclipse-java-google-style.xml"; }; languages.language-server.rust-analyzer.config.files.watcher = "client"; languages.language = [ { name = "typescript"; language-servers = [ "typescript-language-server" "vscode-eslint-language-server" ]; indent.tab-width = 4; indent.unit = " "; } { name = "tsx"; language-servers = [ "typescript-language-server" "vscode-eslint-language-server" ]; indent.tab-width = 4; indent.unit = " "; } { name = "java"; indent.tab-width = 4; indent.unit = " "; } ]; }; } { programs.nh = { enable = true; }; } { programs.starship = { enable = true; settings = { add_newline = false; container.disabled = true; git_branch.symbol = " "; git_status.ahead = "⇡\${count}"; git_status.behind = "⇣\${count}"; git_status.diverged = "⇕⇡\${ahead_count}⇣\${behind_count}"; git_status.format = "([\\[\$conflicted\$staged\$ahead_behind\\]](\$style) )"; java.symbol = " "; line_break.disabled = true; nix_shell.symbol = " "; nodejs.symbol = " "; package.disabled = true; palette = "catppuccin_frappe"; python.symbol = " "; package.symbol = " "; rust.symbol = " "; docker_context.disabled = true; shell.disabled = false; }; }; } { programs.tmux = { baseIndex = 1; clock24 = true; customPaneNavigationAndResize = true; historyLimit = 50000; enable = true; escapeTime = 0; keyMode = "vi"; mouse = true; shell = pkgs.zsh + "/bin/zsh"; shortcut = "Space"; tmuxinator.enable = true; terminal = "xterm-256color"; extraConfig = '' bind-key -T copy-mode-vi 'v' send -X begin-selection bind-key -T copy-mode-vi 'y' send -X copy-selection-and-cancel bind-key -T launcher g popup -h 100% -w 100% -E lazygit bind-key g switch-client -Tlauncher set -g default-command "" ''; }; } (mkIf cfg.desktop.enable { programs.wezterm = { enable = true; extraConfig = '' local config = {} config.default_prog = { '${pkgs.zsh}/bin/zsh', '-l'} config.font_size = ${if pkgs.stdenv.isDarwin then "13.0" else "10.0"} '' + builtins.readFile ./wezterm.lua; }; }) (mkIf cfg.desktop.enable { programs.kitty = { enable = true; font = { name = "Iosevka Term SS14"; package = pkgs.iosevka-bin.override { variant = "SGr-IosevkaTermSS14"; }; size = 13; }; themeFile = "Catppuccin-Frappe"; keybindings = { "ctrl+1" = "goto_tab 1"; "ctrl+2" = "goto_tab 2"; "ctrl+3" = "goto_tab 3"; "ctrl+4" = "goto_tab 4"; "ctrl+5" = "goto_tab 5"; "ctrl+6" = "goto_tab 6"; "ctrl+7" = "goto_tab 7"; "ctrl+8" = "goto_tab 8"; "ctrl+9" = "goto_tab 9"; }; }; }) { programs.ghostty = { enable = false; package = pkgs.ghostty-bin; settings = { adjust-cell-height = "15%"; font-family = "Iosevka Term SS14"; font-size = 13; }; }; } { programs.zsh = { enable = true; oh-my-zsh.enable = true; syntaxHighlighting.enable = true; autosuggestion.enable = true; historySubstringSearch.enable = true; history.share = false; cdpath = ["~/source"]; }; } { programs.zsh.plugins = [ { name = "zsh-nix-shell"; file = "nix-shell.plugin.zsh"; src = pkgs.fetchFromGitHub { owner = "chisui"; repo = "zsh-nix-shell"; rev = "v0.7.0"; sha256 = "149zh2rm59blr2q458a5irkfh82y3dwdich60s9670kl3cl5h2m1"; }; } ]; } (mkIf cfg.desktop.enable { programs.emacs = { enable = true; extraConfig = builtins.readFile ./emacs.el; }; }) { programs.emacs = { extraPackages = epkgs: with epkgs; [ ace-window doom-modeline free-keys ligature mixed-pitch popper ]; }; } { programs.emacs = { extraPackages = epkgs: with epkgs; [ apheleia avy edit-indirect embark god-mode # evil # evil-collection # evil-org string-inflection ]; }; } { programs.emacs = { extraPackages = epkgs: with epkgs; [ buffer-terminator ]; }; } { programs.emacs = { extraPackages = epkgs: with epkgs; [ consult-eglot graphql-ts-mode haskell-ts-mode jenkinsfile-mode jq-mode (lispy.overrideAttrs { packageRequires = [ ace-window iedit swiper zoutline hydra ]; ignoreCompilationError = true; }) # lispyville lua-mode nix-mode pnpm-mode prisma-ts-mode rust-mode sly sly-macrostep sql-indent tree-sitter (treesit-grammars.with-grammars (g: [ g.tree-sitter-bash g.tree-sitter-commonlisp g.tree-sitter-css g.tree-sitter-dockerfile g.tree-sitter-dot g.tree-sitter-elisp g.tree-sitter-graphql g.tree-sitter-gitcommit g.tree-sitter-gitignore g.tree-sitter-haskell g.tree-sitter-html g.tree-sitter-java g.tree-sitter-javascript g.tree-sitter-jq g.tree-sitter-json g.tree-sitter-json5 g.tree-sitter-just g.tree-sitter-ledger g.tree-sitter-llvm g.tree-sitter-make g.tree-sitter-nginx g.tree-sitter-nix g.tree-sitter-org g.tree-sitter-php g.tree-sitter-prisma g.tree-sitter-python g.tree-sitter-rust g.tree-sitter-rust-format-args g.tree-sitter-scss g.tree-sitter-sql g.tree-sitter-toml g.tree-sitter-tsx g.tree-sitter-typescript g.tree-sitter-xml g.tree-sitter-yaml ])) yaml-pro ]; }; } { programs.emacs = { extraPackages = epkgs: with epkgs; [ envrc ]; }; } { programs.emacs = { extraPackages = epkgs: with epkgs; [ consult-gh diff-hl forge git-timemachine magit ]; }; } { programs.emacs = { extraPackages = epkgs: with epkgs; [ cape consult corfu embark-consult marginalia orderless vertico ]; }; } { programs.emacs = { extraPackages = epkgs: with epkgs; [ org-modern org-present org-roam ox-slack verb visual-fill-column ]; }; } { programs.emacs = { extraPackages = epkgs: with epkgs; [ eat ]; }; } (mkIf (cfg.redbook.enable && cfg.desktop.enable) { programs.emacs = { extraPackages = epkgs: with epkgs; [ slack ]; extraConfig = builtins.readFile ./slack.el; }; }) { programs.emacs = { extraPackages = epkgs: with epkgs; [ ledger-mode ]; }; } { programs.emacs = { extraPackages = epkgs: with epkgs; [ age ]; }; } { programs.claude-code = { enable = true; }; programs.emacs = { extraPackages = epkgs: with epkgs; [ (epkgs.trivialBuild { pname = "claude-code"; version = "0.4.5"; src = pkgs.fetchFromGitHub { owner = "stevemolitor"; repo = "claude-code.el"; rev = "03199df8b3a1e9cd4857f0851f7a912ba524aff3"; sha256 = "sha256-5QJrWIu4EgnHcOqMwlrs2JBBx7aI9OaSJswesr6Apfk="; }; packageRequires = [ epkgs.inheritenv ]; }) ]; }; } { programs.bat = { config.theme = "catppuccin-frappe"; themes = { catppuccin-frappe = { src = pkgs.fetchFromGitHub { owner = "catppuccin"; repo = "sublime-text"; # Bat uses sublime syntax for its themes rev = "3d8625d937d89869476e94bc100192aa220ce44a"; sha256 = "3ABUsfJpb6RO6AiuuSL5gwDofJIwC5tlEMzBrlY9/s0="; }; file = "Frappe.tmTheme"; }; }; }; } { programs.helix.settings.theme = "catppuccin_frappe"; } { programs.tmux.plugins = [ { plugin = pkgs.tmuxPlugins.catppuccin; extraConfig = ''set -g @catppuccin_window_tabs_enabled on set -g @catppuccin_window_default_text "#W" set -g @catppuccin_window_current_text "#W"''; } ]; } { xdg = { enable = false ; # configFile."lazygit/config.yml" = { # enable = true; # source = pkgs.fetchFromGitHub # { # owner = "catppuccin"; # repo = "lazygit"; # rev = "b2ecb6d41b6f54a82104879573c538e8bdaeb0bf"; # Replace with the latest commit hash # sha256 = "9BBmWRcjNaJE9T0RKVEJaSnkrbMom0CLYE8PzAT6yFw="; # } + /themes/frappe.yml; # }; }; } { programs.starship.settings = builtins.fromTOML (builtins.readFile (pkgs.fetchFromGitHub { owner = "catppuccin"; repo = "starship"; rev = "3e3e54410c3189053f4da7a7043261361a1ed1bc"; # Replace with the latest commit hash sha256 = "soEBVlq3ULeiZFAdQYMRFuswIIhI9bclIU8WXjxd7oY="; } + /palettes/frappe.toml)); } { programs.ghostty.settings.theme = "Catppuccin Frappe"; } { programs.emacs = { extraPackages = epkgs: with epkgs; [ catppuccin-theme ]; extraConfig = ''(defvar my-base-font-size ${if pkgs.stdenv.isDarwin then "130" else "100"}) (require 'catppuccin-theme) (setopt catppuccin-flavor 'frappe) (load-theme 'catppuccin :no-confirm) ;; (set-face-attribute 'default nil :font "JetBrainsMono Nerd Font" :height 130) ;; (set-face-attribute 'fixed-pitch nil :font "JetBrainsMono Nerd Font" :height 130) (set-face-attribute 'default nil :font "Iosevka Term SS14" :height my-base-font-size) (set-face-attribute 'fixed-pitch nil :font "Iosevka Term SS14" :height my-base-font-size) (set-face-attribute 'variable-pitch nil :font "Iosevka Etoile" :height my-base-font-size) ''; }; } ]); }