{ config, pkgs, lib, ... }: let themePath = ../../themes/palettes + "/${config.nomarchy.theme}/apps/vscode.json"; themeConfig = if builtins.pathExists themePath then builtins.fromJSON (builtins.readFile themePath) else { name = "Default Dark Modern"; }; # Theme extensions matching palette vscode.json `extension` fields. Always # installed because workbench.colorTheme is set unconditionally from the # active palette — without the matching extension VSCode silently falls # back to its default theme. Only the extensions available in # pkgs.vscode-extensions are listed. Palettes whose theme extension is on # the VSCode marketplace but not packaged in nixpkgs (sainnhe.everforest — # affects the DEFAULT summer-night palette — plus qufiwefefwoyn.kanagawa, # monokai.theme-monokai-pro-vscode, oldjobobo.*, Bjarne.*, # shadesOfBuntu.flexoki-light, jovejonovski.ocean-green, TahaYVR.matteblack) # still break and need pkgs.vscode-utils.extensionFromVscodeMarketplace — # tracked in ROADMAP Later. themeExtensions = with pkgs.vscode-extensions; [ catppuccin.catppuccin-vsc # catppuccin, catppuccin-latte enkia.tokyo-night # tokyo-night arcticicestudio.nord-visual-studio-code # nord mvllow.rose-pine # rose-pine jdinhlife.gruvbox # gruvbox ]; # Development extensions — opt-in via nomarchy.vscode.devExtensions. devExtensions = with pkgs.vscode-extensions; [ # Language support ms-python.python rust-lang.rust-analyzer golang.go jnoortheen.nix-ide # Git integration eamodio.gitlens # Editor enhancements esbenp.prettier-vscode dbaeumer.vscode-eslint bradlc.vscode-tailwindcss ]; in { options.nomarchy.vscode = { devExtensions = lib.mkOption { type = lib.types.bool; default = false; description = "Whether to install development extensions for VSCode."; }; }; config = { programs.vscode = { enable = lib.mkDefault true; package = lib.mkDefault pkgs.vscode; profiles.default.userSettings = lib.mkDefault { "update.mode" = "none"; "workbench.colorTheme" = themeConfig.name; "window.titleBarStyle" = "custom"; "editor.fontFamily" = "'${config.nomarchy.fonts.monospace}', 'Droid Sans Mono', monospace"; "terminal.integrated.fontFamily" = config.nomarchy.fonts.monospace; }; extensions = lib.mkDefault ( themeExtensions ++ lib.optionals config.nomarchy.vscode.devExtensions devExtensions ); }; }; }