All checks were successful
Publish codemirror-helix / publish (push) Successful in 2m19s
70 lines
2.7 KiB
Markdown
70 lines
2.7 KiB
Markdown
# @gregorlohaus/codemirror-helix
|
|
|
|
[Helix](https://helix-editor.com/)-style modal editing for [CodeMirror 6](https://codemirror.net/).
|
|
|
|
Selection-first editing with multiple selections, Normal/Insert/Select modes,
|
|
goto & match modes, textobjects, surround, registers, counts, and search.
|
|
|
|
> A **core motions subset** — broad coverage of everyday Helix keys, not full
|
|
> parity. No tree-sitter textobjects, LSP gotos, macros, or jumplist.
|
|
|
|
## Install
|
|
|
|
```sh
|
|
bun add @gregorlohaus/codemirror-helix
|
|
# peers: @codemirror/{state,view,commands,language,search}
|
|
```
|
|
|
|
## Usage
|
|
|
|
```ts
|
|
import { EditorView, basicSetup } from "codemirror";
|
|
import { helix } from "@gregorlohaus/codemirror-helix";
|
|
|
|
new EditorView({
|
|
doc: "hello world",
|
|
extensions: [basicSetup, helix()],
|
|
parent: document.body,
|
|
});
|
|
```
|
|
|
|
`helix()` needs a selection drawer for multi-cursor rendering — `basicSetup`
|
|
(or `drawSelection()`) covers it.
|
|
|
|
### Options
|
|
|
|
```ts
|
|
helix({
|
|
startInInsert: false, // start in Normal mode (default)
|
|
statusBar: true, // show the bottom mode line
|
|
// Let an open autocomplete popup eat the first Escape instead of leaving Insert:
|
|
escapeGuard: (state) => completionStatus(state) === "active",
|
|
});
|
|
```
|
|
|
|
## Keys
|
|
|
|
Starts in **Normal** mode. The status line shows the mode, pending count,
|
|
register, and selection count.
|
|
|
|
| Group | Keys |
|
|
| --- | --- |
|
|
| Modes | `i`/`a` insert before/after, `I`/`A` line start/end, `o`/`O` open line, `v` select (extend), `Esc` normal |
|
|
| Motion | `h j k l`, `w W b B e E`, `f t F T {char}`, `Alt-.` repeat find, `Home`/`End`, counts (`3w`) |
|
|
| Goto `g` | `gg`/`Ng` line, `ge` end, `gh`/`gl` line ends, `gs` first non-blank, `gt`/`gc`/`gb` view top/center/bottom |
|
|
| Select | `x` line (repeat extends), `X` line bounds, `%` all, `;` collapse, `Alt-;` flip, `Alt-:` forward, `,` keep primary, `Alt-,` remove primary, `(`/`)` rotate, `_` trim |
|
|
| Multi | `s` select regex, `S` split, `K`/`Alt-K` keep/remove, `C` copy selection below, `Alt-C` above |
|
|
| Match `m` | `mm` matching bracket, `mi{o}`/`ma{o}` inside/around (`w W p ( [ { < " ' \` m`), `ms{c}` surround, `md{c}` delete, `mr{c}{c}` replace |
|
|
| Edit | `d` delete, `c` change, `y` yank, `p`/`P` paste, `R` replace w/ register, `r{c}` replace char, `~`/`` ` ``/`Alt-`` ` `` case, `J` join, `>`/`<` indent, `u`/`U` undo/redo |
|
|
| Registers | `"{c}` select register for the next yank/delete/paste |
|
|
| Search | `/` `?` search, `n`/`N` next/prev, `*` search selection |
|
|
| View | `zz`/`zt`/`zb` center/top/bottom, `Ctrl-d`/`Ctrl-u` half page, `Ctrl-f`/`Ctrl-b` page |
|
|
| Clipboard | `space y` copy, `space p`/`space P` paste (system clipboard) |
|
|
|
|
`s`/`S`/`K`/`Alt-K` open a prompt and preview live as you type the regex;
|
|
`Enter` commits, `Esc` restores the original selection.
|
|
|
|
## License
|
|
|
|
MIT
|