The official plugins for Vem, a canvas-native modal editor. Each
plugin is a standalone @vemjs/plugin-api VemPlugin — a plain object with an activate(context)
function — published as its own npm package so consumers only install what they use.
| Package | What it does |
|---|---|
@vemjs/plugin-autopairs |
Auto-closes brackets/quotes in INSERT mode, with type-over instead of duplicating |
@vemjs/plugin-git |
Gutter add/change/delete signs from git diff (Node/Bun runtimes only) |
@vemjs/plugin-layout-customizer |
Toggle sidebar position/statusbar position, resize the sidebar |
@vemjs/plugin-lualine |
A lualine-style statusline (mode/file/position segments) |
@vemjs/plugin-telescope |
Fuzzy file finder and help-tag picker (:Telescope-style popups) |
@vemjs/plugin-treesitter |
Syntax highlighting (:syntax on) |
@vemjs/plugin-trim-whitespace |
Strips trailing whitespace on save |
Most of these are deferred/opt-in by default in vem.run and
vem-desktop — Vem boots as a faithfully blank Vim, and
appearance plugins (lualine, treesitter) activate on demand via :Lualine / :syntax on.
Each plugin is a Bun workspace member with its own package.json, tests, and build:
git clone https://github.com/vemjs/vem-plugins.git
cd vem-plugins
bun install
bun test # runs every plugin's test suite
bun run build # builds every pluginTo work on one plugin in isolation:
cd autopairs
bun testA VemPlugin is:
import { type VemPlugin } from "@vemjs/plugin-api";
export const MyPlugin: VemPlugin = {
name: "my-plugin",
version: "0.1.0",
activate(context) {
const editor = context.editorState;
// context.onDidChangeBuffer / onDidChangeMode / onDidOpenBuffer / onSave,
// context.registerCommand, context.registerKeybinding — see @vemjs/plugin-api.
},
};Plugins that need real system access (shelling out, filesystem, native APIs) only work in a
Node/Bun runtime — both vem.run's browser build and vem-desktop's Tauri webview always have
window defined and no child_process, so gate any such logic on
typeof window === "undefined" and fail closed (no fabricated behavior) rather than guessing, the
way @vemjs/plugin-git does for its git diff gutter signs.
Each plugin is versioned independently via Changesets. Add one for any user-visible change:
bun run changesetMerging to main with pending changesets opens (or updates) a "Version Packages" PR; merging that
PR publishes the bumped packages to npm automatically.
- vem — the editor engine these plugins target
(
@vemjs/core,@vemjs/plugin-api) - vem-website — vem.run, which loads the official plugin set from this repo
- vem-desktop — the desktop shell, same plugin set
MIT