Skip to content

CodeMirror packages

Acode re-exports the CodeMirror 6 and Lezer packages used by the app so plugins can share the same module instances as the editor (important for extensions, facets, and state fields).

js
const cm = acode.require("codemirror");

const { EditorView } = cm.view;
const { EditorState, StateField, StateEffect } = cm.state;
const { syntaxTree } = cm.language;
const { tags } = cm.lezer;

Namespace shape

KeyPackage
cm.autocomplete@codemirror/autocomplete
cm.commands@codemirror/commands
cm.language@codemirror/language
cm.lint@codemirror/lint
cm.search@codemirror/search
cm.state@codemirror/state
cm.view@codemirror/view
cm.lezer@lezer/highlight plus nested common, highlight, lr

Direct package requires

You can also require packages by their npm names (same instances as above):

js
const view = acode.require("@codemirror/view");
const state = acode.require("@codemirror/state");
const language = acode.require("@codemirror/language");
const autocomplete = acode.require("@codemirror/autocomplete");
const commands = acode.require("@codemirror/commands");
const lint = acode.require("@codemirror/lint");
const search = acode.require("@codemirror/search");

const lezerCommon = acode.require("@lezer/common");
const lezerHighlight = acode.require("@lezer/highlight");
const lezerLr = acode.require("@lezer/lr");

TIP

Prefer these requires over bundling your own copy of CodeMirror. Duplicate packages often break extension composition (EditorState / facet identity mismatches).

  • Active editor: editorManager.editor — see EditorManager
  • Language registration: acode.require("editorLanguages") — see Editor Languages
  • Theme registration: acode.require("editorThemes") — see Editor Themes
  • Language servers: acode.require("lsp") — see LSP
  • Static highlighter for snippets and plugin tabs: acode.require("codeHighlight") — see Code Highlight

Minimal extension example

js
const cm = acode.require("codemirror");
const { EditorView } = cm.view;
const { StateField } = cm.state;

const demoField = StateField.define({
  create() {
    return 0;
  },
  update(value) {
    return value;
  },
});

// Plugins typically register language/theme extensions via
// editorLanguages / editorThemes rather than patching the view directly.
void demoField;
void EditorView;

Released under the MIT License.