Handoff — 2026-08-30 — initial build of the editor
State
The editor is finished and working against the original request: Turbo C-style interface, Go syntax colouring, themes, and gopls completion.
make buildproducesbin/turbo-go;make testis green across every package; the quality gate passes with zero smells.- The LSP client has been driven against a real gopls 0.23.0 and got
strings.Containsback from a completion atstrings.. - Documentation is complete in English and French, and every package has its own
README.md.
Nothing is half-written. There is no work in flight.
The one thing to do before anything else
Run it in a real terminal.
Every visual claim in this repository comes from tcell.SimulationScreen. It is a real Screen and it exercises the real drawing code, but it is not a TTY. What has not been observed on an actual terminal emulator:
- whether the 24-bit colours in
turbo-darkandborland-lightlook as intended, and whetherturbo-classicdegrades correctly on a 16-colour terminal - whether mouse reporting works — window dragging, corner resizing, click-to-place-cursor
- whether
Alt-letter reaches the program, or is eaten by the terminal emulator (this varies a lot; if it is,F10plus arrows is the fallback and the docs already say so) - whether resizing the window mid-session redraws cleanly
make build && ./bin/turbo-go main.go
If something is wrong there, it is almost certainly in internal/ui/painter.go or in how main.go sets the screen up — not in the widgets, which are well covered.
Next steps, in the order I would take them
- Real-terminal pass (above). Everything else is speculative until this is done.
- Show diagnostics where the error is.
Language.Diagnostics(path)already holds them per file; the status bar shows only the first error. A coloured marker in the gutter, or the offending span underlined, would use what is already there. The theme keysdiagnostic.error/warning/infoexist and are currently unused by anything that draws. - CI. There is none.
make checkplus the quality report is the whole gate and it runs by hand. - Try it on macOS and Windows.
lsp.PathToURIhas a drive-letter path andtheme.UserDirusesos.UserConfigDir; neither has ever run outside Linux. - Profile a large file. The syntax cache re-scans on revision change, not on redraw, so scrolling should be free — but
buffer.Text()rebuilds the whole string on every scan, and on a 50 000-line file that may well be the thing that hurts.
Open questions / blockers
.tickets/0001-specifications.yamlis an empty issue created before this work. It was never filled in, and I did not touch it. Worth either writing up or deleting.- No licence header policy.
LICENSEexists; no source file carries a header. Fine either way, but decide before the first outside contribution. kits/is untracked and excluded from qlty. If it is meant to be committed, the exclusion comment in.qlty/qlty.tomlexplains what it hides; if it is not,.gitignorewould be the more honest place to put it.
Watch out for
- LSP columns are UTF-16, editor columns are runes.
RuneToUTF16/UTF16ToRunesit at the boundary. On ASCII the two agree, so a mistake here passes every test until a file has an accent in it. There is a test using a musical clef precisely because it needs a surrogate pair. - gopls waits for its client to answer
workspace/configuration. Ignore server-to-client requests and initialisation hangs with no error at all.Client.handleRequestis what stops that. - Measure screen widths in runes, never bytes.
len("[■]")is 5; the box is 3 columns. This produced a real off-by-two in the window close box. - In a dialog, the focused control must see the arrows before the focus ring does. Getting this backwards makes every list box unusable by keyboard. Two tests in
internal/ui/dialog_test.gopin it. Painter.Subtakes absolute screen coordinates; every drawing call takes local ones. That asymmetry is deliberate and documented at the method, but it is the one thing ininternal/uithat will surprise you.- The quality gate is not
make test. Both have to pass, and the quality report is a separate command.
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 |
|