diff options
Diffstat (limited to 'docs')
| -rw-r--r-- | docs/design.typ | 3 | ||||
| -rw-r--r-- | docs/helix-keys.md | 14 | ||||
| -rw-r--r-- | docs/lsp-evaluation.md | 2 |
3 files changed, 12 insertions, 7 deletions
diff --git a/docs/design.typ b/docs/design.typ index 3e387f7a..2a60c088 100644 --- a/docs/design.typ +++ b/docs/design.typ @@ -323,7 +323,8 @@ plus the `macos-app` step for `pardes.app` wrapped around a static `libpardes.a` on a Darwin host. Native dependencies are ghostty, vaxis, uucode (shared config), zstbi, SDL (a pinned fork, lazy), FreeType, MuPDF (`-Dmupdf`, on by default everywhere but the web, lazy), ZLS, mvzr (the regex engine behind `s`/`S`), and -zig-tree-sitter + 26 grammars — all pinned +zig-tree-sitter + 29 grammars for 28 languages (markdown takes two: block and +inline) — all pinned through `zig fetch` and wired in `build.zig`. Generated during the build: `highlights.scm` → an options module; the vendored helix/zed theme sources → the generated half of the theme ring; working-tree `.zig` sources → diff --git a/docs/helix-keys.md b/docs/helix-keys.md index da969574..b307ae30 100644 --- a/docs/helix-keys.md +++ b/docs/helix-keys.md @@ -45,8 +45,12 @@ layer: gap offsets + ranges over the flat text). Differential harness: drop/alter typed insertion runs. All "To implement" edit ops follow the same rule (motion/selection parts work on the full motion surface; the mutating half is file-pane only or run-only). -- **No soft wrap** in pardes file panes — visual line == textual line, so - helix's visual/textual distinction (`j` vs `gj`) collapses. +- **Soft wrap is a toggle** (`Wrap`, `SPC t w`, on by default), and the + visual/textual pair is assigned the other way round from helix: `j`/`k` are + TEXTUAL file lines, `gj`/`gk` follow the automatic breaks. A file pane's `j` + is expected to move one line of the FILE; helix makes `j` the visual one and + `gj` the textual one. With the toggle off a line is one visual row and the + two pairs are the same motion. - **Undo is snapshot-per-edit-op / per-insert-session**, not a transaction log. Anything requiring replayable edits (`.`, macros) needs new machinery. @@ -64,7 +68,7 @@ language-backend queries, and the shell pipe. | Key | Behavior (pardes today) | Notes / quirks vs helix | Parity | | --- | --- | --- | --- | -| `h` `j` `k` `l`, arrows | char left/right, line up/down — collapse the selection to a point (helix) | no soft wrap so `j`/`k` are both visual and textual; sticky col, phantom-line-blocked | helix-verified | +| `h` `j` `k` `l`, arrows | char left/right, line up/down — collapse the selection to a point (helix) | `j`/`k` are TEXTUAL lines even under soft wrap (`gj`/`gk` are the visual pair — the reverse of helix's assignment, see the divergence above); sticky col, phantom-line-blocked | helix-verified (unwrapped) | | `w` `b` `e` | select to next word start / prev word start / next word end | full helix model incl. landing conventions (block cursor one before the next word after `w`) and newline/punct/EOF edges | helix-verified | | `W` `B` `E` | long-word (WORD) variants | same | helix-verified | | `Home` / `End` | line start / line end | matches `goto_line_start` / `goto_line_end` | helix-verified | @@ -88,7 +92,7 @@ language-backend queries, and the shell pipe. | `y` | yank selection; bare cursor yanks the 1-wide selection (char under cursor) | line-yank vim-ism removed (phase 5); yank keeps selection AND cursor (helix). Writes the DEFAULT REGISTER and nothing else — the system clipboard is `SPC y`, which is helix's own split and so moves this row TOWARDS helix, not away: a `d` of one character can no longer clobber what the desktop was holding | helix-verified | | `u` / `U` | undo / redo | restores the pre-edit selection (helix); snapshot granularity, no `Alt-u`/`Alt-U` history walking (skipped) | helix-verified | | `p` (normal) | paste the core's yank register after the selection | helix default-register semantics, and only the register — nothing on this path reads or writes the system clipboard. `SPC p` is the word that does, and on a tty its read is OSC 52, which most terminals refuse: an honest no-op there rather than a paste of the wrong text | helix-verified | -| `Esc` (body normal) | clear a pending modal prefix / exit select mode, keeping the selection, then run `Last`: hop to the pane you were in before this one, whichever kind it was, exactly like `SPC j j` — so held down it alternates between two panes, two files as readily as a file and its shell | Pardes-specific focus binding layered on helix's cleanup. A leader path, tag, topbar or search owns Esc while it is active; raw tty forwards it | pardes-specific (cleanup helix-verified) | +| `Esc` (body normal) | clear a pending modal prefix / exit select mode, keeping the selection, then run `Last`: hop to the pane you were in before this one, whichever kind it was, exactly like `SPC j j` — so held down it alternates between two panes, two files as readily as a file and its shell. A PDF pane is the ONE exception: there Esc is the document's own cancel (drop the mouse selection and the search overlay, stay where you are reading) and `Shift-Esc` is the hop out, the same chord that leaves a raw tty | Pardes-specific focus binding layered on helix's cleanup. A leader path, tag, topbar or search owns Esc while it is active; raw tty forwards it | pardes-specific (cleanup helix-verified) | | `Esc` (insert) | back to normal mode, cursor right after the insertion (no vim left-step) | | helix-verified | | `Enter` (normal) | acme **look** chord: EXPLICIT selection, else file-ish word under cursor | pardes-specific, keep (helix normal-mode Enter unbound). Covers helix `gf`. Implicit motion residue falls back to the cursor word | pardes-specific | | `Tab` (normal) | acme **execute** chord | pardes-specific, keep; explicit-selection rule as Enter | pardes-specific | @@ -143,7 +147,7 @@ Phase 2 state added to `Pane`: `count` (accumulator, capped 0xffff), | `g|`, `<n>g|` | goto column n (1 = line start), clamped to the line | | helix-verified (phase 5) | | `gs` | goto first non-whitespace | alias of the `^` handler | helix-verified (phase 5) | | `gt` / `gc` / `gb` | goto screen top / center / bottom | view-relative (`pane.scroll()` + `pane.rows`), column kept (clamped) | helix-verified (phase 5) | -| `gj` / `gk` | textual line down / up (+ count) | alias `j`/`k` — no soft wrap | helix-verified (phase 5) | +| `gj` / `gk` | VISUAL line down / up (+ count) | follows the wrapped body's own breaks (`file_pane.visualRow`, the same walk `fillBody` renders), keeping the goal column INSIDE the row; the last row of a line steps into the next line's first. Wrap off = one row per line, and this IS `j`/`k`. helix assigns the pair the other way round (its `j` is the visual one) | pardes-specific | | `PageUp` / `PageDown` | FULL page (was half) | `Ctrl-u`/`Ctrl-d` stay the half-page pair | helix-verified (phase 5) | ### Changes diff --git a/docs/lsp-evaluation.md b/docs/lsp-evaluation.md index 55049ec6..d9fcd243 100644 --- a/docs/lsp-evaluation.md +++ b/docs/lsp-evaluation.md @@ -118,7 +118,7 @@ second process, and its weakest number is a cache that does not exist rather than a limit that cannot be lifted. The one thing that should override that: **pardes ships tree-sitter grammars for -27 languages.** C is Zig-only forever; B is the only implementation that will +28 languages.** C is Zig-only forever; B is the only implementation that will ever answer `gd` in a Rust or Go buffer. If language intelligence is meant to follow the syntax highlighting, B is the strategic choice and its 721 lines are the cheapest multi-language client anyone will write. |
