Documentation / The IDE
Language servers and build
The language servers Yuli installs and maintains for you, without npm or a system Node, and the build adapters for Python, Go, .NET, sbt, Bazel and Node.
For each language, Yuli uses the reference language server (LSP) and manages it for you: it downloads it with your permission, verifies it and keeps it outside your projects. Java has its own native engine, and CSS, SCSS and LESS are handled by the editor.
Managed servers
| Language | Server | Installed from |
|---|---|---|
| TypeScript and JavaScript | typescript-language-server with typescript (the real tsserver) |
npm registry |
| Python | Pyright | npm registry |
| Go | gopls | go install |
| Kotlin | kotlin-language-server | GitHub zip |
| C# | csharp-ls | dotnet tool |
| PHP | Intelephense | npm registry |
| Ruby | ruby-lsp | gem |
| C and C++ | clangd 19.1.2 | GitHub zip |
| Bash | bash-language-server | npm registry |
| Dockerfile | dockerfile-language-server-nodejs | npm registry |
| Rust | rust-analyzer | GitHub binary |
No npm or Node on your machine
- Packages are downloaded straight from the npm registry and checked against the SHA-512 hash the registry publishes.
- Install scripts and optional dependencies are not run.
- They run on Yuli's own Electron in Node mode, or on a Node that Yuli downloads. You don't need npm or Node installed.
- They are kept in
<runtimes>/<server>/<version>/. - A download is stopped only if no data arrives for 60 seconds; a slow but active download is not interrupted.
Yuli's runtimes folder (<runtimes>) depends on the system:
%LOCALAPPDATA%\.yulicode\runtimes
~/Library/Caches/.yulicode/runtimes
$XDG_CACHE_HOME/yulicode/runtimes (by default, ~/.cache/yulicode/runtimes)
With your permission
If a language's server is missing, the editor shows "No language server for…" with these options:
| Option | What it does |
|---|---|
| Allow download / Allow installation | Yuli installs it and starts it |
| Not now | It doesn't ask again during this session |
| Don't ask again | It remembers your decision for that server |
Nothing will be downloaded or run without your permission. Decisions are saved in lsp-install-consent.json, next to your settings, per server and per target (this machine or a remote host).
In Global options → Language servers you can set the path of a server you already have, or a trusted URL or mirror.
Build adapters
Yuli detects how each project is built from its files, without running anything to find out, and uses those tools to build, run, test and show results in the Tests panel.
- Managers: pip (
requirements*.txt,setup.pyor a plainpyproject.toml), Poetry, uv, Pipenv and Hatch. - Environment: it uses the project's virtual environment (
.venv/venv, the Poetry and Pipenv folders or Hatch's). With none, it uses the manager'srunand, failing that, the system Python. - Tests: pytest if the project configures or depends on it; otherwise unittest.
- The same environment is passed to Pyright, so autocomplete sees your dependencies.
go build,go runandgo test ./....- Tests are read in
-jsonformat for the Test Explorer, while the console shows-v-style text.
.sln,.csproj,.fsprojand.vbprojprojects.- Test results come back in TRX format.
- Projects with
build.sbt. - Test results are read from the JUnit XML in
target/test-reports.
- Projects with
MODULE.bazelorWORKSPACE. bazel build //...,bazel test //...andbazel run <label>; it uses bazelisk if you have it installed.
- Package manager: the
packageManagerfield ofpackage.jsonand, if absent, the lockfile:pnpm-lock.yaml,yarn.lock,bun.lockborpackage-lock.json. - Coverage: with the tool the project already has, in this order: vitest, jest, c8 and nyc. Yuli reads
coverage/coverage-summary.json. With none of them there is no coverage.
Maven, Gradle, Ant and Cargo work as always; see Run and debug.
▶ in the margin
Next to the code, a ▶ lets you run or debug what is in front of you. It is shown only when the project really is of that kind.
| Language | Run | Debug |
|---|---|---|
| Python | if __name__ == "__main__": and pytest or unittest tests |
if __name__ == "__main__": |
| Go | func main and func TestX |
func main and func TestX |
| C# | xUnit, NUnit and MSTest tests | static void Main( |
Also, in a package.json each script has its ▶ (it runs with the project's package manager), and in Java there is a ▶ for classes with main, tests and Maven and Gradle tasks.
See Debugging for debug sessions and Editor and languages for the rest of the editor.