CodeMirror as a VS Code extension.
In 2012, Bret Victor gave a talk titled Inventing on Principle, in which he showed a demo of editing a JavaScript file that was being re-executed immediately on every change, with a little widget to edit numbers by dragging the mouse in an analog fashion instead of just typing:
As of 2025, this sort of thing is not possible in Visual Studio Code, which 73.6% of developers "use regularly" according to the 2024 Stack Overflow Developer Survey. However, it is possible in CodeMirror; for instance, here's a short demo video of CodeMirror Interact by Replit:
interact.mp4
This extension is not yet published to the VS Code Marketplace; check back later, or if you're curious then you can refer to CONTRIBUTING.md to build it from source.
Use the Open in CodeMirror command (bound to ctrl+alt+c ctrl+alt+m by default) to open the current file in a new CodeMirror editor.
NOTE: Probably you don't need to configure anything in this base extension, and can skip to the Extensibility section which talks about installing other VS Code extensions that depend on and extend this one. Consider the rest of this section "advanced usage".
To configure CodeMirror itself, add or remove items from the codemirror.extensions and codemirror.languages VS Code settings:
Here is a list of the CodeMirror extensions included in this VS Code extension:
-
codemirror.extension.basicSetupis thebasicSetupextension from thecodemirrornpm package, which "pulls together a number of extensions that you might want in a basic editor." Thehistoryextension and its keymap are excluded, as this VS Code extension has undo history support built in. -
codemirror.extension.minimalSetupis theminimalSetupextension from that samecodemirrornpm package, which is a "minimal set of extensions to create a functional editor." Similar tobasicSetup, thehistoryextension and its keymap are excluded. -
codemirror.extension.wordWrapis the CodeMirrorEditorView.lineWrappingextension, gated by the VS Codeeditor.wordWrapsetting. -
codemirror.extension.themeVscodeuses the VS Code color theme kind to select between the dark and light themes provided by the@uiw/codemirror-theme-vscodenpm package. -
codemirror.extension.vscodeDarkapplies the VS Code dark theme from the@uiw/codemirror-theme-vscodenpm package. -
codemirror.extension.vscodeLightapplies the VS Code light theme from the@uiw/codemirror-theme-vscodenpm package. -
codemirror.extension.languses the VS Code language identifier to dispatch according to thecodemirror.languagessetting, or loads and configures a@codemirror/lang-*extension as a fallback if one is known. -
codemirror.extension.autoexpands to a list of all extensions that register themselves via thecodemirror.registercommand.
This extension is, itself, designed to be extensible. For instance:
-
The CodeMirror Interact extension mentioned earlier is implemented as a separate VS Code extension in this same repository.
-
The popular iro.js color picker is also available as a separate extension in this repository.
And it's straightforward to make your own VS Code extension to provide other CodeMirror extensions!
Let's say you want CodeMirror Indentation Markers in VS Code. If you have Node.js installed, you just need to create four files. First, create a .vscodeignore file specifying what should be included in the package:
**
!dist
Next, put metadata and build scripts in package.json:
{
"publisher": "your-publisher-name",
"name": "codemirror-indentation-markers",
"version": "0.0.0",
"engines": {
"vscode": "^1.75.0"
},
"extensionDependencies": ["samestep.codemirror"],
"main": "./dist/extension.js",
"activationEvents": [
"onCommand:codemirror.open",
"onCommand:codemirror.openWordWrap",
"onCommand:codemirrorIndentationMarkers.extension"
],
"devDependencies": {
"@replit/codemirror-indentation-markers": "^6",
"@types/vscode": "^1",
"@vscode/vsce": "^3",
"codemirror-vscode": "^0.1",
"esbuild": "^0.25"
},
"scripts": {
"esm": "esbuild src/codemirror.ts --bundle --format=esm --external:@codemirror --external:@lezer --outdir=dist",
"cjs": "esbuild src/extension.ts --bundle --format=cjs --platform=node --external:vscode --outdir=dist",
"vsix": "vsce package --allow-missing-repository --skip-license",
"build": "npm run esm && npm run cjs && npm run vsix"
}
}Then, put your VS Code extension entry point in src/extension.ts:
import { CodeMirrorContext, ExtensionData } from "codemirror-vscode";
import * as vscode from "vscode";
export const activate = async (context: vscode.ExtensionContext) => {
const command = "codemirrorIndentationMarkers.extension";
context.subscriptions.push(
await vscode.commands.executeCommand("codemirror.register", command),
vscode.commands.registerCommand(
command,
async (cmCtx: CodeMirrorContext): Promise<ExtensionData<[]>> => ({
uri: cmCtx
.asWebviewUri(
vscode.Uri.joinPath(context.extensionUri, "dist", "codemirror.js"),
)
.toString(),
args: [],
}),
),
);
};And put the CodeMirror extension itself in src/codemirror.ts:
import { Extension } from "@codemirror/state";
import { indentationMarkers } from "@replit/codemirror-indentation-markers";
export default async (): Promise<Extension> => indentationMarkers();Then run a couple commands to build it:
npm install
npm run buildIf you're already in VS Code, right-click on the codemirror-indentation-markers-0.0.0.vsix file that just got created, and click Install Extension VSIX. And you're done! Now you'll get indentation markers when you execute Open in CodeMirror.
This is just a simple example, but you should be able to use the same pattern for pretty much any CodeMirror extension. If this doesn't work for your use case, feel free to open a GitHub issue or a pull request!
See CONTRIBUTING.md.
This project is licensed under the MIT License.


