Giter Club home page Giter Club logo

zls's Introduction

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

Installation starts with downloading an official release from the Releases page. Up to date builds from master branch are also available in the latest successful CI run, contained in the builds artifact.

See Downloading and Building ZLS on the Wiki, or the page about using ZLS with 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.:

brew install xz
mkdir $HOME/zls && cd $HOME/zls && curl -L https://github.com/zigtools/zls/releases/download/0.1.0/x86_64-macos.tar.xz | tar -xJ --strip-components=1 -C .

Linux

You can install the latest release into $HOME/zls using e.g.:

sudo apt install xz-utils
mkdir $HOME/zls && cd $HOME/zls && curl -L https://github.com/zigtools/zls/releases/download/0.1.0/x86_64-linux.tar.xz | tar -xJ --strip-components=1 -C .

From Source

Building zls is very easy. You will need a build of Zig master to build zls.

git clone --recurse-submodules https://github.com/zigtools/zls
cd zls
zig build -Drelease-safe
./zig-out/bin/zls config # Configure ZLS

For detailed building instructions, see the Wiki page about Cloning With Git.

Build Options

Option Type Default Value What it Does
-Ddata_version string (master, 0.7.0 or 0.7.1) master The data file version. This selects the files in the src/data folder that correspond to the Zig version being served.

Configuration Options

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:

  • In the local configuration folder of your OS (as provided by known-folders)
  • In the global configuration folder of your OS (as provided by known-folders)

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. null is equivalent to ${executable_directory}/build_runner.zig
build_runner_cache_path ?[]const u8 null Path to a directroy that will be used as zig's cache when running zig run build_runner.zig .... null is equivalent to ${KnownFloders.Cache}/zls
enable_semantic_tokens bool true Enables semantic token support when the client also supports it.
operator_completions bool true Enables * and ? operators in completion lists.
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

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

CoC

  • 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"]
       }
   }
}

YouCompleteMe

  • Install YouCompleteMeFrom here.
  • Add these lines to your vimrc:
"ensure zig is a recognized filetype
autocmd BufNewFile,BufRead *.zig set filetype=zig

let g:ycm_language_server =
  \ [
  \{
  \     'name': 'zls',
  \     'filetypes': [ 'zig' ],
  \     'cmdline': [ '/path/to/zls_executable' ]
  \    }
  \ ]

nvim-lspconfig

Requires Nvim 0.5 (HEAD)!

  • Install nvim-lspconfig from here.
  • Install zig.vim from here.

nvim-lspconfig already ships a configuration for zls. A simple init.vim might look like this:

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'}
    for _, lsp in ipairs(servers) do
        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
  • Edit your neovim configuration and add zls for zig filetypes:
let g:LanguageClient_serverCommands = {
       \ 'zig': ['~/code/zls/zig-out/bin/zls'],
       \ }

Emacs

;; 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 package (add (package! zig-mode) to your packages.el file
(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))))

Related Projects

License

MIT

zls's People

Contributors

alexnask avatar antlilja avatar bnjmnt4n avatar cattes avatar codehz avatar data-man avatar daurnimator avatar firefox317 avatar fivemoreminix avatar g-w1 avatar grayjack avatar ifreund avatar joachimschmidt557 avatar kubkon avatar leecannon avatar lithdew avatar luukdegram avatar markfirmware avatar ominitay avatar prime31 avatar rhysd avatar sergeeeek avatar slimsag avatar stromberg90 avatar superauguste avatar tadeokondrak avatar tau-dev avatar truemedian avatar vesim987 avatar vexu avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.