CSS Variable LSP (Rust Implementation)
A Language Server Protocol implementation for CSS Variables, written in Rust.
Status: Complete
This is a ground-up Rust rewrite of the TypeScript/Node-based css-variable-lsp, eliminating the Node/npm dependency for the Zed extension.
Features
- CSS parsing for variable definitions and
var()usage tracking - HTML parsing for
<style>blocks and inline styles (custom DOM scanner) - Cascade sorting and specificity calculation
- LSP features: completion, hover, definition, references, rename, diagnostics, document/workspace symbols
- Workspace scanning and color provider (hex/rgb/hsl + named colors)
Autocomplete Contexts
TypeScript LSP (css-variable-lsp):
- Triggers on
-,(, and:. - Returns items only in CSS value contexts (after a
:and before the next;). - CSS-like files: inside rules/declarations (requires
{}context). - HTML-like files: inside
style="..."attributes or<style>...</style>blocks. - JS/TS/JSX/TSX: only inside string literals or template literal text (not inside
${...}). - Insert text:
--nameif already insidevar(, otherwisevar(--name).
Rust LSP (this repo):
- Matches the TypeScript LSP behavior above.
- Document kind detection uses language ID when available, otherwise extensions derived from
lookupFiles.
Building
Release Assets (Local)
Build and package release assets into dist/ (tar.gz on Unix, zip on Windows):
To build a subset of targets:
Running
The LSP server communicates via stdin/stdout using the Language Server Protocol.
Architecture
main.rs- Entry point, sets up async runtime and LSP serverlsp_server.rs- LSP protocol handlers (implementstower_lsp_server::LanguageServer)manager.rs- CSS variable manager (stores definitions/usages, DOM trees)types.rs- Core data types (CssVariable, CssVariableUsage, Config, etc.)parsers/- CSS and HTML parsing (definitions + var() usages)dom_tree.rs- Lightweight HTML scanner for selector matchingspecificity.rs- Specificity calculation and cascade orderingworkspace.rs- Workspace scanning and file discoveryflags.rs- Reusable flag parsing helper functionsruntime_config.rs- CLI/env configuration parsingpath_display.rs- Path formatting for hover/completioncolor.rs- Color parsing and color provider helpers
Configuration
The LSP server accepts configuration via CLI flags and environment variables.
Feature Flags
| Flag | CLI (disable) | Env var | Default | Description |
|---|---|---|---|---|
| Color preview | --no-color-preview |
CSS_LSP_COLOR_PREVIEW=0 |
true | Enable color picker |
| Color only variables | --color-only-variables |
CSS_LSP_COLOR_ONLY_VARIABLES=1 |
false | Colors only on var() |
| Lookup files | --lookup-files |
CSS_LSP_LOOKUP_FILES |
None | File extensions to scan |
| Ignore globs | --ignore-globs |
CSS_LSP_IGNORE_GLOBS |
None | Patterns to exclude |
| Path display | --path-display |
CSS_LSP_PATH_DISPLAY |
relative | Path format mode |
| Path length | --path-display-length |
CSS_LSP_PATH_DISPLAY_LENGTH |
1 | Abbreviation length |
| Undefined fallback | --undefined-var-fallback |
CSS_LSP_UNDEFINED_VAR_FALLBACK |
warning | Fallback diagnostic level |
| Suggest add fallback | --no-suggest-add-fallback |
CSS_LSP_SUGGEST_ADD_FALLBACK=0 |
true | Add fallback quickfix |
| Suggest color vars | --no-suggest-exact-color-variables |
CSS_LSP_SUGGEST_EXACT_COLOR_VARIABLES=0 |
true | Color replacement suggestions |
Examples
# Disable color preview
# Set lookup files via env
CSS_LSP_LOOKUP_FILES="*.css,*.scss"
# Combine options
Dependencies
tower-lsp-server- LSP server frameworktokio- Async runtimeglobset/walkdir- Workspace scanningcsscolorparser- Color value parsingregex/pathdiff- Parsing helpers and path formatting
License
GPL-3.0