Skip to content
Oeiuwq Faith Blog OpenSource Porfolio

oxalica/nil

NIx Language server, an incremental analysis assistant for writing in Nix.

oxalica/nil.json
{
"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"
}

CI

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.

This program is available in NixOS/nixpkgs under attribute nil, and is regularly updated.

  • If you use nix-env, run nix-env -iA nixpkgs.nil
  • If you use nix profile, run nix profile install nixpkgs#nil
  • If you want to compile it from source:
    1. Install stable Rust toolchain >= 1.77
    2. Install nix >= 2.4 and make sure the binary nix is in your PATH.
    3. Build and install via cargo install --git https://github.com/oxalica/nil nil

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'
└───(...)

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

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'],
\ })
endif

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"))

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))

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$"
}
}
}

“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.