A brand-new language server for Typst, plus a VS Code extension
MIT License
A language server for Typst.
This repo consists of:
Install Rust, which comes with cargo
. Among other things, cargo
is the build tool used for Rust projects.
cargo build --release
Cargo will download and compile Rust dependencies as needed. The --release
flag produces and optimized binary. The resulting executable will be at target/release/typst-lsp
(with .exe
extension on Windows).
Cargo features allow you to customize the build by enabling chunks of code at compile time.
We need an HTTP client to download Typst packages. The client needs a TLS implementation; by default, Rustls is used. If you would like to disable or change this, the following Cargo features are available:
remote-packages
(default): use an HTTP client to download Typst packagesrustls-tls
(default): use Rustls for TLSnative-tls
: use your platform's TLS implementationFor example, the following command will build with native-tls
:
cargo build --release --no-default-features --features remote-packages,fontconfig,native-tls
For Linux, native-tls
means OpenSSL. You will need to install its headers to compile with native-tls
.
Additionally, the fontconfig
feature is used to enable minimal support for fontconfig
. This is necessary
for the LSP to detect fonts in certain Linux distributions, such as NixOS, and is thus enabled by default.
If this causes any problems for your distribution, you can disable support for fontconfig
by not enabling that feature,
such as by compiling with the flags --no-default-features --features remote-packages,rustls-tls
.
NOTE: If the LSP fails to find your fonts through fontconfig
, try setting (when running the LSP) the FONTCONFIG_FILE
environment variable to the absolute path of the fontconfig configuration file specifying your desired font paths. This can happen
when using VSCode through Flatpak on distributions such as NixOS, and can lead to some fonts not being detected when compiling your
Typst documents. To set the environment variable through Flatpak, you may either use Flatseal or run a command such as below
(assuming a --user
installation) - make sure to replace the path after FONTCONFIG_FILE
with the appropriate one for your system:
# For VSCode:
flatpak override --user --env=FONTCONFIG_FILE=$HOME/.config/fontconfig/conf.d/configfilenamehere.conf com.visualstudio.code
# For VSCodium:
flatpak override --user --env=FONTCONFIG_FILE=$HOME/.config/fontconfig/conf.d/configfilenamehere.conf com.vscodium.codium
Warning: at time of writing, the Typst API has changed in every release. Until the language is stable, you may need Rust knowledge to address changes in Typst to successfully compile against a new version of Typst.
You will need to modify the Typst dependencies in Cargo.toml
. These are at the top of the [dependencies]
section, have names starting with typst
, and reference git = "https://github.com/typst/typst.git"
.
If you want to compile against a versioned release of Typst, change the tag
s to the tag for your desired release. Usually, the tags are named vX.X.X
.
If you want to compile against a commit that hasn't been released, replace the tag
s with rev
s, and set their values to the Git commit hash. Commit hashes are hexadecimal strings, and have long and short versions that both name the commit. Among other places, a commit's hash can be found at the end of the GitHub URL for that commit.
Install:
editors/vscode
subdirectory:
npm install
to install extension dependenciesnpm run compile
to build the extensionDeveloper: Install Extension from Location...
and chooseeditors/vscode/
. There will not be any messages, but@installed
list.cargo install --path .
; at present, the VS Code extension just invokestypst-lsp
command to start the LSP, and this command will compile andnpm run watch
running, or npm run compile
Jaeger is a tool to visualize tracing data. It shows spans (e.g. a span corresponds to each time a file is opened, each time we calculate semantic tokens, etc.) and associated data (e.g. the URL of the file opened), which provides timing and debugging data.
By default, the LSP does not send data to Jaeger. To enable it:
opentelemetry_jaeger
$ docker run -d -p6831:6831/udp -p6832:6832/udp -p16686:16686 -p14268:14268 jaegertracing/all-in-one:latest
jaeger
feature enabled. In the terminal, run:
$ cargo build --features jaeger
In VS Code, you can use the "Run Extension [Jaeger]" task to launch thePrerequisites:
mason-lspconfig.nvim
,mason.nvim
andnvim-lspconfig
(Optional for advanced users, but required for this guide).
MasonInstall typst-lsp
.init.lua
settings (For more details, you may consult server_configurations.md#typst_lsp):require'lspconfig'.typst_lsp.setup{
settings = {
exportPdf = "onType" -- Choose onType, onSave or never.
-- serverPath = "" -- Normally, there is no need to uncomment it.
}
}
typst.vim
for more capabilities in nvim.coc.nvim
usersRun CocConfig
to edit the settings so that coc.nvim
could offer functions such as auto-completion:
{
"languageserver": {
"typst": {
"command": "typst-lsp",
"filetypes": ["typst"]
}
}
}
Follow the configuration instructions for the LSP plugin for Sublime Text.