.github/workflows | ||
crates | ||
dev | ||
docs | ||
.gitignore | ||
Cargo.lock | ||
Cargo.toml | ||
default.nix | ||
flake.lock | ||
flake.nix | ||
LICENSE-APACHE | ||
LICENSE-MIT | ||
README.md | ||
rustfmt.toml | ||
shell.nix |
nil: Yet another language server for Nix
🚧 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
See release notes for change log between tagged unstable versions.
See docs/features.md
for an incomplete list of notable features currently
implemented or planned.
Installation
This program is already included in NixOS/nixpkgs under attribute nil
,
and are regularly updated.
Note: This package requires a relatively new version of Rust to compile.
You need at least nixpkgs-unstable
to build it.
- If you use
nix-env
, runnix-env -iA nixpkgs.nil
- If you use
nix profile
, runnix profile install nixpkgs#nil
- If you want to compile it from source.
- Install stable Rust toolchain >= 1.62
- Install
nix
>= 2.4 and make the binarynix
available from yourPATH
. - Build and install via
cargo install --git https://github.com/oxalica/nil nil
Flake
This repo is also 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.
See also the example config for testing.
Vim/Neovim with 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"],
// Uncomment these to tweak settings.
// "settings": {
// "nil": {
// "formatting": { "command": ["nixpkgs-fmt"] }
// }
// }
}
}
}
See also the example config for testing.
Vim with vim-lsp
Add the following code to your vimrc
to register the LSP server.
Thanks @mitchmindtree
if executable('nil')
autocmd User lsp_setup call lsp#register_server({
\ 'name': 'nil',
\ 'cmd': {server_info->['nil']},
\ 'whitelist': ['nix'],
\ })
endif
Emacs with 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))
Vscode/Vscodium with Nix IDE
Modify the extension's settings in your settings.json
.
{
"nix.enableLanguageServer": true, // Enable LSP.
"nix.serverPath": "nil" // The path to the LSP server executable.
// Uncomment these to tweak settings.
// "nix.serverSettings": {
// "nil": {
// "formatting": { "command": ["nixpkgs-fmt"] }
// }
// }
}
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.