1
1
mirror of https://github.com/oxalica/nil.git synced 2024-09-11 18:47:13 +03:00
Yet another language server for Nix
Go to file
2022-09-22 21:47:46 +08:00
.github/workflows Add CI for flake-compat 2022-09-22 21:47:46 +08:00
crates Fix build and show hints when nix is not found 2022-09-22 21:30:19 +08:00
dev Impl LSP settings 2022-09-21 17:24:14 +08:00
.gitignore Add test environment for coc.nvim 2022-09-06 01:26:22 +08:00
Cargo.lock Generate builtins from Nix 2022-09-22 18:26:56 +08:00
Cargo.toml Refactor workspace layout 2022-09-06 01:54:33 +08:00
default.nix Flake-compat support 2022-09-22 21:30:27 +08:00
flake.lock Update flake and README 2022-09-22 21:30:27 +08:00
flake.nix Build and test all crates in drv 2022-09-22 21:38:55 +08:00
LICENSE-APACHE Licenses 2022-08-01 09:12:08 +08:00
LICENSE-MIT Licenses 2022-08-01 09:12:08 +08:00
README.md Update flake and README 2022-09-22 21:30:27 +08:00
rustfmt.toml Enforce merging of "use" stmts 2022-08-02 03:27:55 +08:00
shell.nix Flake-compat support 2022-09-22 21:30:27 +08:00

nil: Language server for Nix Expression Language

CI

🚧 This project is under development, but be happy to try it out!

Super fast incremental analysis! Scans all-packages.nix in less than 0.1s and completes with no delay!

Features

  • Goto definition. textDocument/definition
    • References to parameters, let and rec {} bindings.
    • Relative paths.
  • Find references. textDocument/reference
    • Parameters, let and rec {} bindings.
    • With expression.
  • Completion. textDocument/completion
    • Builtin names.
      • With documentations.
    • Local bindings and rec-attrset fields.
    • Keywords.
    • Attrset fields.
  • Diagnostics. textDocument/publishDiagnostics
    • Syntax errors.
      • Incomplete syntax errors are currently suppressed to avoid noisy outputs during typing.
    • Hard semantic errors reported as parse errors by Nix, like duplicated keys in attrsets.
    • Undefiend names.
    • Warnings of legacy syntax.
    • Warnings of unnecessary syntax.
    • Warnings of unused bindings, with and rec.
    • Client pulled diagnostics.
  • Expand selection. textDocument/selectionRange
  • Renaming. textDocument/renamme, textDocument/prepareRename
    • Identifiers in parameters and bindings, from let, rec and non-rec attrsets.
    • Static string literal bindings.
    • Merged path-value binding names.
    • Names introduced by inherit.
    • Names used by inherit.
    • Conflict detection.
    • Rename to string literals.
  • Semantic highlighting. textDocument/semanticTokens/{range,full}
    • Delta response. textDocument/semanticTokens/full/delta
    • ⚠️ Currently it has performance issue in large files with coc.nvim. vim would consume 100% CPU and is slow to respond when editing all-packages.nix. Though our LSP server's CPU usage is quite low. Other LSP clients are not tested.
  • Hover text. textDocument/hover.
    • Show kind of names.
    • Documentation for builtin names.
  • Cross-file analysis.
  • Multi-threaded.

Installation

This repo is packaged via Nix flakes, the language server binary package is available through the default flake output github:oxalica/nil# with the path bin/nil.

You can enable flakes support in your nix configuration, and then run nix profile install github:oxalica/nil to get nil installed. You can also use this repository as a flake input and add its output to your own flake-managed systemwide or home configuration.

Flake output structure:

├───devShells
│   └───(...)
└───packages
    ├───x86_64-linux
    │   ├───default: package 'nil-unstable-2022-08-04'
    │   └───nil: package 'nil-unstable-2022-08-04'
    └───(...)

Editor integration

Neovim native LSP and nvim-lspconfig

We are officially supported by nvim-lspconfig, see upstream docs.

Vim/Neovim via coc.nvim

Merge this setting into your coc-settings.json, which can be opened by :CocConfig.

{
  "languageserver": {
    "nix": {
      "command": "nil",
      "filetypes": ["nix"],
      "rootPatterns":  ["flake.nix"]
    }
  }
}

Emacs eglot

Add the following elisp code to your configuration. (using use-package)

(use-package nix-mode)
(use-package eglot
  :config
  ;; Ensure `nil` is in your PATH.
  (add-to-list 'eglot-server-programs '(nix-mode . ("nil")))
  :hook
  (nix-mode . eglot-ensure))

For vscode Nix IDE user

Modify the extension's settings in your settings.json

{
  // ...
  "nix.serverPath": "nil"
}

License

"nil" is primarily distributed under the terms of both the MIT license and the Apache License (Version 2.0).

See LICENSE-APACHE and LICENSE-MIT for details.