Awesome
Nix IDE
Adds Nix language support for Visual Studio Code.
Installation
Available on both the Visual Studio Marketplace and the Open VSX Registry.
You can also open the Command Palette (<kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>P</kbd> on Windows/Linux or <kbd>Cmd</kbd>+<kbd>Shift</kbd>+<kbd>P</kbd> on macOS) and enter ext install jnoortheen.nix-ide
to install the extension, or download it from the latest release.
Features
The basic language integration is supported out of the box using nixpkgs-fmt
and nix instantiate
.
It can be changed by setting nix.formatterPath
to any command which can accept file contents on stdin and return formatted text on stdout.
{
"nix.formatterPath": "nixpkgs-fmt"
// "nix.formatterPath": "nixfmt"
// "nix.formatterPath": ["treefmt", "--stdin", "{file}"]
// "nix.formatterPath": ["nix", "fmt", "--", "--"] // using flakes with `formatter = pkgs.alejandra;`
}
</details>
- Snippets are provided for conditional expressions,
let
expressions,with
expressions, andrec
ursive sets. - Path completion support using https://github.com/ChristianKohler/PathIntellisense extension
LSP Plugin Support
Full language support can be enabled by using a language server. Generally, any Nix LSP implementation should work.
The following have been tested so far:
{
"nix.enableLanguageServer": true,
"nix.serverPath": "nil",
// or
"nix.serverPath": "nixd"
}
<details>
<summary>Advanced settings </summary>
Pass settings to the language server via the serverSettings
option.
{
"nix.serverSettings": {
"nil": {
"diagnostics": {
"ignored": ["unused_binding", "unused_with"]
},
"formatting": {
"command": ["nixpkgs-fmt"]
}
}
}
}
{
"nix.serverSettings": {
"nixd": {
"formatting": {
"command": [ "nixpkgs-fmt" ]
},
"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"
}
}
}
}
}
</details>
Contributing
- Document the purpose of functions and classes.
- Please mention new features in the
README.md
features section. Use screenshots when applicable. - The Conventional Commits style should be used for commit messages as it is used to generate the changelog.
Development
There is direnv and nix-shell support so a dev environment can be created with the nix-shell
command or a one-time direnv allow
at the root of the repo.
Press F5
in VSCode to run an Extension Development Host instance with the extension installed.
TypeScript is used to develop the extension.
yarn install # install dependencies
yarn build # build the extension
Releasing a new version
Complete .env
with environment variables based on .env.template
,
# this will generate changelog and will create a GitHub release. This will also trigger jobs to publish the extension.
yarn release
# to manually publish the extension
yarn env-cmd && yarn publish
Credits
Special thanks to:
- @wmertens for writing the grammar.
- The vscode-fish extension, which was modified to work for Nix in this extension.