vscode中安装nixd需先确保系统存在nixd二进制,nixos/wsl用户须在configuration.nix或flake.nix中显式添加nixd包,并禁用vscode内置nix语法支持,同时配置正确nixpath与权限以避免启动失败。

VSCode里装nixd语言服务器,不是装个插件就完事
直接装 vscode-nix-ide 扩展确实能自动拉起 nixd,但前提是系统里得有可运行的 nixd 二进制。NixOS-WSL 或纯 NixOS 上默认不带它,得手动加进 environment.systemPackages 或用 nix develop 环境提供。
常见错误现象:扩展装了,打开 .nix 文件后右下角一直显示 “Nix: starting…” 卡住,或者报错 Failed to start nixd: command not found。
- 确认
nixd是否可用:终端里执行nixd --version,没输出就说明没装 - NixOS/WSL 用户在
configuration.nix中加:environment.systemPackages = with pkgs; [ nixd ]; - Flakes 用户可在
devShells里声明:packages = [ pkgs.nixd ];,再用nix develop进入环境 - 别依赖全局 PATH——如果用
code .启动 VSCode,确保它是从含nixd的 shell 启动的,否则插件找不到命令
settings.json 里要关掉 VSCode 自带的 Nix 语法高亮
VSCode 自带的 language-nix(内置语法)和 vscode-nix-ide 冲突,会导致括号匹配错乱、注释颜色异常、甚至 LSP 请求被拦截。
典型表现:with import <...> {}; </...> 里的 import 被标成变量名而非关键字;或保存时格式化完全失效。
- 在用户 settings.json 中显式禁用:
"files.associations": { "*.nix": "nix-ide" } - 同时关闭内置支持:
"nix-ide.disableBuiltInLanguage": true - 重启 VSCode(不是重载窗口),否则旧语法模式仍可能残留
nixd 需要访问 nix store 和 eval 权限,WSL 下容易被拦
NixOS-WSL 默认限制对 /nix/store 的读取权限,且 nixd 启动时会尝试 nix eval 检查表达式,若没权限就卡在初始化阶段。
错误日志常出现在 Output 面板 → “Nix Language Server” 标签页,内容类似:error: opening file '/nix/store/...': Permission denied 或 permission denied while evaluating。
- 确保 WSL 用户是
nixbld组成员:sudo usermod -aG nixbld $USER - 检查
/nix/store权限:ls -ld /nix/store应为drwxr-sr-x,组为nixbld - NixOS-WSL 用户需确认
wsl.enable = true;已启用,并重启 WSL:wsl --shutdown && wsl -d NixOS - 避免用
sudo code启动——这会让nixd以 root 身份运行,反而拿不到用户级 nix 配置
flake.nix 项目里改配置,别只改用户 settings.json
VSCode 的 Nix 插件行为高度依赖项目上下文。如果项目根目录有 flake.nix,但没声明 nixpkgs 输入或没设 nixPath,nixd 可能无法解析 <nixpkgs></nixpkgs> 引用,导致所有导入路径标红。
这不是插件 bug,而是 nixd 缺少求值所需的环境信息。
- 在
flake.nix的inputs里确保有nixpkgs:nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.05"; - 在
devShells输出中显式传入nixPath:env.NIX_PATH = "nixpkgs=${inputs.nixpkgs}"; - 如果用
vscode-with-extensions构建定制版 VSCode,必须把nixd和对应nixpkgs版本一起打包,否则跨机器打开会失配
最易忽略的一点:nixd 不读取 ~/.config/nix/nix.conf 里的 nixPath 设置,它只认启动时环境变量或 flake 显式注入的路径。项目级配置永远优先于用户级配置。











