summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorLuo Chen <[email protected]>2025-12-22 14:30:08 +0800
committerGitHub <[email protected]>2025-12-22 00:30:08 -0600
commitac4b8d62e3072549545a655f9098138828dbad30 (patch)
treef41ace8d65a8c09cde65c264307bd0ba3eff6362
parent236ce7a8c05cc2a6a31b0fa82ebabfa81853d35b (diff)
downloadopencode-ac4b8d62e3072549545a655f9098138828dbad30.tar.gz
opencode-ac4b8d62e3072549545a655f9098138828dbad30.zip
feat: add nixd as lsp for nix language (#5929)
-rw-r--r--packages/opencode/src/lsp/language.ts1
-rw-r--r--packages/opencode/src/lsp/server.ts31
-rw-r--r--packages/web/src/content/docs/lsp.mdx1
3 files changed, 33 insertions, 0 deletions
diff --git a/packages/opencode/src/lsp/language.ts b/packages/opencode/src/lsp/language.ts
index d95966d39..12792c7c2 100644
--- a/packages/opencode/src/lsp/language.ts
+++ b/packages/opencode/src/lsp/language.ts
@@ -110,4 +110,5 @@ export const LANGUAGE_EXTENSIONS: Record<string, string> = {
".tf": "terraform",
".tfvars": "terraform-vars",
".hcl": "hcl",
+ ".nix": "nix",
} as const
diff --git a/packages/opencode/src/lsp/server.ts b/packages/opencode/src/lsp/server.ts
index 0551808ac..9390259a8 100644
--- a/packages/opencode/src/lsp/server.ts
+++ b/packages/opencode/src/lsp/server.ts
@@ -1746,4 +1746,35 @@ export namespace LSPServer {
}
},
}
+
+ export const Nixd: Info = {
+ id: "nixd",
+ extensions: [".nix"],
+ root: async (file) => {
+ // First, look for flake.nix - the most reliable Nix project root indicator
+ const flakeRoot = await NearestRoot(["flake.nix"])(file)
+ if (flakeRoot && flakeRoot !== Instance.directory) return flakeRoot
+
+ // If no flake.nix, fall back to git repository root
+ if (Instance.worktree && Instance.worktree !== Instance.directory) return Instance.worktree
+
+ // Finally, use the instance directory as fallback
+ return Instance.directory
+ },
+ async spawn(root) {
+ const nixd = Bun.which("nixd")
+ if (!nixd) {
+ log.info("nixd not found, please install nixd first")
+ return
+ }
+ return {
+ process: spawn(nixd, [], {
+ cwd: root,
+ env: {
+ ...process.env,
+ },
+ }),
+ }
+ },
+ }
}
diff --git a/packages/web/src/content/docs/lsp.mdx b/packages/web/src/content/docs/lsp.mdx
index 6572574f2..df97dc3ff 100644
--- a/packages/web/src/content/docs/lsp.mdx
+++ b/packages/web/src/content/docs/lsp.mdx
@@ -26,6 +26,7 @@ OpenCode comes with several built-in LSP servers for popular languages:
| gopls | .go | `go` command available |
| jdtls | .java | `Java SDK (version 21+)` installed |
| lua-ls | .lua | Auto-installs for Lua projects |
+| nixd | .nix | `nixd` command available |
| ocaml-lsp | .ml, .mli | `ocamllsp` command available |
| oxlint | .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts, .vue, .astro, .svelte | `oxlint` dependency in project |
| php intelephense | .php | Auto-installs for PHP projects |