A full-featured Vim editor component with syntax highlighting powered by Shiki.
Installation
npm install @vimee/core @vimee/react @vimee/shiki-editor shiki
Usage
import { use } from "react";
import { Vim } from "@vimee/shiki-editor";
import { createHighlighter } from "shiki";
import "@vimee/shiki-editor/styles.css";
const highlighterPromise = createHighlighter({
themes: ["github-dark"],
langs: ["typescript"],
});
function App() {
const highlighter = use(highlighterPromise);
return (
<Vim
content="const hello = 'world';"
highlighter={highlighter}
lang="typescript"
theme="github-dark"
onChange={(content) => console.log(content)}
/>
);
}
Props
| Prop | Type | Default | Description |
|---|---|---|---|
content |
string |
(required) | Editor content |
highlighter |
HighlighterGeneric |
(required) | Shiki highlighter instance |
lang |
string |
(required) | Language identifier |
theme |
string |
(required) | Shiki theme name |
shikiOptions |
Record<string, unknown> |
— | Extra Shiki options |
cursorPosition |
string |
"1:1" |
Initial cursor (1-based) |
onChange |
(content: string) => void |
— | Content change callback |
onYank |
(text: string) => void |
— | Yank callback |
onSave |
(content: string) => void |
— | Save callback |
onModeChange |
(mode: VimMode) => void |
— | Mode change callback |
onAction |
(action: VimAction, key: string) => void |
— | Action callback |
className |
string |
— | Container CSS class |
readOnly |
boolean |
false |
Disable editing |
autoFocus |
boolean |
false |
Auto-focus on mount |
indentStyle |
"space" | "tab" |
"space" |
Indent character |
indentWidth |
number |
2 |
Indent width |
showLineNumbers |
boolean |
true |
Show line numbers |
Sub-components
The package also exports individual sub-components for custom layouts:
<Cursor />— Renders the editor cursor<Line />— Renders a single highlighted line<StatusLine />— Renders the Vim status bar
Hooks
useShikiTokens(highlighter, content, lang, theme, extraOptions?)— Tokenize content with ShikicomputeSelectionInfo(cursor, visualAnchor, buffer)— Compute visual selection ranges
CSS
Import the base styles:
import "@vimee/shiki-editor/styles.css";