Nix ✨💡🌟
Adds Nix language support for Visual Studio Code.
Quickstart 🚀
- Install the extension, and open a Nix file.
- Syntax highlighting should work out of the box. Nix code blocks inside
markdown files are also supported.
- Auto-formatting should work if
nixfmt is available in $PATH. A custom formatter can be set by configuring nix.formatterPath.
- Syntax errors are linted using
nix-instantiate.
- Full language support can be enabled by configuring a language server. See LSP Plugin Support for more information.
- Snippets are provided for conditional expressions,
let/with expressions, and recursive sets.
- Path completion is supported using the Path Intellisense extension.
Settings ⚙️
LSP Plugin Support
Full language support can be enabled by using a language server. Generally, any Nix LSP implementation should work. Some examples are given below for nil and nixd.
{
"nix.enableLanguageServer": true,
"nix.serverPath": "nil", // or "nixd", or ["executable", "argument1", ...]
// LSP config can be passed via the ``nix.serverSettings.{lsp}`` as shown below.
"nix.serverSettings": {
// check https://github.com/oxalica/nil/blob/main/docs/configuration.md for all options available
"nil": {
// "diagnostics": {
// "ignored": ["unused_binding", "unused_with"],
// },
"formatting": {
"command": ["nixfmt"],
},
},
// check https://github.com/nix-community/nixd/blob/main/nixd/docs/configuration.md for all nixd config
"nixd": {
"formatting": {
"command": ["nixfmt"],
},
"options": {
// By default, this entry will be read from `import <nixpkgs> { }`.
// You can write arbitrary Nix expressions here, to produce valid "options" declaration result.
// Tip: for flake-based configuration, utilize `builtins.getFlake`
"nixos": {
"expr": "(builtins.getFlake \"/absolute/path/to/flake\").nixosConfigurations.<name>.options",
},
"home-manager": {
"expr": "(builtins.getFlake \"/absolute/path/to/flake\").homeConfigurations.<name>.options",
},
// Tip: use ${workspaceFolder} variable to define path
"nix-darwin": {
"expr": "(builtins.getFlake \"${workspaceFolder}/path/to/flake\").darwinConfigurations.<name>.options",
},
},
}
}
}
Home Manager integrated as a NixOS module
When Home Manager is integrated into a NixOS configuration, its options are
stored under that configuration instead of homeConfigurations. Configure
the home-manager option set like this:
{
"nix.serverSettings": {
"nixd": {
"options": {
"home-manager": {
"expr": "(builtins.getFlake (builtins.toString ./.)).nixosConfigurations.<name>.options.home-manager.users.type.getSubOptions []",
},
},
},
},
}
Replace <name> with the key of the matching nixosConfigurations entry.
It can be changed by setting nix.formatterPath to any command which can accept file contents on stdin and return formatted text on stdout.
[!IMPORTANT]
If you are using the above LSP plugin setting, then this configuration is not used.
{
"nix.formatterPath": "nixfmt" // or "alejandra"
// or pass full list of args like below
// "nix.formatterPath": ["treefmt", "--stdin", "{file}"]
}
Contributing 💪
We welcome contributions to this extension. Kindly start with any of open issues or feature requests.
See CONTRIBUTING.md for more information.
Credits
Special thanks to: