This extension adds support for the Julia language in the zed editor.
- Contributing
- Installing Julia / Zed / Zed Julia extension
- Configuring the Julia executable for tasks
- Running code in the REPL
- Using Zed in the REPL
- Customizing syntax highlighting
- Install Julia for your platform: https://julialang.org/downloads/
- Install Zed for your platform: https://zed.dev/download
- Start Zed.
- Inside Zed, go to the extensions view by
executing the
zed: extensionscommand (click Zed->Extensions). - In the extensions view, simply search for the term
juliain the search box, then select the extension namedJuliaand click the install button. You might have to restart Zed after this step.
The Julia Zed extension looks for your Julia binary in the standard locations.
Make sure that the Julia binary is on your PATH.
By default, Zed tasks (like running tests) use the julia command from your PATH.
You can customize which Julia executable is used by setting the julia environment variable:
-
In your shell configuration (
.bashrc,.zshrc, etc.):export julia="/path/to/custom/julia"
-
When launching Zed from the terminal:
julia="/path/to/custom/julia" zed .
-
Using direnv (automatically supported by Zed):
- Create a
.envrcfile in your project root with:.envrc
JULIA_HOME="path/to/julia/directory" PATH_add "$JULIA_HOME/bin" export julia="$JULIA_HOME/bin/julia" - Run
direnv allowto approve the file
- Create a
This allows you to use different Julia versions for different projects or to specify a Julia installation that's not on your PATH.
This section describes how to select Julia code in the editor and run it in Zed's integrated terminal. This is more of a workaround than a full integration. Currently, there is no inline code execution as in VSCode. On the other hand, the Language Server is not required to make this work.
-
Open a .jl file in the editor.
-
From the Command Palette, run
open in terminal. This opens a new terminal in the worktree root (where the Project.toml lives). You can also right-click in the editor and use the context menu or pressctrl-shift-`as defined in the json example below. -
In the terminal, start the REPL with
julia --project. -
Now it's time to select some code in the editor, copy it to the clipboard, paste it into the terminal, execute it, and go back to the editor. To make that less tedious, add one or more of the following key bindings. Change the
ctrl-shift-f10/11/12combinations to your liking.Note: interacting with the terminal requires to send keystrokes. In the examples,
cmd-vis used to paste code. Please adjust this binding for your operating system.
Zed is currently not on the list of Julia's predefined editors. You can add it to your ~/.julia/config/startup.jl:
atreplinit() do repl
InteractiveUtils.define_editor("zed") do cmd, path, line, column
`$cmd $path:$line:$column`
end
endSet the environment variable EDITOR (or VISUAL or JULIA_EDITOR, whatever you use) to zed --wait. Then, using InteractiveUtils.edit etc. will open the document in Zed.
You can change the foreground color and text attributes of syntax tokens in your ~/.config/zed/settings.json, for instance:
{
"experimental.theme_overrides": {
"syntax": {
"comment.doc": {
"font_style": "italic"
},
"function.definition": {
"color": "#0000AA",
"font_weight": 700
}
}
}
}See Syntax Highlighting and Themes and Tree-sitter Queries for further details.
Syntax tokens are called captures in tree-sitter jargon. The following table lists all captures provided by zed-julia. Some captures have default values (defined in Zed's color themes) and the other captures fall back to one of the defaults. Depending on your color theme, some captures may be set to the editor's foreground color or to a very similar one. In this case, try to assign a different color to improve the contrast.
| Capture | Is there a default value? | Note/Example |
|---|---|---|
| boolean | yes | |
| comment | yes | line or block comment |
| comment.doc | yes | docstring |
| constant.builtin | no, falls back to constant | core julia built-in |
| function.builtin | no, falls back to function | core julia built-in |
| function.call | no, falls back to function | name of the called function |
| function.definition | no, falls back to function | name of the defined function |
| function.macro | no, falls back to function | name of the macro |
| keyword | yes | |
| keyword.conditional | no, falls back to keyword | if, else |
| keyword.conditional.ternary | no, falls back to keyword | ? : |
| keyword.exception | no, falls back to keyword | try, catch |
| keyword.function | no, falls back to keyword | function, do, short function definition: = |
| keyword.import | no, falls back to keyword | im/export, using, module definition |
| keyword.operator | no, falls back to keyword | in, isa, where |
| keyword.repeat | no, falls back to keyword | for, while |
| keyword.return | no, falls back to keyword | return |
| number | yes | |
| number.float | no, falls back to number | |
| operator | yes | |
| punctuation.bracket | yes | (), [], {} |
| punctuation.delimiter | yes | ,, ; |
| punctuation.special | yes | string interpolation: $() |
| string | yes | |
| string.escape | yes | escape sequence |
| string.special | yes | command literal |
| string.special.symbol | yes | quote expression |
| type | yes | |
| type.builtin | no, falls back to type | core julia built-in |
| type.definition | no, falls back to type | |
| variable | yes | |
| variable.builtin | no, falls back to variable | core julia built-in: begin and end in indices |
| variable.member | no, falls back to variable | example: in foo.bar, the member is bar |