2021-04-05 14:58:52 +01:00
![Zig Language Server ](./.github/assets/zls.svg )
2021-05-04 02:13:10 +01:00
[![CI ](https://github.com/zigtools/zls/workflows/CI/badge.svg )](https://github.com/zigtools/zls/actions)
2021-04-05 14:58:52 +01:00
![Zig Tools ](./.github/assets/zigtools.svg )
2022-07-15 13:51:36 +01:00
**Need support? Wanna help out? Join our [Discord server ](https://discord.gg/5m5U3qpUhk )!**
2021-04-05 14:58:52 +01:00
Zig Language Server, or `zls` , is a language server for Zig. The Zig wiki states that "The Zig community is decentralized" and "There is no concept of 'official' or 'unofficial'", so instead of calling `zls` unofficial, and I'm going to call it a cool option, one of [many ](https://github.com/search?q=zig+language+server ).
<!-- omit in toc -->
## Table Of Contents
- [Installation ](#installation )
2022-07-08 09:13:46 +01:00
- [Installing binaries ](#installing-binaries )
- [MacOS ](#macos )
- [Linux ](#linux )
- [From Source ](#from-source )
- [Build Options ](#build-options )
- [Updating Data Files ](#updating-data-files )
2021-04-05 14:58:52 +01:00
- [Configuration Options ](#configuration-options )
2022-07-08 09:13:46 +01:00
- [Features ](#features )
2022-08-21 16:33:28 +01:00
- [VS Code ](#vs-code )
2021-11-20 23:22:36 +00:00
- [Sublime Text ](#sublime-text )
2022-07-08 09:13:46 +01:00
- [Sublime Text 3 ](#sublime-text-3 )
- [Sublime Text 4 ](#sublime-text-4 )
2021-04-05 14:58:52 +01:00
- [Kate ](#kate )
- [Neovim/Vim8 ](#neovimvim8 )
2022-07-08 09:13:46 +01:00
- [CoC ](#coc )
- [YouCompleteMe ](#youcompleteme )
- [nvim-lspconfig ](#nvim-lspconfig )
- [LanguageClient-neovim ](#languageclient-neovim )
2021-04-05 14:58:52 +01:00
- [Emacs ](#emacs )
- [Doom Emacs ](#doom-emacs )
2022-07-08 09:13:46 +01:00
- [Spacemacs ](#spacemacs )
2021-04-05 14:58:52 +01:00
- [Related Projects ](#related-projects )
- [License ](#license )
## Installation
2021-05-13 14:01:51 +01:00
Installation starts with downloading an official release from the [Releases page ](https://github.com/zigtools/zls/releases ).
2021-05-04 02:13:10 +01:00
Up to date builds from master branch are also available in the [latest successful CI run ](https://github.com/zigtools/zls/actions ), contained in the `builds` artifact.
2021-04-05 14:58:52 +01:00
See [Downloading and Building ZLS ](https://github.com/zigtools/zls/wiki/Downloading-and-Building-ZLS ) on the Wiki, or the page about [using ZLS with Visual Studio Code ](https://github.com/zigtools/zls/wiki/Installing-for-Visual-Studio-Code ) for a guide to help get `zls` running in your editor.
### Installing binaries
#### MacOS
You can install the latest release into `$HOME/zls` using e.g.:
```sh
brew install xz
2022-01-01 03:00:42 +00:00
mkdir $HOME/zls & & cd $HOME/zls & & curl -L https://github.com/zigtools/zls/releases/download/0.9.0/x86_64-macos.tar.xz | tar -xJ --strip-components=1 -C .
2021-04-05 14:58:52 +01:00
```
#### Linux
You can install the latest release into `$HOME/zls` using e.g.:
2022-02-15 00:20:17 +00:00
```bash
2021-04-05 14:58:52 +01:00
sudo apt install xz-utils
2022-01-01 03:00:42 +00:00
mkdir $HOME/zls & & cd $HOME/zls & & curl -L https://github.com/zigtools/zls/releases/download/0.9.0/x86_64-linux.tar.xz | tar -xJ --strip-components=1 -C .
2021-04-05 14:58:52 +01:00
```
### From Source
Building `zls` is very easy. You will need [a build of Zig master ](https://ziglang.org/download/ ) to build zls.
```bash
git clone --recurse-submodules https://github.com/zigtools/zls
cd zls
zig build -Drelease-safe
2021-05-13 14:01:51 +01:00
./zig-out/bin/zls config # Configure ZLS
2021-04-05 14:58:52 +01:00
```
*For detailed building instructions, see the Wiki page about [Cloning With Git ](https://github.com/zigtools/zls/wiki/Downloading-and-Building-ZLS#cloning-with-git ).*
#### Build Options
<!-- When updating this table, be sure to copy changes to the Wiki page about building from source. -->
<!-- If this table grows too large, then delete this one and move it all over to the Wiki page about building from source. -->
| Option | Type | Default Value | What it Does |
| --- | --- | --- | --- |
2022-02-15 00:20:17 +00:00
| `-Ddata_version` | `string` (like 0.7.1 or 0.9.0) | master | The data file version. This selects the files in the `src/data` folder that correspond to the Zig version being served.|
2021-04-05 14:58:52 +01:00
2021-07-10 14:21:54 +01:00
#### Updating Data Files
There is a `generate-data.py` in the `src/data` folder, run this file to update data files.
It writes to stdout and you can redirect output to a zig file like `master.zig` . By default it generates data file for `master` , but can be configured to generate for a different version by modifying the `zig_version` variable. Files generated by this tool **contains** formatting information.
There is also a `generate-data.js` in the `src/data` folder, you'll need to run this inside a Chrome DevTools console and copy the output. Files generated by this tool **does not contain** formatting information.
2021-04-05 14:58:52 +01:00
### Configuration Options
2021-05-13 14:01:51 +01:00
You can configure zls by running `zls config` or manually creating your own `zls.json` configuration file.
zls will look for a zls.json configuration file in multiple locations with the following priority:
2021-06-24 06:59:03 +01:00
- In the local configuration folder of your OS (as provided by [known-folders ](https://github.com/ziglibs/known-folders/blob/master/RESOURCES.md#folder-list ))
- In the global configuration folder of your OS (as provided by [known-folders ](https://github.com/ziglibs/known-folders/blob/master/RESOURCES.md#folder-list ))
2021-04-05 14:58:52 +01:00
2021-05-13 14:01:51 +01:00
The following options are currently available.
2021-04-05 14:58:52 +01:00
| Option | Type | Default value | What it Does |
| --- | --- | --- | --- |
| `enable_snippets` | `bool` | `false` | Enables snippet completions when the client also supports them. |
2022-07-08 09:13:46 +01:00
| `enable_unused_variable_warnings` | `bool` | `false` | Enables warnings for local variables that aren't used. |
2022-07-09 10:22:02 +01:00
| `enable_import_embedfile_argument_completions` | `bool` | `false` | Whether to enable import/embedFile argument completions |
2021-04-05 14:58:52 +01:00
| `zig_lib_path` | `?[]const u8` | `null` | zig library path, e.g. `/path/to/zig/lib/zig` , used to analyze std library imports. |
| `zig_exe_path` | `?[]const u8` | `null` | zig executable path, e.g. `/path/to/zig/zig` , used to run the custom build runner. If `null` , zig is looked up in `PATH` . Will be used to infer the zig standard library path if none is provided. |
| `warn_style` | `bool` | `false` | Enables warnings for style *guideline* mismatches |
| `build_runner_path` | `?[]const u8` | `null` | Path to the build_runner.zig file provided by zls. `null` is equivalent to `${executable_directory}/build_runner.zig` |
2022-08-18 22:14:32 +01:00
| `global_cache_path` | `?[]const u8` | `null` | Path to a directroy that will be used as zig's cache. `null` is equivalent to `${KnownFloders.Cache}/zls` |
2021-04-05 14:58:52 +01:00
| `enable_semantic_tokens` | `bool` | `true` | Enables semantic token support when the client also supports it. |
2022-07-24 12:38:13 +01:00
| `enable_inlay_hints` | `bool` | `false` | Enables inlay hint support when the client also supports it. |
2021-04-05 14:58:52 +01:00
| `operator_completions` | `bool` | `true` | Enables `*` and `?` operators in completion lists. |
2022-02-15 00:20:17 +00:00
|`include_at_in_builtins`|`bool`|`false`| Whether the @ sign should be part of the completion of builtins.
|`max_detail_length`|`usize`|`1024 * 1024`| The detail field of completions is truncated to be no longer than this (in bytes).
2021-04-05 14:58:52 +01:00
| `skip_std_references` | `bool` | `false` | When true, skips searching for references in std. Improves lookup speed for functions in user's code. Renaming and go-to-definition will continue to work as is.
## Features
2022-02-15 00:20:17 +00:00
`zls` supports most language features, including simple type function support, using namespace, payload capture type resolution, custom packages and others.
2021-05-13 14:01:51 +01:00
Notable language features that are not currently implemented include `@cImport` as well as most forms of compile time evaluation.
2021-04-05 14:58:52 +01:00
2021-05-13 14:01:51 +01:00
The following LSP features are supported:
2021-04-05 14:58:52 +01:00
- Completions
- Hover
- Goto definition/declaration
- Document symbols
- Find references
- Rename symbol
- Formatting using `zig fmt`
2022-07-24 16:01:05 +01:00
- Semantic token highlighting (implemented by a few clients including VS Code, kak and emacs lsp-mode)
- Inlay hints (implemented by VS Code)
2021-04-05 14:58:52 +01:00
2021-05-13 14:01:51 +01:00
You can install `zls` using the instuctions for your text editor below:
2021-04-05 14:58:52 +01:00
2022-07-24 16:01:05 +01:00
### VS Code
2021-04-05 14:58:52 +01:00
2022-07-24 16:01:05 +01:00
Install the `zls-vscode` extension from [here ](https://github.com/zigtools/zls-vscode/releases ) or via the extensions menu.
It will install `zls` if it is not found in your `PATH`
2021-04-05 14:58:52 +01:00
2021-11-02 09:50:14 +00:00
### Sublime Text
2021-04-05 14:58:52 +01:00
- Install the `LSP` package from [here ](https://github.com/sublimelsp/LSP/releases ) or via Package Control.
- Add this snippet to `LSP's` user settings:
2022-07-08 09:13:46 +01:00
#### Sublime Text 3
2021-11-02 09:50:14 +00:00
2021-04-05 14:58:52 +01:00
```json
{
"clients": {
2021-11-02 09:50:14 +00:00
"zig": {
2021-04-05 14:58:52 +01:00
"command": ["zls"],
"enabled": true,
"languageId": "zig",
"scopes": ["source.zig"],
"syntaxes": ["Packages/Zig Language/Syntaxes/Zig.tmLanguage"]
}
}
}
```
2022-07-08 09:13:46 +01:00
#### Sublime Text 4
2021-11-02 09:50:14 +00:00
```json
{
"clients": {
"zig": {
"command": ["zls"],
"enabled": true,
"selector": "source.zig"
}
}
}
```
2021-04-05 14:58:52 +01:00
### Kate
2022-04-14 10:49:27 +01:00
- Install language support for Zig from [here ](https://github.com/ziglang/kde-syntax-highlighting )
2021-04-05 14:58:52 +01:00
- Enable `LSP client` plugin in Kate settings.
- Add this snippet to `LSP client's` user settings (e.g. /$HOME/.config/kate/lspclient)
(or paste it in `LSP client's` GUI settings)
```json
{
"servers": {
"zig": {
"command": ["zls"],
"url": "https://github.com/zigtools/zls",
"highlightingModeRegex": "^Zig$"
}
}
}
```
### Neovim/Vim8
#### CoC
- Install the CoC engine from [here ](https://github.com/neoclide/coc.nvim ).
2022-07-23 08:56:01 +01:00
Then choose one of the following two ways
1. Use extension
Run `:CocInstall coc-zls` to install [coc-zls ](https://github.com/xiyaowong/coc-zls ),
2022-07-24 16:01:05 +01:00
this extension supports the same functionality as the VS Code extension
2022-07-23 08:56:01 +01:00
2. Manually register
```json
{
"languageserver": {
"zls" : {
"command": "command_or_path_to_zls",
"filetypes": ["zig"]
}
2021-04-05 14:58:52 +01:00
}
2022-07-23 08:56:01 +01:00
}
```
2021-04-05 14:58:52 +01:00
#### YouCompleteMe
- Install YouCompleteMeFrom [here ](https://github.com/ycm-core/YouCompleteMe.git ).
- Add these lines to your vimrc:
```vim
"ensure zig is a recognized filetype
autocmd BufNewFile,BufRead *.zig set filetype=zig
2021-05-13 14:01:51 +01:00
let g:ycm_language_server =
\ [
2021-04-05 14:58:52 +01:00
\{
\ 'name': 'zls',
\ 'filetypes': [ 'zig' ],
\ 'cmdline': [ '/path/to/zls_executable' ]
\ }
\ ]
```
#### nvim-lspconfig
Requires Nvim 0.5 (HEAD)!
- Install nvim-lspconfig from [here ](https://github.com/neovim/nvim-lspconfig ).
- Install zig.vim from [here ](https://github.com/ziglang/zig.vim ).
nvim-lspconfig already ships a configuration for zls. A simple `init.vim` might look like this:
```vim
call plug#begin('~/.config/nvim/plugged')
Plug 'neovim/nvim-lspconfig'
Plug 'nvim-lua/completion-nvim'
Plug 'ziglang/zig.vim'
call plug#end()
:lua < < EOF
local lspconfig = require('lspconfig')
local on_attach = function(_, bufnr)
vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc')
require('completion').on_attach()
end
local servers = {'zls'}
2021-05-13 14:01:51 +01:00
for _, lsp in ipairs(servers) do
2021-04-05 14:58:52 +01:00
lspconfig[lsp].setup {
on_attach = on_attach,
}
end
EOF
" Set completeopt to have a better completion experience
set completeopt=menuone,noinsert,noselect
" Enable completions as you type
let g:completion_enable_auto_popup = 1
```
#### LanguageClient-neovim
- Install the LanguageClient-neovim from [here ](https://github.com/autozimu/LanguageClient-neovim )
- Edit your neovim configuration and add `zls` for zig filetypes:
```vim
let g:LanguageClient_serverCommands = {
2021-05-13 14:01:51 +01:00
\ 'zig': ['~/code/zls/zig-out/bin/zls'],
2021-04-05 14:58:52 +01:00
\ }
```
### Emacs
- Install [lsp-mode ](https://github.com/emacs-lsp/lsp-mode ) from melpa
- [zig mode ](https://github.com/ziglang/zig-mode ) is also useful
```elisp
;; Setup lsp-mode as desired.
;; See https://emacs-lsp.github.io/lsp-mode/page/installation/ for more information.
(require 'lsp-mode)
;; Either place zls in your PATH or add the following:
(setq lsp-zig-zls-executable "< path to zls > ")
```
### Doom Emacs
- Enable the `lsp` module
- Install the [zig-mode ](https://github.com/ziglang/zig-mode ) package (add `(package! zig-mode)` to your `packages.el` file
2021-07-10 13:12:51 +01:00
- Add the following to your `config.el` :
2021-04-05 14:58:52 +01:00
```elisp
(use-package! zig-mode
:hook ((zig-mode . lsp-deferred))
:custom (zig-format-on-save nil)
:config
(after! lsp-mode
(add-to-list 'lsp-language-id-configuration '(zig-mode . "zig"))
(lsp-register-client
(make-lsp-client
:new-connection (lsp-stdio-connection "< path to zls > ")
:major-modes '(zig-mode)
:server-id 'zls))))
```
2022-06-06 18:53:20 +01:00
### Spacemacs
- Add `lsp` and `zig` to `dotspacemacs-configuration-layers` in your `.spacemacs` file.
- If you don't have `zls` in your `PATH` , add the following to `dotspacemacs/user-config` in your
`.spacemacs` file:
```elisp
(setq lsp-zig-zls-executable "< path to zls > ")
```
2022-07-24 16:01:05 +01:00
### Helix
- Just add `zls` to your `PATH` .
- run `hx --health` to check if helix found `zls` .
2021-04-05 14:58:52 +01:00
## Related Projects
- [`sublime-zig-language` by @prime31 ](https://github.com/prime31/sublime-zig-language )
- Supports basic language features
- Uses data provided by `src/data` to perform builtin autocompletion
- [`zig-lsp` by @xackus ](https://github.com/xackus/zig-lsp )
- Inspiration for `zls`
- [`known-folders` by @ziglibs ](https://github.com/ziglibs/known-folders )
- Provides API to access known folders on Linux, Windows and Mac OS
## License
MIT