Language support for Ridge, a typed
functional language for the BEAM. Highlights .ridge source files and
connects to ridge-lsp for diagnostics, hover, go-to-definition, and
completion as you type.
Features
- Syntax highlighting for
.ridgefiles (TextMate grammar). - Live diagnostics from
ridge-lsp— type errors, capability violations, parse errors — shown inline and in the Problems panel. - Hover for inferred types; go-to-definition across the workspace and into
the standard library — including jumping from a
record.fielduse to the field's declaration; go-to-type-definition from a value to thetypethat declares it; find-references, rename, signature help, document formatting, document and workspace symbols, inlay hints, and identifier completion — all served byridge-lsp. - Semantic highlighting that colours identifiers the grammar cannot tell
apart — function vs variable vs type vs constructor vs stdlib symbol — and
surfaces capability annotations (
io,fs,net,db, ...) as their own token type. - Comment toggling with
--. - Bracket matching and auto-closing for
(),[],{}, and"". - Auto-indentation for the offside layout: blocks opened by
=,->,<-,then,else,try, or amatchhead indent the next line.
Requirements
This extension launches ridge-lsp over stdio. Install the Ridge toolchain
first; both ridge and ridge-lsp need to be on your PATH.
Linux and macOS:
bash -c "$(curl -fsSL https://raw.githubusercontent.com/ridge-lang/ridge/main/tools/install/install.sh)"
Windows (PowerShell):
& ([scriptblock]::Create((iwr -useb 'https://raw.githubusercontent.com/ridge-lang/ridge/main/tools/install/install.ps1').Content))
To pin a specific Ridge release, set RIDGE_VERSION=v0.2.1 before
running the installer. See the
tutorial
for the full install walkthrough.
How it works (and how to update the language)
The extension is a thin LSP client. It does not bundle the Ridge compiler
or analyzer. When you open a .ridge file, the extension spawns the
ridge-lsp binary from your PATH and proxies JSON-RPC messages
between it and the editor; all type checking, diagnostics, and
formatting come from that binary.
┌─────────────────────────────┐ ┌─────────────────────────────┐
│ VS Code │ │ ridge-lsp binary │
│ + this extension │ │ (in PATH, separate install)│
│ • syntax grammar │ JSON│ • lexer, parser │
│ • language config │ RPC │ • resolver, typechecker │
│ • LSP client │◀───▶│ • diagnostics │
│ • spawns ridge-lsp │stdio│ • formatter │
└─────────────────────────────┘ └─────────────────────────────┘
installed once via installed via install script,
the Marketplace re-run for each release
The practical consequence: compiler and diagnostic fixes ship with
the ridge-lsp binary, not with the extension. A Ridge maintenance
release that improves diagnostics or fixes a codegen bug only requires
re-running the install script to update the binary; the extension you
installed from the Marketplace keeps working as-is.
If something stops behaving the way the tutorial
says it should, re-run the install script first to make sure your
ridge-lsp matches the latest release; reinstalling the extension
itself rarely helps for compiler-side issues.
Settings
| Setting | Default | Purpose |
|---|---|---|
ridge.lspPath |
"" |
Absolute path to the ridge-lsp binary. Leave empty to auto-resolve (tries ~/.cargo/bin/ridge-lsp first, then walks PATH). |
ridge.codeLens.references |
true |
Show a "N references" lens above each referenceable top-level declaration. |
ridge.codeLens.implementations |
true |
Show a "N implementations" lens above each class declaration. |
ridge.codeLens.run |
true |
Show a "Run" lens above the main function of an app or service project. |
ridge.codeLens.runTest |
true |
Show a "Run test" lens above each @test function. |
Toggling any ridge.codeLens.* setting takes effect immediately — no reload.
Known limitations
- First open before
ridge-lspis installed: the extension activates and registers the language, but diagnostics only appear onceridge-lspis available and VS Code is reloaded.
Development
Building the extension from source for local sideloading:
cd tools/vscode-ridge
pnpm install
pnpm dlx @vscode/vsce package --no-dependencies
code --install-extension vscode-ridge-<version>.vsix
The project uses pnpm (packageManager: [email protected] via corepack) and
esbuild-wasm to keep the toolchain free of postinstall scripts. The
--no-dependencies flag on vsce package is required because pnpm's
strict-install layout is incompatible with vsce's internal npm list
walk; the produced .vsix is byte-identical to the npm-built version
since node_modules/** is excluded from the bundle.