Zig NEWS

Jarred Sumner
Jarred Sumner

Posted on

Setting up Visual Studio Code for writing Zig

If you're googling VSCode development environment Zig, this post should help.

The first step is downloading & installing Zig.

Installing Zig

I personally suggest using Zig from the master on git, but Zig also has versioned releases.

With Homebrew (macOS):

brew install zig --HEAD
Enter fullscreen mode Exit fullscreen mode

With Snap (Ubuntu):

snap install zig --classic --edge
Enter fullscreen mode Exit fullscreen mode

You can read more about installing or download binaries separately

Zig Language Server (zls)

zls is the language server for Zig. It gives your editor autocomplete, better errors, and semantic highlighting.

It enables completions for functions & types.

image

To install zls, I suggest compiling it from source. Zig's compiler is fast, so it shouldn't take long.

git clone https://github.com/zigtools/zls
cd zls
git submodule update --init --recursive --progress
zig build -Drelease-fast
Enter fullscreen mode Exit fullscreen mode

Configuring zls

From your zls directory, run this:

./zig-out/bin/zls configure
Enter fullscreen mode Exit fullscreen mode

If you're asked this, press n or it will fail unless you run as sudo
image

Configuring Visual Studio Code

There are two extensions you will want to install.

  1. vscode-zig gives you syntax highlighting and is required for zig fmt to run automatically on save.
  2. zls-vscode sets up zls

Configuring vscode-zig

To auto format on save, set tiehuis.zig to the default formatter in your VSCode settings.json.

  "[zig]": {
    "editor.defaultFormatter": "tiehuis.zig"
  },
Enter fullscreen mode Exit fullscreen mode

This is powered by zig fmt. If you're familiar with JavaScript, zig fmt is like prettier (or like go fmt)

You can also enable build on save for higher quality error messages. For most projects, Zig's compiler is fast enough for that to work well.

  "zig.buildOnSave": true,
Enter fullscreen mode Exit fullscreen mode

Discussion (16)

Collapse
guidorice profile image
Alex G Rice

Just noticed: the amazing zls now supports both formatting and syntax hi-lighting!

Collapse
dxps profile image
dxps

Just started this journey.
In a VSCode setup, besides having "ZLS for VSCode" extension installed, is there any option to have also formatting and syntax hightlighting, please?
Thanks.

Collapse
guidorice profile image
Alex G Rice • Edited on

@dxps
I should add, don't forget to do zls config and go through the setup options.

$ zls config
Welcome to the ZLS configuration wizard!
      *
       |\
      /* \
      |  *\
    _/_*___|_    x
      | @ @     /
     @     \   /
      \__-/   /

? Should this configuration be system-wide? (y/n) > n
Found zig executable '/usr/local/bin/zig' in PATH.
? Which code editor do you use? (select one)

  - VSCode
  - Sublime
  - Kate
  - Neovim
  - Vim8
  - Emacs
  - Doom
  - Other

> VSCode
? Do you want to enable snippets? (y/n) > y
? Do you want to enable style warnings? (y/n) > y
? Do you want to enable semantic highlighting? (y/n) > y
? Do you want to enable .* and .? completions? (y/n) > y
Writing config to /Users/alex/Library/Application Support/zls.json ... successful.



To use ZLS in Visual Studio Code, install the 'ZLS for VSCode' extension from 
'https://github.com/zigtools/zls-vscode/releases' or via the extensions menu.
Then, open VSCode's 'settings.json' file, and add:

"zigLanguageClient.path": "[command_or_path_to_zls]"

Thank you for choosing ZLS!
Enter fullscreen mode Exit fullscreen mode
Thread Thread
dxps profile image
dxps

Yeah, found it and just did that.
Reloaded and restarted VSCode. Now, there seems to be some syntax highlighting (just on brackets), but no formatting on save.

Thread Thread
guidorice profile image
Alex G Rice

@dxps If you run the Format Document command in VSCode it should run zig fmt behind the scenes. Then you can toggle on the general VSCode preference: Editor: Format On Save.

Thread Thread
dxps profile image
dxps

Just found out that in the ZLS output ("output" vscode pane), whenever I do save it throws a "need to run as root or suid".
Gotta go to sleep, it's late here, i'll solve it tomorrow.

Thanks again for the help! Really appreciate it!

Thread Thread
guidorice profile image
Alex G Rice

Oh wow: i have never seen that error. Cheers I'm sure you'll get it sorted.

Thread Thread
dxps profile image
dxps

Issue solved.

I had to do chmod a+x {path/to}/zls
(instead of just chmod +x ...).

Collapse
guidorice profile image
Alex G Rice

@dxps zls actually does all that already for VSCode! github.com/zigtools/zls#features

Thread Thread
dxps profile image
dxps

Apparently it doesn't in my case.
And the only setting that I have it the (full) path to zls, as required.
Thanks for the quick feedback, Alex!
I'll see if I can find the root cause of it.

Thread Thread
guidorice profile image
Alex G Rice

@dxps ah gotcha. Maybe try going through the zls config setup. Also it may be necessary match your zls with your zig version. For example I am running zig 0.9.1 and zls 0.9.0.

Collapse
batiati profile image
Rafael Batiati

Very nice post! I would love to know more about setting up VSCode for debuging Zig with gdb/lldb.

Collapse
fabioarnold profile image
Fabio Arnold

You can use Microsoft's C++ extension for debugging. When you hit F5 (Launch) in VS Code a wizard should pop up to guide you in creating a launch.json file for your project. Here's an old post of mine on how to do that on Windows: dev.to/fabioarnold/setup-zig-for-g...

One more exception: macOS arm64 isn't yet supported by Microsoft's debugging extension. I found CodeLLDB to be a good replacement.

Collapse
kristoff profile image
Loris Cro

I've seen somebody make this work, it required adding a tiny little bit of scripting to vscode (mainly to know where the test executable gets saved) and then it would work very easily, IIRC.

Collapse
guidorice profile image
Alex G Rice • Edited on

I am using Zig + VSCode on MacOS with this LLDB extension vadimcn.vscode-lldb.
marketplace.visualstudio.com/items...
Some things are a bit unintuitive, like const values are displayed as <no location, value may have been optimized out>, but it basically seems to work.

One thing I have not solved though, is how to run the debugger on tests. How does one generate a test executable for debugging? Basically want to be able to launch an executable that is that same as: zig build test

Also found this article but YMMV, I didn't have any success with that other debugger.
dev.to/watzon/debugging-zig-with-v...

@kristoff @batiati

Thread Thread
guidorice profile image
Alex G Rice • Edited on

Figured it out: to run the test executable in a debugger, first run zig build test, then a test executable will be in the cache dir:

$ find zig-cache -name test
zig-cache/o/31202ceebbfdf2cf8ee2be9565e64183/test
Enter fullscreen mode Exit fullscreen mode

An example launch.json using the CodeLLDB extension:

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "lldb",
            "request": "launch",
            "name": "Debug test runner",
            "program": "${workspaceFolder}/zig-cache/o/31202ceebbfdf2cf8ee2be9565e64183/test",
            "args": ["src/main.zig"],
            "cwd": "${workspaceFolder}"
        }
    ]
}
Enter fullscreen mode Exit fullscreen mode

Now try hitting some breakpoints in your tests- it works for me.