.github/workflows | ||
helix-core | ||
helix-syntax | ||
helix-term | ||
helix-view | ||
.gitignore | ||
.gitmodules | ||
Cargo.lock | ||
Cargo.toml | ||
README.md | ||
TODO.md |
Helix
Crate | Description |
---|---|
helix-core | Core editing primitives, functional. |
helix-syntax | Tree-sitter grammars |
helix-view | UI abstractions for use in backends, imperative shell. |
helix-term | Terminal UI |
Installation
git clone --depth 1 --recurse-submodules -j8 https://github.com/helix-editor/helix
cd helix
cargo install --path helix-term
This will install the hx
binary to $HOME/.cargo/bin
.
Notes
- server-client architecture via gRPC, UI separate from core
- multi cursor based editing and slicing
- WASM based plugins (builtin LSP & fuzzy file finder)
Structure similar to codemirror:
-
text (ropes)
-
column utils, stuff like tab aware (row, col) -> char pos translation
-
word/grapheme/code point utils and iterators
-
state
-
transactions
- changes
- annotations (time changed etc)
- state effects
- additional editor state as facets
-
snapshots as an async view into current state
-
selections { anchor (nonmoving), head (moving) from/to } -> SelectionSet with a primary
- cursor is just a single range selection
-
markers track a position inside text that synchronizes with edits
-
{ doc, selection, update(), splice, changes(), facets, tabSize, identUnit, lineSeparator, changeFilter/transactionFilter to modify stuff before }
-
view (actual UI)
-
renders via termwiz
-
viewport(Lines) -> what's actually visible
-
extend the view via Decorations (inline styling) or Components (UI)
- mark / wieget / line / replace decoration
-
commands (transform state)
-
movement
-
selection extension
-
deletion
-
indentation
-
keymap (maps keys to commands)
-
history (undo tree via immutable ropes)
-
undoes transactions
-
invert changes (generates a revert)
-
(collab mode)
-
gutter (line numbers, diagnostic marker, etc) -> ties into UI components
-
rangeset/span -> mappable over changes (can be a marker primitive?)
-
syntax (treesitter)
-
indentation strategies
-
fold
-
selections (select mode/multiselect)
-
matchbrackets
-
closebrackets
-
special-chars (shows dots etc for specials)
-
panel (for UI: file pickers, search dialogs, etc)
-
tooltip (for UI)
-
search (regex? pcre)
-
lint (async linters)
-
lsp
-
highlight (?)
-
stream-syntax
-
autocomplete
-
comment (gc, etc for auto commenting)
-
snippets
-
terminal mode?
-
plugins can contain more commands/ui abstractions to use elsewhere
-
languageData as presets for each language (syntax, indent, comment, etc)
Vim stuff:
- motions/operators/text objects
- full visual mode
- macros
- jump lists
- marks
- yank/paste
- conceal for markdown markers, etc