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; }; }; }; -} + }