My mods of a post-modern modal text editor.
Find a file
2020-10-20 23:02:02 +02:00
.github/workflows Checkout submodules on clone. 2020-09-12 19:35:26 +09:00
helix-core Bugfix 2020-10-16 16:58:26 +09:00
helix-syntax added tab to insert mode 2020-10-04 15:40:16 +09:00
helix-term completion highlighting 2020-10-20 23:02:02 +02:00
helix-view completion highlighting 2020-10-20 23:02:02 +02:00
.gitignore Incremental parsing: rough draft. 2020-09-17 16:32:40 +09:00
.gitmodules More robust syntax detection/grammar loading. 2020-09-22 18:27:37 +09:00
Cargo.lock Updated dependencies. 2020-10-14 14:34:09 +09:00
Cargo.toml Split parts of helix-term into helix-view. 2020-09-21 18:24:16 +09:00
README.md Update README. 2020-10-13 23:13:56 +09:00
TODO.md More robust syntax detection/grammar loading. 2020-09-22 18:27:37 +09:00

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