diff --git a/Cargo.lock b/Cargo.lock index eb38e755e..9df408569 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -94,17 +94,17 @@ dependencies = [ [[package]] name = "async-process" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8cea09c1fb10a317d1b5af8024eeba256d6554763e85ecd90ff8df31c7bbda" +checksum = "ef37b86e2fa961bae5a4d212708ea0154f904ce31d1a4a7f47e1bbc33a0c040b" dependencies = [ "async-io", "blocking", - "cfg-if 0.1.10", + "cfg-if 1.0.0", "event-listener", "futures-lite", "once_cell", - "signal-hook", + "signal-hook 0.3.4", "winapi", ] @@ -154,9 +154,9 @@ dependencies = [ [[package]] name = "bstr" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "473fc6b38233f9af7baa94fb5852dca389e3d95b8e21c8e3719301462c5d9faf" +checksum = "a40b47ad93e1a5404e6c18dec46b628214fee441c70f4ab5d6942142cc268a3d" dependencies = [ "memchr", ] @@ -296,7 +296,7 @@ dependencies = [ "libc", "mio", "parking_lot", - "signal-hook", + "signal-hook 0.1.17", "winapi", ] @@ -638,9 +638,9 @@ dependencies = [ [[package]] name = "idna" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9" +checksum = "de910d521f7cc3135c4de8db1cb910e0b5ed1dc6f57c381cd07e8e661ce10094" dependencies = [ "matches", "unicode-bidi", @@ -1096,9 +1096,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.61" +version = "1.0.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fceb2595057b6891a4ee808f70054bd2d12f0e97f1cbb78689b59f676df325a" +checksum = "ea1c6153794552ea7cf7cf63b1231a25de00ec90db326ba6264440fa08e31486" dependencies = [ "itoa", "ryu", @@ -1136,6 +1136,16 @@ dependencies = [ "signal-hook-registry", ] +[[package]] +name = "signal-hook" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "780f5e3fe0c66f67197236097d89de1e86216f1f6fdeaf47c442f854ab46c240" +dependencies = [ + "libc", + "signal-hook-registry", +] + [[package]] name = "signal-hook-registry" version = "1.3.0" @@ -1257,9 +1267,9 @@ dependencies = [ [[package]] name = "thread_local" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8208a331e1cb318dd5bd76951d2b8fc48ca38a69f5f4e4af1b6a9f8c6236915" +checksum = "8018d24e04c95ac8790716a5987d0fec4f8b27249ffa0f7d33f1369bdfb88cbd" dependencies = [ "once_cell", ] diff --git a/README.md b/README.md index 5d963d0f4..b3ca91074 100644 --- a/README.md +++ b/README.md @@ -17,73 +17,3 @@ # Installation 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 diff --git a/TODO.md b/TODO.md index e6b5efd1d..60bd003a2 100644 --- a/TODO.md +++ b/TODO.md @@ -1,18 +1,38 @@ -helper methods: iterate over selection spans in the document. - -- Implement marks (superset of Selection/Range) - Implement style configs, tab settings -- Visual tab width - Refactor tree-sitter-highlight to work like the atom one, recomputing partial tree updates. -- Only render highlights on screen -- proper selection rendering -- Undo tree -- selection mode -- key sequence shortcuts (gg etc) - syntax errors highlight query -- UI work: command line -- UI work: tab popup on command line - UI work: completion popup -- UI work: floating pane + +------ + +1 +- [ ] selection mode +- [x] % for whole doc selection +- [ ] vertical splits +- [ ] input counts (30j) +- [ ] retain horiz when moving vertically +- [ ] update lsp on redo/undo +- [ ] Implement marks (superset of Selection/Range) +- [ ] ctrl-v/ctrl-x on file picker +- [ ] linewise selection work +- [ ] goto definition +- [ ] nixos packaging +- [ ] CI binary builds + +2 +- extend selection (treesitter select parent node) (replaces viw, vi(, va( etc ) +- bracket pairs +- comment block (gcc) +- completion signature popups/docs +- multiple views into the same file + +3 +- diagnostics popups +- diff mode with highlighting? +- snippet support (tab to jump between marks) +- gamelisp/wasm scripting + +X +- rendering via skulpin/skia or raw wgpu diff --git a/doc/architecture.md b/doc/architecture.md new file mode 100644 index 000000000..743e9a75d --- /dev/null +++ b/doc/architecture.md @@ -0,0 +1,66 @@ + +# 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) +- transactions + - changes + - invert changes (generates a revert) + - 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) +- 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 via reverts +- (collab mode) +- gutter (line numbers, diagnostic marker, etc) -> ties into UI components +- rangeset/span -> mappable over changes (can be a marker primitive?) +- syntax (treesitter) +- 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) +- 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 diff --git a/flake.lock b/flake.lock index 505d7e95b..033f32e91 100644 --- a/flake.lock +++ b/flake.lock @@ -72,17 +72,16 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1611026386, - "narHash": "sha256-ZCYGAGUW9RMG5+Z1cdqrw1mstQqpuD66AB1U6ALpcDw=", + "lastModified": 1612751126, + "narHash": "sha256-S2DaaC799QcXIKkYZi1hI3SpMnr/d7oOCDI2bhYdXO0=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "a9b13ba83eaf2d07ae955a45b15fd96aa6994b70", + "rev": "03b9eee1062791187809d8c3f6a82e291761fc8c", "type": "github" }, "original": { "owner": "oxalica", "repo": "rust-overlay", - "rev": "a9b13ba83eaf2d07ae955a45b15fd96aa6994b70", "type": "github" } } diff --git a/flake.nix b/flake.nix index c1e2296e5..39e4683ff 100644 --- a/flake.nix +++ b/flake.nix @@ -4,7 +4,7 @@ inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; - rust-overlay.url = "github:oxalica/rust-overlay/a9b13ba83eaf2d07ae955a45b15fd96aa6994b70"; + rust-overlay.url = "github:oxalica/rust-overlay"; }; outputs = inputs@{ self, nixpkgs, rust-overlay, flake-utils, ... }: