>_VSCODE-ELISP — EMACS LISP IN VS CODE
Open a .el file and the whole language lights up. Emacs Lisp is the extension language of Emacs; elisp (the elisprs project) is a Rust implementation that lowers .el to the fusevm bytecode VM + Cranelift JIT. vscode-elisp registers the elisp language for *.el files, the .emacs / _emacs init files, and elisp shebangs, highlights with a standalone TextMate grammar (source.elisp) covering the special forms, builtin functions / subrs, keyword symbols, char literals, and quoting sugar, starts the elisp --lsp language server via vscode-languageclient, and debugs through elisp --dap.
Install
The elisp binary must be on $PATH for the language server and debugging (brew install menketechnologies/menketech/elisprs). Build and install the .vsix locally:
git clone https://github.com/MenkeTechnologies/vscode-elisp cd vscode-elisp npm install npx @vscode/vsce package # vscode-elisp-<version>.vsix code --install-extension vscode-elisp-*.vsix
Or clone straight into your extensions dir for development: ~/.vscode/extensions/vscode-elisp.
What you get
Filetype detection
Every *.el file, plus the .emacs / _emacs init files, becomes the elisp language. Files with an elisp shebang are detected via firstLine.
Standalone grammar
A TextMate grammar (source.elisp) — special forms, definition names, builtin functions / subrs, keyword symbols, char literals, quoting sugar, strings, numbers.
Language server
Launches elisp --lsp (stdio JSON-RPC) through vscode-languageclient — diagnostics, hover, completion as the server provides.
Run
Emacs Lisp: Run File (Ctrl+F5 / editor-title ▶) saves and evaluates the active file as elisp <file> in an integrated terminal.
Debugging
Breakpoints, step over/into/out, call stack, scopes, variables, watch / hover, and run-without-debugging via the native debug adapter (elisp --dap).
Verified
A vscode-textmate + vscode-oniguruma test tokenizes a sample and asserts the scopes, so the grammar is proven to load and classify correctly.
Scopes
| Token group | Scope |
|---|---|
Special forms (defun let let* cond lambda setq if when while) | keyword.control.elisp |
Definition names ((defun NAME …)) | entity.name.function.elisp |
Builtin functions (car cdr cons mapcar funcall format message +) | support.function.elisp |
Keyword symbols (:test :key) | constant.other.keyword.elisp |
Char literals (?a ?\n) | constant.character.elisp |
Constants (t nil) | constant.language.elisp |
Numbers (42 3.14 #xFF) | constant.numeric.elisp |
Quoting (' ` , ,@ #') | keyword.operator.quote.elisp |
Strings (double-quoted with escapes), ; comments, and shebang lines are scoped too.
Language server settings
| Setting | Default & effect |
|---|---|
elisp.path | elisp — path to the executable |
elisp.lsp.enabled | true — start the server; set false for highlighting only |
elisp.lsp.args | ["--lsp"] — args to start the server |
The transport is omitted so the client spawns bare elisp --lsp and never appends --stdio. If the binary is missing, the extension shows one non-fatal warning and highlighting keeps working.
Compatibility
| Target | Status |
|---|---|
| VS Code 1.75+ | Grammar + LSP + DAP |
| VSCodium / OSS builds | Same extension |
| Syntax highlighting | No binary required |
| Language server & debug | Requires elisp on PATH |