.github/workflows | ||
crates | ||
dev | ||
.gitignore | ||
Cargo.lock | ||
Cargo.toml | ||
default.nix | ||
flake.lock | ||
flake.nix | ||
LICENSE-APACHE | ||
LICENSE-MIT | ||
README.md | ||
rustfmt.toml | ||
shell.nix |
nil: Language server for Nix Expression Language
🚧 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
andrec {}
bindings. - Relative paths.
- References to parameters,
- Find references.
textDocument/reference
- Parameters,
let
andrec {}
bindings. - With expression.
- Parameters,
- Completion.
textDocument/completion
- Builtin names.
- With documentations.
- Local bindings and rec-attrset fields.
- Keywords.
- Attrset fields.
- Builtin names.
- 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
andrec
. - Client pulled diagnostics.
- Syntax errors.
- 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.
- Identifiers in parameters and bindings, from
- 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 editingall-packages.nix
. Though our LSP server's CPU usage is quite low. Other LSP clients are not tested.
- Delta response.
- 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.