1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
- 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
|