> ## Documentation Index
> Fetch the complete documentation index at: https://docs.jylhis.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Language Support

> Which editor features Jotain wires up for each supported language

# Language Support

Jotain gives every programming language the same **baseline** the moment its
buffer opens — no language server required:

* **Completion** — in-buffer completion via corfu + cape (dabbrev, file, keyword).
* **Diagnostics** — on-the-fly checking via flymake.
* **Documentation** — echo-area docs via eldoc.
* **Navigation** — xref, imenu, tree-sitter code folding, and a breadcrumb header line.
* **Formatting on save** — via apheleia, where a formatter is configured (below).
* **Editing hygiene** — editorconfig, indentation detection (dtrt-indent), and snippets (tempel).

When a language server is on the project's `PATH` (Jotain resolves servers from
the project's own devenv/environment, not from this config), eglot starts
automatically and **upgrades** completion, documentation, navigation, and
diagnostics to semantic LSP, and adds go-to-definition into dependencies,
find-references, rename, code actions, and workspace-symbol search. Debugging is
provided by dape for the languages with a DAP adapter below.

The table lists the language-specific wiring on top of that baseline. It is the
*declared* standard from the language registry; the live, ground-truth matrix
(actual mode routing and which servers are bundled/available) is produced by
`nix build .#lang-eval-matrix`, and a live end-to-end LSP probe by
`nix build .#lang-eval-live`.

| Language         | Major mode                | Tree-sitter | Language server                                              | Formatter      | Debug (DAP) | Snippets | Inlay | Live-probed |
| ---------------- | ------------------------- | ----------- | ------------------------------------------------------------ | -------------- | ----------- | -------- | ----- | ----------- |
| Nix              | `nix-ts-mode`             | ✓           | `nixd` / `nil`                                               | `nixfmt`       | —           | —        | ✓     | ✓           |
| Python           | `python-ts-mode`          | ✓           | `basedpyright-langserver` / `pyright-langserver` / `pylsp` ᵉ | `ruff`         | `debugpy`   | ✓        | ✓     | ✓           |
| Rust             | `rust-ts-mode`            | ✓           | `rust-analyzer`                                              | `rustfmt`      | `codelldb`  | ✓        | ✓     | —           |
| Go               | `go-ts-mode`              | ✓           | `gopls` ᵉ                                                    | `goimports`    | `dlv`       | ✓        | ✓     | ✓           |
| TypeScript       | `typescript-ts-mode`      | ✓           | `typescript-language-server` ᵉ                               | `prettier`     | —           | ✓        | ✓     | ✓           |
| TSX              | `tsx-ts-mode`             | ✓           | `typescript-language-server` ᵉ                               | `prettier`     | —           | ✓        | ✓     | —           |
| JavaScript       | `js-ts-mode`              | ✓           | `typescript-language-server` ᵉ                               | `prettier`     | —           | ✓        | —     | —           |
| CSS / SCSS       | `css-ts-mode`             | ✓           | `vscode-css-language-server`                                 | `prettier`     | —           | —        | —     | —           |
| C                | `c-ts-mode`               | ✓           | `clangd` ᵉ                                                   | `clang-format` | `codelldb`  | ✓        | ✓     | —           |
| C++              | `c++-ts-mode`             | ✓           | `clangd` ᵉ                                                   | `clang-format` | `codelldb`  | ✓        | ✓     | —           |
| CUDA             | `cuda-ts-mode`            | ✓           | `clangd` ᵉ                                                   | `clang-format` | `codelldb`  | ✓        | ✓     | —           |
| Bash / shell     | `bash-ts-mode`            | ✓           | `bash-language-server`                                       | `shfmt`        | —           | —        | —     | ✓           |
| Dockerfile       | `dockerfile-ts-mode`      | ✓           | `docker-langserver` ᵉ                                        | —              | —           | —        | —     | ✓           |
| YAML             | `yaml-ts-mode`            | ✓           | `yaml-language-server`                                       | `prettier`     | —           | —        | —     | ✓           |
| JSON             | `json-ts-mode`            | ✓           | `vscode-json-language-server`                                | `prettier`     | —           | —        | —     | —           |
| TOML             | `toml-ts-mode`            | ✓           | `taplo`                                                      | —              | —           | —        | —     | —           |
| Zig              | `zig-ts-mode`             | ✓           | `zls`                                                        | `zig`          | —           | —        | ✓     | —           |
| OCaml            | `tuareg-mode`             | —           | `ocamllsp`                                                   | `ocamlformat`  | —           | —        | ✓     | —           |
| Haskell          | `haskell-mode`            | —           | `haskell-language-server-wrapper`                            | —              | —           | —        | ✓     | —           |
| Terraform        | `terraform-mode`          | —           | `terraform-ls`                                               | —              | —           | —        | —     | —           |
| CMake            | `cmake-ts-mode`           | ✓           | `cmake-language-server`                                      | —              | —           | —        | —     | —           |
| Meson            | `meson-mode`              | —           | —                                                            | `meson`        | —           | —        | —     | —           |
| QML              | `qml-ts-mode`             | ✓           | `qmlls` ᵉ                                                    | `qmlformat`    | —           | —        | —     | —           |
| LikeC4           | `likec4-mode`             | —           | `likec4-lsp` / `likec4` ᵉ                                    | —              | —           | —        | —     | —           |
| HTML (web-mode)  | `web-mode`                | —           | —                                                            | —              | —           | —        | —     | —           |
| CSV              | `csv-mode`                | —           | —                                                            | —              | —           | —        | —     | —           |
| SQL              | `sql-mode`                | —           | —                                                            | —              | —           | —        | —     | —           |
| Dune             | `dune-mode`               | —           | —                                                            | —              | —           | —        | —     | —           |
| Bazel / Starlark | `bazel-build-mode`        | —           | —                                                            | `buildifier`   | —           | —        | —     | —           |
| Structurizr DSL  | `jotain-structurizr-mode` | —           | —                                                            | —              | —           | —        | —     | —           |
| Jinja2           | `jinja2-mode`             | —           | —                                                            | —              | —           | —        | —     | —           |

Notes: **ᵉ** marks a server set by an explicit `eglot-server-programs` override in `init-prog.el` (the rest are eglot's built-in defaults). **Live-probed** ✓ marks the curated subset checked end-to-end by `.#lang-eval-live`. Tree-sitter ✓ means a grammar backs the major mode (all grammars ship with the distribution). This page is generated from `etc/lang-eval/jotain-lang-registry.el` — edit the registry, not this file, then run `just docs-refresh-lang-matrix`.
