/zls

Zig LSP implementation + Zig Language Server

Primary LanguageZigMIT LicenseMIT

Zig Language Server

CI Zig Tools

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.

Table Of Contents

Installation

Installing zls is pretty simple. You will need a build of Zig master to build zls.

git clone --recurse-submodules https://github.com/zigtools/zls
cd zls
zig build

# To configure zls:
zig build config

Build Options

Option Type Default Value What it Does
-Ddata_version string (master or 0.6.0) 0.6.0 The data file version. This selects the files in the src/data folder that correspond to the Zig version being served.
-Dallocation_info bool false Enable the use of the debug allocator that will print out information in debug mode and track memory leaks.
-Dmax_bytes_allocated usize 0 When allocation_info is true, enables a maximum allowed allocation size (excluding stacktraces) before the program panics.

Then, you can use the zls executable in an editor of your choice that has a Zig language server client!

Configuration Options

You can configure zls by providing a zls.json file.
zls will look for a zls.json configuration file in multiple locations with the following priority:

  • In the folders open in your workspace (this applies for files in those folders)
  • In the local configuration folder of your OS (as provided by known-folders)
  • In the same directory as the executable

The following options are currently available.

Option Type Default value What it Does
enable_snippets bool false Enables snippet completions when the client also supports them.
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. This option must be present in one of the global configuration files to have any effect. null is equivalent to ${executable_directory}/build_runner.zig
enable_semantic_tokens bool false Enables semantic token support when the client also supports it.
operator_completions bool true Enables * and ? operators in completion lists.

Features

zls supports most language features, including simple type function support, usingnamespace, payload capture type resolution, custom packages and others. Notable language features that are not currently implemented include @cImport as well as most forms of compile time evaluation.

The following LSP features are supported:

  • Completions
  • Hover
  • Goto definition/declaration
  • Document symbols
  • Find references
  • Rename symbol
  • Formatting using zig fmt
  • Semantic token highlighting (LSP 3.16 proposed feature, implemented by a few clients including VSCode, kak and emacs lsp-mode)

You can install zls using the instuctions for your text editor below:

VSCode

Install the zls-vscode extension from here and provide a path to the build zls executable.

Sublime Text 3

  • Install the LSP package from here or via Package Control.
  • Add this snippet to LSP's user settings:
{
    "clients": {
        "zig":{
            "command": ["zls"],
            "enabled": true,
            "languageId": "zig",
            "scopes": ["source.zig"],
            "syntaxes": ["Packages/Zig Language/Syntaxes/Zig.tmLanguage"]
        }
    }
}

Kate

  • 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)
{
    "servers": {
        "zig": {
            "command": ["zls"],
            "url": "https://github.com/zigtools/zls",
            "highlightingModeRegex": "^Zig$"
        }
    }
}

Neovim/Vim8

  • Install the CoC engine from here.
  • Issue :CocConfig from within your Vim editor, and the following snippet:
{
   "languageserver": {
       "zls" : {
           "command": "command_or_path_to_zls",
           "filetypes": ["zig"]
       }
   }
}

Emacs

(require 'lsp)
(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))

Related Projects

License

MIT