From 86dc80eb3c35192b05cc2b95b7902bd9123b5f1f Mon Sep 17 00:00:00 2001 From: OlivierChiasson Date: Sun, 19 Jul 2026 18:13:30 -0300 Subject: [PATCH] feat(wisdom): enhance vscode module with java support and writable settings Add Java extension support and configure multiple JDK runtimes. Introduce a wrapped VS Code package that includes JDK 25 in the PATH to support the Red Hat Java language server. Switch from using `programs.vscode.userSettings` to a manually managed `settings.json` file via `home.file`. This allows the settings file to be writable by external tools like `kilo-code` at runtime while preserving them across Nix configuration switches by using `force = false`. --- modules/wisdom/editors/vscode.nix | 47 ++++++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/modules/wisdom/editors/vscode.nix b/modules/wisdom/editors/vscode.nix index 456d2a8..b8e6f30 100644 --- a/modules/wisdom/editors/vscode.nix +++ b/modules/wisdom/editors/vscode.nix @@ -12,8 +12,23 @@ jnoortheen.nix-ide yzhang.markdown-all-in-one esbenp.prettier-vscode + vscjava.vscode-java-pack + redhat.java ]; + # Wrap VS Code so a JDK is on PATH — the Red Hat Java language server (and + # other extension-bundled JVMs) need `java` to run, independent of the + # per-project `java.configuration.runtimes` setting. + vscodeWithJdk = pkgs.symlinkJoin { + name = "vscode-with-jdk"; + paths = [ pkgs.vscode ]; + nativeBuildInputs = [ pkgs.makeWrapper ]; + postBuild = '' + wrapProgram "$out/bin/code" \ + --prefix PATH : "${pkgs.jdk25}/bin" + ''; + }; + coreSettings = { "nix.enableLanguageServer" = true; "nix.serverPath" = "nixd"; @@ -26,7 +41,26 @@ }; "diffEditor.ignoreTrimWhitespace" = false; "chat.disableAIFeatures" = true; + + "java.configuration.runtimes" = [ + { + name = "JavaSE-21"; + path = "${pkgs.jdk21}/lib/openjdk"; + } + { + name = "JavaSE-25"; + path = "${pkgs.jdk25}/lib/openjdk"; + default = true; + } + ]; }; + + # Seed a *writable* settings.json (not a store symlink) so extensions like + # kilo-code can edit it at runtime. `force = false` in the config means HM + # only writes it when absent, preserving kilo's later edits across `switch`. + settingsJson = pkgs.writeText "vscode-user-settings" ( + builtins.toJSON coreSettings + ); in { options.chiasson.home.editors.vscode = { @@ -48,14 +82,19 @@ }; config = lib.mkIf (root.enable && cfg.enable) { - home.packages = [ pkgs.vscode ]; + home.packages = [ ]; + + # Writable, seed-once user settings (kilo-code can append to it). + home.file.".config/Code/User/settings.json" = { + source = settingsJson; + force = false; + }; programs.vscode = { enable = true; - package = pkgs.vscode; + package = vscodeWithJdk; extensions = defaultExtensions ++ cfg.extensions; - userSettings = coreSettings; }; }; }; -} + }