oxalica/nil
{ "createdAt": "2022-07-19T08:55:08Z", "defaultBranch": "main", "description": "NIx Language server, an incremental analysis assistant for writing in Nix.", "fullName": "oxalica/nil", "homepage": "", "language": "Rust", "name": "nil", "pushedAt": "2025-12-10T00:33:51Z", "stargazersCount": 1805, "topics": [ "lsp-server", "nix", "nixos", "nixpkgs" ], "updatedAt": "2026-03-19T11:59:14Z", "url": "https://github.com/oxalica/nil"}nil: Nix Language server
Section titled “nil: Nix Language server”An incremental analysis assistant for writing in Nix.
See release notes for changelog between releases.
See [docs/features.md]!(docs/features.md) for an incomplete list of notable features currently
implemented or planned.
See [docs/configuration.md]!(docs/configuration.md) for all tunable configuration options.
Installation
Section titled “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.77
- Install nix >= 2.4 and make sure the binary
nixis in yourPATH. - Build and install via
cargo install --git https://github.com/oxalica/nil nil
Install with Flake
Section titled “Install with Flake”This 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
Section titled “Editor integration”Neovim native LSP and nvim-lspconfig
Section titled “Neovim native LSP and nvim-lspconfig”We are officially supported by nvim-lspconfig, see upstream docs, also [the example config for testing]!(dev/nvim-lsp.nix).
:warning: There is a known performance issue for semantic highlighting with neovim native LSP. See more details in https://github.com/oxalica/nil/issues/83
Vim/Neovim with coc.nvim
Section titled “Vim/Neovim with coc.nvim”Merge 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": ["nixfmt"] } // } // } } }}See [the example config for testing]!(dev/vim-coc.nix).
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'], \ })endifEmacs with lsp-mode
Section titled “Emacs with lsp-mode”Add 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 ["nixfmt"]))
(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.
Add the following elisp code to your configuration.
(use-package lsp-bridge :straight '(lsp-bridge :type git :host github :repo "manateelazycat/lsp-bridge" :files (:defaults "*.el" "*.py" "acm" "core" "langserver" "multiserver" "resources") :build (:not compile)) :init (global-lsp-bridge-mode) :config (setq lsp-bridge-nix-lsp-server "nil"))Emacs with eglot
Section titled “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
Section titled “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": ["nixfmt"] } // } // }}Add this to your “User Server Settings” in LSP Client configuration:
{ "servers": { "nix": { "command": ["nil"], "url": "https://github.com/oxalica/nil", "highlightingModeRegex": "^Nix$" } }}License
Section titled “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.