My mods of a post-modern modal text editor.
Find a file
Blaž Hrastnik 1da0be0aa0
Merge pull request #1 from helix-editor/insertKeymapMove
moved insert keymap to keymap.rs
2020-10-01 11:57:43 +09:00
.github/workflows Checkout submodules on clone. 2020-09-12 19:35:26 +09:00
helix-core Fix test, break split + append 2020-09-29 18:13:19 +09:00
helix-syntax Extend selection commands. 2020-09-29 01:00:35 +09:00
helix-term removed redundant line 2020-10-01 01:23:06 +02:00
helix-view moved insert keymap to keymap.rs 2020-10-01 01:15:42 +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 Extend selection commands. 2020-09-29 01:00:35 +09:00
Cargo.toml Split parts of helix-term into helix-view. 2020-09-21 18:24:16 +09:00
README.md Split parts of helix-term into helix-view. 2020-09-21 18:24:16 +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
  • server-client architecture via gRPC, UI separate from core
  • multi cursor based editing and slicing
  • WASM based plugins (builtin LSP & fuzzy file finder)
  • piece table-based tree structure for changes

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)

TODO: determine rust vs script portions

vim stuff: motions/operators/text objects full visual mode macros jump lists marks yank/paste conceal for markdown markers, etc


codemirror uses offsets exclusively with Line being computed when necessary (with start/end extents) lines are temporarily cached in a lineCache