nil: NIx Language server
An incremental analysis assistant for writing in Nix.
See release notes for changelog between releases.
See docs/features.md
for an incomplete list of notable features currently
implemented or planned.
See docs/configuration.md
for all tunable configuration options.
Installation
This program is available in NixOS/nixpkgs under attribute nil
,
and is regularly updated.
- 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 sure the binary
nix
is in yourPATH
. - Build and install via
cargo install --git https://github.com/oxalica/nil nil
Flake
Install withThis repo is also packaged via Nix flakes. The language server package is
available in the default flake output github:oxalica/nil#
, under bin/nil
.
To install, run nix profile install github:oxalica/nil
. Alternatively,
you can use this repository as a flake input, and add its output to your own flake-managed
system-wide and/or home configurations.
Disclaimer: The flake.lock
we ship is tested in CI. If you use follows
to
override flake inputs, we do not guarantee that it will build.
Flake output structure (not necessarily up-to-date):
├───devShells
│ └───(...)
└───packages
├───x86_64-linux
│ ├───default: package 'nil-unstable-2022-08-04'
│ └───nil: package 'nil-unstable-2022-08-04'
└───(...)
Editor integration
nvim-lspconfig
Neovim native LSP andWe are officially supported by nvim-lspconfig, see upstream docs, also the example config for testing.
coc.nvim
Vim/Neovim withMerge this setting into your coc-settings.json
(open with :CocConfig
).
{
"languageserver": {
"nix": {
"command": "nil",
"filetypes": ["nix"],
"rootPatterns": ["flake.nix"],
// Uncomment these to tweak settings.
// "settings": {
// "nil": {
// "formatting": { "command": ["nixpkgs-fmt"] }
// }
// }
}
}
}
See the example config for testing.
vim-lsp
Vim withAdd 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
lsp-mode
Emacs withAdd the following elisp code to your configuration. (using use-package
)
(use-package lsp-mode
:ensure t)
(use-package lsp-nix
:ensure lsp-mode
:after (lsp-mode)
:demand t
:custom
(lsp-nix-nil-formatter ["nixpkgs-fmt"]))
(use-package nix-mode
:hook (nix-mode . lsp-deferred)
:ensure t)
There are various other configurations to tweak. Refer to the specific manual page for more details.
eglot
Emacs withAdd 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))
Nix IDE
VSCode/VSCodium withModify 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"] }
// }
// }
}
LSP Client Plugin
Kate withAdd this to your "User Server Settings" in LSP Client configuration:
{
"servers": {
"nix": {
"command": ["nil"],
"url": "https://github.com/oxalica/nil",
"highlightingModeRegex": "^Nix$"
}
}
}
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.