| 🛟 Updated. 28d5985 k33g 18h ago | 1 | # Handoff — 2026-09-02 — code navigation, diagnostics, and better editing |
| 2 | |
| 3 | ## State |
| 4 | |
| 5 | Done and verified, on `feature/code-navigation` in all three repositories. Nothing is committed. |
| 6 | |
| 7 | turbo-core now asks the language server nine questions instead of one, and shows what it sends unasked: |
| 8 | |
| 9 | | Where | What | |
| 10 | | --- | --- | |
| 11 | | `lsp` | `References`, `Implementation`, `TypeDefinition` beside `Definition`, sharing one decoder; `DocumentSymbols`, `WorkspaceSymbols`, `Symbol`, `SymbolKind` | |
| 12 | | `app` | a **Code** menu with eight items; `chooseLocation`; `SymbolInFile`, `SymbolInProject`, `ShowProblems`; `AllDiagnostics` | |
| 13 | | `editor` | `Severity`, `SetMarks`, and the gutter glyph in the `diagnostic.*` theme keys | |
| 14 | |
| 15 | Then **ticket 19** was stacked on the same branch: double-click to select a word, `Ctrl-N` to insert a line above, `Ctrl-Y` to delete one — and **redo moved to `Ctrl-R`**, because `Ctrl-Y` was it. `buffer` gained `InsertLineAbove`, `DeleteLine` and `SelectWord`; `editor` gained `click.go` and an injectable clock. |
| 16 | |
| 17 | Suite green (16 packages), gate **PASS 0/0/0** at complexity 1802. Docs complete in EN and FR in all three. Verified against a real gopls in a pty. |
| 18 | |
| 19 | ## In flight |
| 20 | |
| 21 | Nothing half-done. |
| 22 | |
| 23 | ## Next steps |
| 24 | |
| 25 | 1. Review, commit, merge. |
| 26 | 2. **Release v0.4.0** — a large amount of new public API, so a minor bump. It carries both the Code menu and ticket 19, including the `Ctrl-Y` → `Ctrl-R` key change, which is the one thing in it a user will notice without being told. |
| 27 | 3. In each editor: `go get codeberg.org/turbo-editors/turbo-core@v0.4.0 && go mod tidy && make check`. Until then both build against v0.3.0; the Code menu simply is not in them yet. |
| 28 | |
| 29 | ## Open questions / blockers |
| 30 | |
| 31 | - None. The next things on the list, in the order I would take them: `workspace/symbol` and `documentSymbol` are done, so what remains is **rename** — which needs `WorkspaceEdit` machinery (apply edits across files, some unopened, as one undo) and unlocks `codeAction` and `formatting` after it. |
| 32 | |
| 33 | ## Watch out for |
| 34 | |
| 35 | - **gopls is now installed in this sandbox** (`~/go/bin/gopls`, via `go install`). It was not before, and the end-to-end runs need it. rust-analyzer is still absent. |
| 36 | - **Diagnostics are keyed by absolute path, on all three sides** — read, write and delete. `diagnosticKey` does it. Removing it from any one of them reintroduces a bug that no unit test catches unless the test opens its file by a *relative* path. |
| 37 | - **Open a file that does not compile, in a pty, before believing anything about diagnostics.** They are the only feature whose failure looks exactly like success: no error to show and no error findable are the same blank gutter. |
| 38 | - **The two symbol shapes are told apart by `selectionRange`.** Not by `children`, which is optional — that mistake reads the nested shape as flat and loses every position, silently. |
| 39 | - **A test that passes vacuously.** `MarkNone` has no glyph, so drawing it emits NUL, which a simulated screen shows as a blank — the drawing looks right whether or not the guard exists. That test asserts on `markOf` instead. Look for the same shape elsewhere. |
| 40 | - **`Ctrl-Shift-O` is not a key a terminal can deliver.** Neither is any other Ctrl-Shift-letter. Check before putting one in a menu. |
| 41 | - The `×` glyph and its siblings are single-width characters chosen because the gutter has exactly one column. A wider glyph would push the text. |
| 42 | - **Clicks are counted only when no drag is in progress.** tcell sends `Button1` for every event of a drag as well as for a press; counting those turns a slow drag into a double click halfway through. There is a test named for it. |
| 43 | - **`DeleteLine`'s one-line case is defensive, not load-bearing.** Removing it changes no behaviour — the range it would otherwise build starts on line −1 and `clamp` pulls it back to 0. It is kept for saying what it means, and a comment says so, but do not expect a test to catch its removal. |
| 44 | - **`Ctrl-Shift-<letter>` is never available.** That is twice now: `Ctrl-Shift-O` for a symbol search, `Ctrl-Shift-Z` for redo. Check before putting one in a menu. |