Skip to content

nix-community/vscode-nix-ide

Repository files navigation

Nix IDE ✨💡🌟

Adds Nix language support for Visual Studio Code.

Quickstart 🚀

  1. Install the extension, and open a Nix file.
  2. Syntax highlighting should work out of the box. Nix code blocks inside markdown files are also supported.
  3. Auto-formatting should work if nixfmt or nixpkgs-fmt is available in $PATH. A custom formatter can be set by configuring nix.formatterPath.
  4. Syntax errors are linted using nix-instantiate.
  5. Full language support can be enabled by configuring a language server. See LSP Plugin Support for more information.
  6. Snippets are provided for conditional expressions, let/with expressions, and recursive sets.
  7. 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"
  // 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",
        },
      },
    }
  }
}

Custom Formatter

It can be changed by setting nix.formatterPath to any command which can accept file contents on stdin and return formatted text on stdout. If you are using an LSP server, then this configuration is not used.

{
    "nix.formatterPath": "nixfmt" // or "nixpkgs-fmt" or "alejandra" or "nix3-fmt" or pass full list of args such as  or `["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: