From d2e2521630eb5b7df3a7c43a0d616e281c40f783 Mon Sep 17 00:00:00 2001 From: Chris van der Loo Date: Mon, 24 Aug 2026 21:08:06 -0400 Subject: [PATCH] redo --- README.md | 28 +++++- config/fish/config.fish | 1 - config/fish/fish_variables | 2 - config/zed/AGENTS.md | 4 - config/zed/settings.json | 6 +- flake.nix | 161 ++++++++++++++++++++++--------- lib/default.nix | 114 ++++++++++++++++++++++ modules/darwin/default.nix | 14 ++- modules/home/base.nix | 19 ++++ modules/home/cloud.nix | 6 ++ modules/home/fish.nix | 21 ++-- modules/home/helix.nix | 83 ++++------------ modules/home/kubernetes.nix | 1 + modules/home/packages.nix | 43 --------- modules/home/starship.toml | 2 +- modules/hosts/mbp.nix | 41 -------- modules/hosts/pi.nix | 37 ------- modules/languages/astro.nix | 41 ++++++++ modules/languages/cpp.nix | 30 ++++++ modules/languages/csharp.nix | 29 ++++++ modules/languages/nix.nix | 24 +++++ modules/languages/python.nix | 39 ++++++++ modules/languages/rust.nix | 26 +++++ modules/languages/typescript.nix | 55 +++++++++++ templates/darwin-host/README.md | 16 +++ templates/darwin-host/flake.nix | 37 +++++++ 26 files changed, 623 insertions(+), 257 deletions(-) delete mode 120000 config/fish/config.fish delete mode 100644 config/fish/fish_variables create mode 100644 lib/default.nix create mode 100644 modules/home/base.nix create mode 100644 modules/home/cloud.nix delete mode 100644 modules/home/packages.nix delete mode 100644 modules/hosts/mbp.nix delete mode 100644 modules/hosts/pi.nix create mode 100644 modules/languages/astro.nix create mode 100644 modules/languages/cpp.nix create mode 100644 modules/languages/csharp.nix create mode 100644 modules/languages/nix.nix create mode 100644 modules/languages/python.nix create mode 100644 modules/languages/rust.nix create mode 100644 modules/languages/typescript.nix create mode 100644 templates/darwin-host/README.md create mode 100644 templates/darwin-host/flake.nix diff --git a/README.md b/README.md index 42fd2ef..bfb9ba8 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,29 @@ # dotfiles -My personal dotfiles repo. +Reusable nix-darwin and Home Manager components. Real hostnames, user details, +home directories, and VCS identity belong in a separate local host flake. + +Create a local Darwin host without cloning this repository: + +```sh +mkdir -p ~/Developer/dotfiles-host +cd ~/Developer/dotfiles-host +nix flake init -t github:chrisvander/dotfiles#darwin-host +``` + +The generated `flake.nix` selects modules from `homeManagerModules` and +language-specific toolchains and LSPs from `languageModules`. + +Build it with the published dotfiles revision: + +```sh +darwin-rebuild build --flake ~/Developer/dotfiles-host#default +``` + +While editing a local dotfiles checkout, override the published input: + +```sh +darwin-rebuild build \ + --flake ~/Developer/dotfiles-host#default \ + --override-input dotfiles path:$PWD +``` diff --git a/config/fish/config.fish b/config/fish/config.fish deleted file mode 120000 index 9145474..0000000 --- a/config/fish/config.fish +++ /dev/null @@ -1 +0,0 @@ -/nix/store/3vkx4vk6akgy6lx6z7dylh739m0asjrg-home-manager-files/.config/fish/config.fish \ No newline at end of file diff --git a/config/fish/fish_variables b/config/fish/fish_variables deleted file mode 100644 index 2037bd4..0000000 --- a/config/fish/fish_variables +++ /dev/null @@ -1,2 +0,0 @@ -SETUVAR --export CC_wasm32_unknown_unknown:/opt/homebrew/opt/llvm/bin/clang -SETUVAR RUSTC_WRAPPER:sccache diff --git a/config/zed/AGENTS.md b/config/zed/AGENTS.md index 067e48a..1c8b5fc 100644 --- a/config/zed/AGENTS.md +++ b/config/zed/AGENTS.md @@ -13,7 +13,3 @@ Always keep responses concise, to-the-point, and without additional follow-ups u ## Context You are a large language model inside of a code editor called "Zed". The reason I'm talking to you is primarily to figure out a problem inside of the repository I'm actively working on. - -## Me - -My name is Chris van der Loo. I am a software engineer. I work for the company "Bluefin Clinical", we make supply forecasting software for clinical supplies. I am the CTO of that company. diff --git a/config/zed/settings.json b/config/zed/settings.json index b9f5595..96f830f 100644 --- a/config/zed/settings.json +++ b/config/zed/settings.json @@ -26,7 +26,7 @@ "fast-mode": "off", "mode": "agent", "reasoning_effort": "medium", - "model": "gpt-5.6-terra" + "model": "gpt-5.6-sol" }, "favorite_config_option_values": { "reasoning_effort": ["medium", "low"], @@ -198,8 +198,8 @@ "CSharp": { "formatter": { "external": { - "command": "/Users/chrisvanderloo/.dotnet/tools/csharpier", - "arguments": ["format"] + "command": "sh", + "arguments": ["-c", "exec \"$HOME/.dotnet/tools/csharpier\" format"] } }, "format_on_save": "on" diff --git a/flake.nix b/flake.nix index a75377f..c728db1 100644 --- a/flake.nix +++ b/flake.nix @@ -1,5 +1,5 @@ { - description = "Chris's system flake"; + description = "Reusable system and user configuration"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-26.05-darwin"; @@ -10,52 +10,127 @@ home-manager.inputs.nixpkgs.follows = "nixpkgs"; }; - outputs = { self, nixpkgs, nixpkgs-unstable, nix-darwin, home-manager, ... }: { - # Build darwin flake using: - # $ darwin-rebuild build --flake .#mbp - darwinConfigurations.mbp = nix-darwin.lib.darwinSystem { - specialArgs = { inherit self nixpkgs-unstable; }; - modules = [ - home-manager.darwinModules.home-manager - ./modules/hosts/mbp.nix - ]; - }; - homeConfigurations.pi = home-manager.lib.homeManagerConfiguration { - pkgs = nixpkgs.legacyPackages.aarch64-linux; - extraSpecialArgs = { inherit nixpkgs-unstable; }; - modules = [ - ./modules/hosts/pi.nix - ]; - }; - devShells.aarch64-darwin = let pkgs = nixpkgs.legacyPackages.aarch64-darwin; in { - rust = pkgs.mkShellNoCC { - name = "rust"; - packages = with pkgs; [ - cargo - rustc - rustfmt - clippy - rust-analyzer - ]; + outputs = + inputs@{ self, nixpkgs, ... }: + let + dotfilesLib = import ./lib { + inherit (inputs) + home-manager + nix-darwin + nixpkgs + nixpkgs-unstable + ; + }; + + homeManagerModules = { + base = ./modules/home/base.nix; + cloud = ./modules/home/cloud.nix; + fish = ./modules/home/fish.nix; + ghostty = ./modules/home/ghostty.nix; + helix = ./modules/home/helix.nix; + kubernetes = ./modules/home/kubernetes.nix; + podman = ./modules/home/podman.nix; }; - js = pkgs.mkShellNoCC { - name = "js"; - packages = with pkgs; [ - bun - nodejs_26 - pnpm - typescript - ]; + languageModules = { + astro = ./modules/languages/astro.nix; + cpp = ./modules/languages/cpp.nix; + csharp = ./modules/languages/csharp.nix; + nix = ./modules/languages/nix.nix; + python = ./modules/languages/python.nix; + rust = ./modules/languages/rust.nix; + typescript = ./modules/languages/typescript.nix; }; - nix = pkgs.mkShellNoCC { - name = "nix"; - packages = with pkgs; [ - nil - nixd - ]; + exampleUser = { + username = "example"; + homeDirectory = "/Users/example"; + }; + exampleVcs = { + name = "Example User"; + email = "example@example.invalid"; + }; + exampleModules = builtins.attrValues homeManagerModules ++ builtins.attrValues languageModules; + in + { + lib = dotfilesLib; + inherit homeManagerModules languageModules; + + checks.aarch64-darwin = { + example = + (dotfilesLib.mkDarwin { + system = "aarch64-darwin"; + hostName = "example-host"; + darwinStateVersion = 6; + homeStateVersion = "26.05"; + user = exampleUser; + vcs = exampleVcs; + modules = exampleModules; + }).system; + + privacy = import ./checks/privacy.nix { + pkgs = nixpkgs.legacyPackages.aarch64-darwin; + source = self; + }; }; + + checks.aarch64-linux.example = + (dotfilesLib.mkHome { + system = "aarch64-linux"; + homeStateVersion = "26.05"; + user = { + username = "example"; + homeDirectory = "/home/example"; + }; + vcs = exampleVcs; + modules = [ + homeManagerModules.base + homeManagerModules.fish + homeManagerModules.helix + languageModules.nix + ]; + }).activationPackage; + + templates.darwin-host = { + path = ./templates/darwin-host; + description = "Local nix-darwin host using these dotfiles"; + }; + + devShells.aarch64-darwin = + let + pkgs = nixpkgs.legacyPackages.aarch64-darwin; + # nixpkgs still exposes TypeScript 7 under its former package name. + typescript = pkgs.typescript-go; + in + { + rust = pkgs.mkShellNoCC { + name = "rust"; + packages = with pkgs; [ + cargo + clippy + rust-analyzer + rustc + rustfmt + ]; + }; + + js = pkgs.mkShellNoCC { + name = "js"; + packages = [ + pkgs.bun + pkgs.nodejs_26 + pkgs.pnpm + typescript + ]; + }; + + nix = pkgs.mkShellNoCC { + name = "nix"; + packages = with pkgs; [ + nixd + nixfmt + ]; + }; + }; }; - }; } diff --git a/lib/default.nix b/lib/default.nix new file mode 100644 index 0000000..0391413 --- /dev/null +++ b/lib/default.nix @@ -0,0 +1,114 @@ +{ + home-manager, + nix-darwin, + nixpkgs, + nixpkgs-unstable, +}: +let + inherit (nixpkgs) lib; + + requireNonEmpty = field: value: if value == "" then throw "${field} must not be empty" else value; + + validateUser = { username, homeDirectory }: { + username = requireNonEmpty "user.username" username; + homeDirectory = + if lib.hasPrefix "/" homeDirectory then + homeDirectory + else + throw "user.homeDirectory must be an absolute path"; + }; + + validateVcs = + { + name, + email, + jjBookmarkPrefix ? null, + }: + { + name = requireNonEmpty "vcs.name" name; + email = requireNonEmpty "vcs.email" email; + inherit jjBookmarkPrefix; + }; +in +{ + mkDarwin = + { + system, + hostName, + darwinStateVersion, + homeStateVersion, + user, + vcs, + modules ? [ ], + darwinModules ? [ ], + source ? null, + }: + let + host = { + inherit system darwinStateVersion homeStateVersion; + hostName = requireNonEmpty "hostName" hostName; + user = validateUser user; + vcs = validateVcs vcs; + }; + in + nix-darwin.lib.darwinSystem { + specialArgs = { inherit host nixpkgs-unstable; }; + modules = [ + home-manager.darwinModules.home-manager + ../modules/darwin + ({ ... }: { + networking.hostName = host.hostName; + system.configurationRevision = + if source == null then null else source.rev or source.dirtyRev or null; + + home-manager = { + useGlobalPkgs = true; + useUserPackages = true; + backupFileExtension = "before-home-manager"; + extraSpecialArgs = { inherit host nixpkgs-unstable; }; + + users.${host.user.username} = { + imports = modules; + home.stateVersion = host.homeStateVersion; + xdg.enable = true; + programs.home-manager.enable = true; + }; + }; + }) + ] + ++ darwinModules; + }; + + mkHome = + { + system, + homeStateVersion, + user, + vcs, + modules ? [ ], + extraModules ? [ ], + }: + let + host = { + inherit system homeStateVersion; + user = validateUser user; + vcs = validateVcs vcs; + }; + in + home-manager.lib.homeManagerConfiguration { + pkgs = nixpkgs.legacyPackages.${host.system}; + extraSpecialArgs = { inherit host nixpkgs-unstable; }; + modules = [ + ({ ... }: { + imports = modules; + home = { + inherit (host.user) username homeDirectory; + stateVersion = host.homeStateVersion; + }; + xdg.enable = true; + programs.home-manager.enable = true; + }) + ] + ++ extraModules; + }; +} diff --git a/modules/darwin/default.nix b/modules/darwin/default.nix index eb7543e..78a6699 100644 --- a/modules/darwin/default.nix +++ b/modules/darwin/default.nix @@ -1,27 +1,25 @@ -{ pkgs, self, ... }: { +{ host, pkgs, ... }: { # Necessary for using flakes on this system. nix.settings.experimental-features = "nix-command flakes"; # Fish shell setup programs.fish.enable = true; environment.shells = [ pkgs.fish ]; - users.users.chrisvanderloo = { - home = "/Users/chrisvanderloo"; + users.users.${host.user.username} = { + home = host.user.homeDirectory; shell = pkgs.fish; }; - security.pam.services.sudo_local = { + security.pam.services.sudo_local = { # Enable Touch ID authentication for sudo touchIdAuth = true; }; # Set Git commit hash for darwin-version. - system.configurationRevision = self.rev or self.dirtyRev or null; - # Used for backwards compatibility, please read the changelog before changing. # $ darwin-rebuild changelog - system.stateVersion = 6; + system.stateVersion = host.darwinStateVersion; # The platform the configuration will be used on. - nixpkgs.hostPlatform = "aarch64-darwin"; + nixpkgs.hostPlatform = host.system; } diff --git a/modules/home/base.nix b/modules/home/base.nix new file mode 100644 index 0000000..6c9beab --- /dev/null +++ b/modules/home/base.nix @@ -0,0 +1,19 @@ +{ + pkgs, + nixpkgs-unstable, + lib, + ... +}: +let + unstable = import nixpkgs-unstable { + system = pkgs.stdenv.hostPlatform.system; + config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [ "1password-cli" ]; + }; +in +{ + home.packages = [ + pkgs.commitizen + pkgs.dust + unstable._1password-cli + ]; +} diff --git a/modules/home/cloud.nix b/modules/home/cloud.nix new file mode 100644 index 0000000..f2b02a6 --- /dev/null +++ b/modules/home/cloud.nix @@ -0,0 +1,6 @@ +{ pkgs, ... }: { + home.packages = with pkgs; [ + azure-cli + pulumi + ]; +} diff --git a/modules/home/fish.nix b/modules/home/fish.nix index 441457a..006e0fc 100644 --- a/modules/home/fish.nix +++ b/modules/home/fish.nix @@ -1,13 +1,17 @@ -{ pkgs, nixpkgs-unstable, lib, ... }: +{ + host, + pkgs, + nixpkgs-unstable, + lib, + ... +}: let starshipConfig = with builtins; fromTOML (readFile ./starship.toml); + jjBookmarkPrefix = lib.optionalString ( + host.vcs.jjBookmarkPrefix != null + ) " --strip-bookmark-prefix ${lib.escapeShellArg host.vcs.jjBookmarkPrefix}"; unstable = import nixpkgs-unstable { system = pkgs.stdenv.hostPlatform.system; - - config.allowUnfreePredicate = pkg: - builtins.elem (lib.getName pkg) [ - "1password-cli" - ]; }; in { @@ -104,6 +108,7 @@ in settings = lib.recursiveUpdate starshipConfig { add_newline = false; command_timeout = 1000; + custom.jj.command = "jj-starship --bookmarks-display-limit 2 --truncate-name 14${jjBookmarkPrefix} --no-git-prefix --no-jj-prefix --no-git-id"; fill = { symbol = " "; }; @@ -132,8 +137,8 @@ in package = unstable.jujutsu; settings = { user = { - email = "chris.vanderloo@icloud.com"; - name = "Chris van der Loo"; + email = host.vcs.email; + name = host.vcs.name; }; ui = { default-command = "log"; diff --git a/modules/home/helix.nix b/modules/home/helix.nix index cfc9f12..50b463f 100644 --- a/modules/home/helix.nix +++ b/modules/home/helix.nix @@ -1,35 +1,8 @@ -{ pkgs, ... }: -let - typescriptLanguage = name: extra: { - inherit name; - "language-servers" = [ - { - name = "typescript-language-server"; - "except-features" = [ "format" ]; - } - "biome" - ]; - indent = { - "tab-width" = 2; - unit = " "; - }; - "auto-format" = true; - } // extra; -in { +{ programs.helix = { enable = true; defaultEditor = true; - # Available only when Helix runs. - extraPackages = with pkgs; [ - typescript - typescript-language-server - tailwindcss-language-server - biome - astro-language-server - prettier - ]; - settings = { theme = "catppuccin_frappe"; @@ -54,9 +27,23 @@ in { lsp.display-messages = true; statusline = { - left = [ "mode" "spacer" "version-control" ]; - center = [ "file-name" "file-modification-indicator" "spinner" ]; - right = [ "diagnostics" "selections" "separator" "position" "file-type" ]; + left = [ + "mode" + "spacer" + "version-control" + ]; + center = [ + "file-name" + "file-modification-indicator" + "spinner" + ]; + right = [ + "diagnostics" + "selections" + "separator" + "position" + "file-type" + ]; mode = { normal = "NORMAL"; insert = "INSERT"; @@ -69,39 +56,5 @@ in { }; }; - languages = { - language-server = { - typescript-language-server = { - command = "${pkgs.typescript-language-server}/bin/typescript-language-server"; - args = [ "--stdio" ]; - }; - - astro-ls = { - command = "${pkgs.astro-language-server}/bin/astro-ls"; - args = [ "--stdio" ]; - config.typescript.tsdk = "${pkgs.typescript}/lib/node_modules/typescript/lib"; - }; - }; - - language = [ - { - name = "astro"; - scope = "source.astro"; - injection-regex = "astro"; - file-types = [ "astro" ]; - language-servers = [ "astro-ls" ]; - formatter = { - command = "prettier"; - args = [ "--plugin" "prettier-plugin-astro" "--parser" "astro" ]; - }; - auto-format = true; - } - (typescriptLanguage "typescript" { }) - (typescriptLanguage "tsx" { }) - (typescriptLanguage "jsx" { grammar = "javascript"; }) - (typescriptLanguage "javascript" { }) - (typescriptLanguage "json" { }) - ]; - }; }; } diff --git a/modules/home/kubernetes.nix b/modules/home/kubernetes.nix index baa88db..3dcf56b 100644 --- a/modules/home/kubernetes.nix +++ b/modules/home/kubernetes.nix @@ -6,6 +6,7 @@ }; programs.k9s.enable = true; home.packages = with pkgs; [ + kind kubectl ]; } diff --git a/modules/home/packages.nix b/modules/home/packages.nix deleted file mode 100644 index ab9f053..0000000 --- a/modules/home/packages.nix +++ /dev/null @@ -1,43 +0,0 @@ -{ pkgs, nixpkgs-unstable, lib, ... }: -let - unstable = import nixpkgs-unstable { - system = pkgs.stdenv.hostPlatform.system; - - config.allowUnfreePredicate = pkg: - builtins.elem (lib.getName pkg) [ - "1password-cli" - ]; - }; -in { - home.packages = with pkgs; [ - dust - dotnet-sdk_9 - pulumi - llvm - - # Python - uv - python3 - - commitizen - - # Node - nodejs_26 - azure-cli - pnpm - bun - - # TailwindCSS - tailwindcss-language-server - # TS - oxlint - oxfmt - typescript-go - typescript-language-server - - # Astro - astro-language-server - ] ++ [ - unstable._1password-cli - ]; -} diff --git a/modules/home/starship.toml b/modules/home/starship.toml index aa9d3d7..37a31a7 100644 --- a/modules/home/starship.toml +++ b/modules/home/starship.toml @@ -20,7 +20,7 @@ disabled = true disabled = true [custom.jj] -command = "jj-starship --bookmarks-display-limit 2 --truncate-name 14 --strip-bookmark-prefix \"chris/eng-\" --no-git-prefix --no-jj-prefix --no-git-id" +command = "jj-starship --bookmarks-display-limit 2 --truncate-name 14 --no-git-prefix --no-jj-prefix --no-git-id" shell = ["sh"] format = "$output " when = "jj-starship detect" diff --git a/modules/hosts/mbp.nix b/modules/hosts/mbp.nix deleted file mode 100644 index 9b3fa0f..0000000 --- a/modules/hosts/mbp.nix +++ /dev/null @@ -1,41 +0,0 @@ -{ nixpkgs-unstable, pkgs, ... }: { - imports = [ - ../darwin - ]; - - networking.hostName = "Chriss-MacBook-Pro-14"; - - home-manager = { - useGlobalPkgs = true; - useUserPackages = true; - backupFileExtension = "before-home-manager"; - - extraSpecialArgs = { inherit nixpkgs-unstable; }; - - users.chrisvanderloo = { - imports = [ - ../home/helix.nix - ../home/fish.nix - ../home/ghostty.nix - ../home/packages.nix - ../home/podman.nix - ../home/kubernetes.nix - ]; - - home.packages = with pkgs; [ - kind - - # Rust - cargo - rustc - rust-analyzer - rustfmt - clippy - ]; - - home.stateVersion = "26.05"; - xdg.enable = true; - programs.home-manager.enable = true; - }; - }; -} diff --git a/modules/hosts/pi.nix b/modules/hosts/pi.nix deleted file mode 100644 index ef2b494..0000000 --- a/modules/hosts/pi.nix +++ /dev/null @@ -1,37 +0,0 @@ -{ pkgs, ... }: { - imports = [ - ../home/fish.nix - ../home/helix.nix - ../home/packages.nix - ]; - - home = { - username = "chris"; - homeDirectory = "/home/chris"; - stateVersion = "26.05"; - }; - - nix = { - package = pkgs.nix; - settings = { - cores = 2; - max-jobs = 1; - http-connections = 8; - }; - }; - - programs.fish.plugins = [ - { - name = "nix-env"; - src = pkgs.fetchFromGitHub { - owner = "lilyball"; - repo = "nix-env.fish"; - rev = "7b65bd228429e852c8fdfa07601159130a818cfa"; - sha256 = "sha256-RG/0rfhgq6aEKNZ0XwIqOaZ6K5S4+/Y5EEMnIdtfPhk="; - }; - } - ]; - - xdg.enable = true; - programs.home-manager.enable = true; -} diff --git a/modules/languages/astro.nix b/modules/languages/astro.nix new file mode 100644 index 0000000..516e44e --- /dev/null +++ b/modules/languages/astro.nix @@ -0,0 +1,41 @@ +{ + config, + lib, + pkgs, + ... +}: +{ + imports = [ ./typescript.nix ]; + + home.packages = with pkgs; [ + astro-language-server + prettier + tailwindcss-language-server + ]; + + programs.helix.languages = lib.mkIf config.programs.helix.enable { + language-server.astro-ls = { + command = "${pkgs.astro-language-server}/bin/astro-ls"; + args = [ "--stdio" ]; + }; + language = [ + { + name = "astro"; + scope = "source.astro"; + injection-regex = "astro"; + file-types = [ "astro" ]; + language-servers = [ "astro-ls" ]; + formatter = { + command = "${pkgs.prettier}/bin/prettier"; + args = [ + "--plugin" + "prettier-plugin-astro" + "--parser" + "astro" + ]; + }; + auto-format = true; + } + ]; + }; +} diff --git a/modules/languages/cpp.nix b/modules/languages/cpp.nix new file mode 100644 index 0000000..bda7b56 --- /dev/null +++ b/modules/languages/cpp.nix @@ -0,0 +1,30 @@ +{ + config, + lib, + pkgs, + ... +}: +{ + home.packages = with pkgs; [ + clang-tools + llvm + ]; + + programs.helix.languages = lib.mkIf config.programs.helix.enable { + language-server.clangd.command = "${pkgs.clang-tools}/bin/clangd"; + language = [ + { + name = "c"; + language-servers = [ "clangd" ]; + formatter.command = "${pkgs.clang-tools}/bin/clang-format"; + auto-format = true; + } + { + name = "cpp"; + language-servers = [ "clangd" ]; + formatter.command = "${pkgs.clang-tools}/bin/clang-format"; + auto-format = true; + } + ]; + }; +} diff --git a/modules/languages/csharp.nix b/modules/languages/csharp.nix new file mode 100644 index 0000000..ef7ea6f --- /dev/null +++ b/modules/languages/csharp.nix @@ -0,0 +1,29 @@ +{ + config, + lib, + pkgs, + ... +}: +{ + home.packages = with pkgs; [ + csharpier + dotnet-sdk_9 + netcoredbg + omnisharp-roslyn + ]; + + programs.helix.languages = lib.mkIf config.programs.helix.enable { + language-server.omnisharp.command = "${pkgs.omnisharp-roslyn}/bin/OmniSharp"; + language = [ + { + name = "c-sharp"; + language-servers = [ "omnisharp" ]; + formatter = { + command = "${pkgs.csharpier}/bin/csharpier"; + args = [ "format" ]; + }; + auto-format = true; + } + ]; + }; +} diff --git a/modules/languages/nix.nix b/modules/languages/nix.nix new file mode 100644 index 0000000..121f099 --- /dev/null +++ b/modules/languages/nix.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: +{ + home.packages = with pkgs; [ + nixd + nixfmt + ]; + + programs.helix.languages = lib.mkIf config.programs.helix.enable { + language-server.nixd.command = "${pkgs.nixd}/bin/nixd"; + language = [ + { + name = "nix"; + language-servers = [ "nixd" ]; + formatter.command = "${pkgs.nixfmt}/bin/nixfmt"; + auto-format = true; + } + ]; + }; +} diff --git a/modules/languages/python.nix b/modules/languages/python.nix new file mode 100644 index 0000000..9a3a0f3 --- /dev/null +++ b/modules/languages/python.nix @@ -0,0 +1,39 @@ +{ + config, + lib, + pkgs, + ... +}: +{ + home.packages = with pkgs; [ + python3 + ruff + ty + uv + ]; + + programs.helix.languages = lib.mkIf config.programs.helix.enable { + language-server.ty.command = "${pkgs.ty}/bin/ty"; + language-server.ruff = { + command = "${pkgs.ruff}/bin/ruff"; + args = [ "server" ]; + }; + language = [ + { + name = "python"; + language-servers = [ + "ty" + "ruff" + ]; + formatter = { + command = "${pkgs.ruff}/bin/ruff"; + args = [ + "format" + "-" + ]; + }; + auto-format = true; + } + ]; + }; +} diff --git a/modules/languages/rust.nix b/modules/languages/rust.nix new file mode 100644 index 0000000..7145de8 --- /dev/null +++ b/modules/languages/rust.nix @@ -0,0 +1,26 @@ +{ + config, + lib, + pkgs, + ... +}: +{ + home.packages = with pkgs; [ + cargo + clippy + rust-analyzer + rustc + rustfmt + ]; + + programs.helix.languages = lib.mkIf config.programs.helix.enable { + language-server.rust-analyzer.command = "${pkgs.rust-analyzer}/bin/rust-analyzer"; + language = [ + { + name = "rust"; + language-servers = [ "rust-analyzer" ]; + auto-format = true; + } + ]; + }; +} diff --git a/modules/languages/typescript.nix b/modules/languages/typescript.nix new file mode 100644 index 0000000..86475eb --- /dev/null +++ b/modules/languages/typescript.nix @@ -0,0 +1,55 @@ +{ + config, + lib, + pkgs, + ... +}: +let + # nixpkgs still exposes TypeScript 7 under its former package name. + typescript = pkgs.typescript-go; + typescriptLanguage = + name: extra: + { + inherit name; + language-servers = [ + { + name = "typescript-language-server"; + except-features = [ "format" ]; + } + "biome" + ]; + indent = { + tab-width = 2; + unit = " "; + }; + auto-format = true; + } + // extra; +in +{ + home.packages = [ + pkgs.biome + pkgs.bun + pkgs.nodejs_26 + pkgs.oxfmt + pkgs.oxlint + pkgs.pnpm + typescript + pkgs.typescript-language-server + ]; + + programs.helix.languages = lib.mkIf config.programs.helix.enable { + language-server.typescript-language-server = { + command = "${pkgs.typescript-language-server}/bin/typescript-language-server"; + args = [ "--stdio" ]; + }; + language-server.biome.command = "${pkgs.biome}/bin/biome"; + language = [ + (typescriptLanguage "typescript" { }) + (typescriptLanguage "tsx" { }) + (typescriptLanguage "jsx" { grammar = "javascript"; }) + (typescriptLanguage "javascript" { }) + (typescriptLanguage "json" { }) + ]; + }; +} diff --git a/templates/darwin-host/README.md b/templates/darwin-host/README.md new file mode 100644 index 0000000..6503105 --- /dev/null +++ b/templates/darwin-host/README.md @@ -0,0 +1,16 @@ +# Local Darwin host + +Replace the example host and user values, then select the Home Manager and +language modules this computer needs. + +Build without activating: + +```sh +darwin-rebuild build --flake .#default +``` + +Activate after reviewing the build: + +```sh +darwin-rebuild switch --flake .#default +``` diff --git a/templates/darwin-host/flake.nix b/templates/darwin-host/flake.nix new file mode 100644 index 0000000..2da6338 --- /dev/null +++ b/templates/darwin-host/flake.nix @@ -0,0 +1,37 @@ +{ + description = "Local host configuration"; + + inputs.dotfiles.url = "github:chrisvander/dotfiles"; + + outputs = { self, dotfiles }: { + darwinConfigurations.default = dotfiles.lib.mkDarwin { + source = self; + system = "aarch64-darwin"; + hostName = "example-host"; + darwinStateVersion = 6; + homeStateVersion = "26.05"; + + user = { + username = "example"; + homeDirectory = "/Users/example"; + }; + + vcs = { + name = "Example User"; + email = "example@example.invalid"; + }; + + modules = + with dotfiles.homeManagerModules; + [ + base + fish + ghostty + helix + ] + ++ (with dotfiles.languageModules; [ + nix + ]); + }; + }; +} -- 2.51.2