2022-08-04 10:53:05 +03:00
nil: Language server for Nix Expression Language
2022-08-01 04:31:10 +03:00
2022-08-02 07:03:47 +03:00
🚧 *This project is under development, but be happy to try it out!*
2022-08-05 14:01:45 +03:00
Super fast incremental analysis! Scans `all-packages.nix` in less than 0.1s and completes with no delay!
2022-08-02 07:03:47 +03:00
## Features
- [x] Goto definition. `textDocument/definition`
2022-09-05 16:51:02 +03:00
- [x] References to parameters, `let` and `rec {}` bindings.
- [x] Relative paths.
2022-08-02 07:03:47 +03:00
- [x] Find references. `textDocument/reference`
2022-09-05 16:51:02 +03:00
- [x] Parameters, `let` and `rec {}` bindings.
- [x] With expression.
2022-08-02 07:03:47 +03:00
- [x] Completion. `textDocument/completion`
- [x] Builtin names.
2022-08-09 02:25:57 +03:00
- [x] Local bindings and rec-attrset fields.
- [x] Keywords.
2022-08-02 07:03:47 +03:00
- [ ] Attrset fields.
2022-08-05 13:39:16 +03:00
- [x] Diagnostics. `textDocument/publishDiagnostics`
- Syntax errors.
- Incomplete syntax errors are currently suppressed to avoid noisy outputs during typing.
- [x] Hard semantic errors reported as parse errors by Nix, like duplicated keys in attrsets.
2022-08-17 19:52:46 +03:00
- [x] Undefiend names.
2022-08-06 19:13:54 +03:00
- [x] Warnings of legacy syntax.
2022-08-07 01:25:52 +03:00
- [x] Warnings of unnecessary syntax.
2022-08-09 00:02:25 +03:00
- [x] Warnings of unused bindings, `with` and `rec` .
2022-08-05 13:39:16 +03:00
- [ ] Client pulled diagnostics.
2022-09-05 18:50:43 +03:00
- [x] Expand selection. `textDocument/selectionRange`
2022-09-06 03:46:11 +03:00
- [x] Renaming. `textDocument/renamme` , `textDocument/prepareRename`
- [x] Identifiers in parameters and bindings, from `let` , rec and non-rec attrsets.
- [x] Static string literal bindings.
- [x] Merged path-value binding names.
- [ ] Names introduced by `inherit` .
- [ ] Names used by `inherit` .
- [ ] Conflict detection.
2022-09-06 04:00:15 +03:00
- [x] Rename to string literals.
2022-09-12 01:25:33 +03:00
- [x] Semantic highlighting. `textDocument/semanticTokens/{range,full}`
- [ ] Delta response. `textDocument/semanticTokens/full/delta`
- :warning: Currently it has performance issue in large files with [`coc.nvim`].
`vim` would consume 100% CPU and is slow to respond when editing `all-packages.nix` .
Though our LSP server's CPU usage is quite low.
Other LSP clients are not tested.
2022-08-02 07:03:47 +03:00
- [ ] Cross-file analysis.
- [ ] Multi-threaded.
2022-08-01 04:31:10 +03:00
## Installation
2022-08-04 10:53:05 +03:00
This repo is packaged via [Nix flakes][nix-flakes], the language server binary package is
available through the default flake output `github:oxalica/nil#` with the path `bin/nil` .
2022-08-05 14:01:45 +03:00
You can [enable flakes support][nix-flakes-install] 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.
2022-08-04 10:53:05 +03:00
Flake output structure:
```
├───devShells
│ └───(...)
└───packages
├───x86_64-linux
│ ├───default: package 'nil-unstable-2022-08-04'
│ └───nil: package 'nil-unstable-2022-08-04'
└───(...)
```
[nix-flakes]: https://nixos.wiki/wiki/Flakes
2022-08-05 14:01:45 +03:00
[nix-flakes-install]: https://nixos.wiki/wiki/Flakes#Installing_flakes
2022-08-01 04:31:10 +03:00
2022-09-05 16:51:02 +03:00
## Editor integration
2022-08-01 04:31:10 +03:00
2022-09-05 16:51:02 +03:00
### Neovim native LSP and [`nvim-lspconfig`]
2022-08-01 04:31:10 +03:00
2022-09-05 16:51:02 +03:00
[`nvim-lspconfig`]: https://github.com/neovim/nvim-lspconfig
We are officially supported by `nvim-lspconfig` , see [upstream docs ](https://github.com/neovim/nvim-lspconfig/blob/0fafc3ef648bd612757630097c96b725a36a0476/doc/server_configurations.txt#nil_ls ).
### Vim/Neovim via [`coc.nvim`]
[`coc.nvim`]: https://github.com/neoclide/coc.nvim
Merge this setting into your `coc-settings.json` , which can be opened by `:CocConfig` .
```json
{
"languageserver": {
"nix": {
"command": "nil",
"filetypes": ["nix"],
"rootPatterns": ["flake.nix"]
}
2022-08-01 04:31:10 +03:00
}
2022-09-05 16:51:02 +03:00
}
2022-08-01 04:31:10 +03:00
```
2022-09-05 16:51:02 +03:00
### Emacs [`eglot`]
[`eglot`]: https://github.com/joaotavora/eglot
2022-08-05 14:01:45 +03:00
Add the following elisp code to your configuration. (using `use-package` )
```elisp
(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))
```
2022-08-01 04:31:10 +03:00
## 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.