summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAge
...
* | A ^ after | anchors its branch: ^def|^ finds lines starting either wayGabriel Schneider30 hours
| | | | | | | | | | | | mvzr takes ^ only at its pattern's start, so in ^def|^ the second branch never matched mid-text. An alternation whose every top-level branch starts with ^ is now compiled as ^(def| ); a mix of anchored and unanchored branches is refused rather than silently wrong. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A buffer whose file was deleted on disk is dirty, and Del asks firstGabriel Schneider30 hours
| | | | | | | | | | | | A file deleted under an open buffer left dirty 0 and let Del, Exit and the rest throw the only copy of its text away unasked. It now counts as dirty, as acme's does, and the refusals ask about it. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | Every child starts with its signals at their defaults and none blockedGabriel Schneider30 hours
| | | | | | | | | | | | Shells, command panes, language servers, the link opener and the v9fs mount inherited the editor's signal mask (the tty's blocked SIGWINCH) and anything it ignored (a SIGHUP nohup ignored), since only handlers reset at exec. Each fork now resets every disposition and clears the mask before its exec (resetChildSignals); std's spawn for selection pipes runs with the mask cleared across it. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A path with a part over 255 bytes is refused, never a panicGabriel Schneider30 hours
| | | | | | | | | | | | std's statFile takes the kernel's ENAMETOOLONG for a bug (errnoBug), so a name, look, DumpDir or Save path with a part over 255 bytes panicked the editor (exec.kindOf via writeName, recentKeeps, dumpFailed). Every non-test statFile now goes through fs.statPath, which refuses such a name as NameTooLong first; fs.py drives long, looping, not-a-directory and not-ours paths through name, look, DumpDir, Dump and Save. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | The GUI's idle wakeup copies no 20 KB message batchGabriel Schneider30 hours
| | | | | | | | | | | | Queue.take built its batch (queue capacity plus room, some 20 KB) and returned it by value on every wakeup, a memset and a memcpy of it though the queue was empty; it led the idle profile. drainQueue now fills a batch the Shell keeps, and an empty queue leaves it untouched. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | Typing tells g. where its edit ended, so no edit scans the whole file twice ↵Gabriel Schneider30 hours
|/ | | | | | | | to find it setEditText found the last edit's end by comparing the old and new texts from both ends and counting rows to it, twice over the file on every keystroke: edit-char grew with the file (+135% at 300k lines). Typing, deleting, Enter and Tab now pass the end they know (setEditTextEnd); the comparison stays for the edits that do not say (paste, pipes, s). perf edit-char: 50k lines 16661 -> 15286 us, 300k lines 30507 -> 22291 us (render alone ~13.6 ms of each, the render agent's). Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The theme's chrome is worked out once, not per grapheme; still post passes ↵Gabriel Schneider30 hours
| | | | | | | | | | | | | | | | | | | | | | | | | | | | let the GUI rest; a perf gate somtrmsz's contrast floors made ChromeTheme.fromTheme run its focus-tint and separator searches (pow calls each), and Output's RowDecoration.styleAt called it for every grapheme of every highlighted row: the 50k-line file's render went from 0.11 ms to 13 ms. Pardes.bodyChrome now keeps the theme's chrome, worked out again only when the theme differs; recolorSyntax asks for it once a decorated row, and a plain row (nearly every row of a file) never asks. ReleaseFast, medium fixture, median us, before -> after (main): render 13150 -> 76 (111), key-down 14658 -> 79 (110), wheel 13589 -> 76 (109), open 14891 -> 2095 (2055), edit-char 16703 -> 3006 (1251; the rest of that gap is editing and tree-sitter, not this). Post.animating asked for frames whenever the window had focus and any pass was ready, so a still pass kept the GUI drawing at the display's rate (Bloom: 49% of a core idle, in a hidden test window). A pass now says whether it moves on its own: the CRT (its hum and dither) and a Shadertoy file whose source reads iTime, iFrame or iDate (shader_build.readsTime; the flag rides the wire's post message); Bloom, Vignette and Grain are still. Bloom idle: 49% -> 1.2%, as with no pass. zig build perf-gate: the 50k-line file's gestures, each's fastest sample within 3x of the recorded baseline's (test/perf-baseline-<platform>- <optimize>.json, recorded from this build), run with every unit-test. On the regressed code it fails at 180x for render.
* A listing freezes at its open, so a read in several chunks never splices two ↵Gabriel Schneider30 hours
| | | | | | | | moments /index and the other listings were rendered afresh for each read, so a client reading one in chunks while panes changed got rows from two moments spliced together (the fs-test flake). /index, /layout, /recent, /commands, /status, /listeners and a ctl opened only to read now freeze at the open, as /screen does. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The docs give Newcol's minimum column width beside its 16-column capGabriel Schneider30 hours
| | | | | | A column narrower than twice the 10-cell minimum refuses Newcol (too narrow to split), which the docs left out. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A Jumplist entry is (closed) only while no pane has its file openGabriel Schneider30 hours
| | | | | | A closed file's entries stayed closed after the file was opened again another way (a look, Recent), so Jumplist said (closed) of an open file and a step onto it reopened it. They are now that pane's as soon as a pane shows the file. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* +Unsaved drops a pane once it has closedGabriel Schneider30 hours
| | | | | | The list kept a pane's Modified row after the pane was closed (discarded), so it named text there was no longer anything to lose of. A pane's closing now takes its row out. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* After a failed address, one that goes from it (., +, -) says there is noneGabriel Schneider30 hours
| | | | | | addr kept the old address under a failed one, and an address written relative to it went from that old one. Such an address now fails with no address: the last one written to addr failed, until one that stands alone is written. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* DumpDir reads back absolute and without a trailing slashGabriel Schneider30 hours
| | | | | | A relative DumpDir read back as written, relative, and a trailing / stayed. It now resolves against the directory pardes started in, as a Dump already did, and is shown cleaned. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A bash or fish under another name gets its prompt marksGabriel Schneider30 hours
| | | | | | The shell's kind was read from its file name alone, so a renamed or differently linked bash got no marks and read busy for ever. A name that says nothing now resolves its links, then looks in the program for bash's or fish's own strings; a POSIX shell's name (sh, even when it is bash) is taken at its word. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Tty or Shell naming a file that is there but not executable says soGabriel Schneider30 hours
| | | | | | It said no shell "x", not found, as for a name that is nowhere. A file that exists without its execute bit now says not a shell: x is not executable. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Symbols, Diagnostics and every language server list share their directory's ↵Gabriel Schneider30 hours
| | | | | | | | one +Search Only Find and Grep reused the directory's +Search; a language server's list made another pane of the same name each time. Every origin named +Search now shares it, but a plain word's search, which keeps a list a pattern for n/N to walk between. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The docs say what the code does: body's > replaces and >> appends, an ↵Gabriel Schneider30 hours
| | | | | | | | image's tag starts with its modes, a Dump's refusal names its file The SKILL's example wrote body with > and called it an append; an image's tag begins with its mode words, not its path; the Dump refusals show the dump file's path. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A pattern with a newline and an anchor mvzr would misread is refused EINVAL, ↵Gabriel Schneider30 hours
| | | | | | | | as the doc says Its words named no malformed input, so 9ns read the refusal as EIO, and Edit's failed EIO directly. It now says bad regular expression: ..., and Edit's failure with those words is EINVAL too. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* addr takes a row's range, L:C-L2:C2 or L:C-C2, so a Recent, +Search or ↵Gabriel Schneider30 hours
| | | | | | | | Jumplist row pastes in The rows spell a range L:C-L2:C2 (inclusive), which addr read as L:C then back L2 lines. After an L:C, a - and a number is now that range, through its last character; the docs set both spellings side by side. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A look at a corrupt image fails with an err rather than open a blank paneGabriel Schneider30 hours
| | | | | | An image stb_image could not read opened as an empty image pane, the look succeeding. The bytes' header is now checked at the look (stbi_info_from_memory), and one that is no image it reads fails the look, look: <path>: not an image pardes can read, making no pane. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A PDF's body reads the text layer of the page it showsGabriel Schneider30 hours
| | | | | | The body of a PDF pane read as empty. It now reads MuPDF's text extraction of the page shown, the text search and n/N already use, read-only (a write is refused, as round 22's body refusal made it). Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The workspace tag's Restore word names the last dump, and the dump a Restore ↵Gabriel Schneider30 hours
| | | | | | | | came from Once the workspace tag was edited, its own text kept the Restore <path> of the dump at that time, stale after the next Dump; and a Restore dropped the path altogether (the new session had no last dump). A new dump now swaps the old path in the tag's own text, and a Restore points the word at the dump it read. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Two opens writing one body are separate undo steps, however they interleaveGabriel Schneider30 hours
| | | | | | The join mark a write left was the pane's, so another open's write joined the first open's step. Writing opens of body, data and xdata now get an open record, the mark names the open that set it, and another open's write starts its own step (the pane's one history: each turn the opens take is a step). Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Back or Forward over a closed file deleted since skips it and goes on, saying soGabriel Schneider30 hours
| | | | | | A jumplist entry for a closed file no longer on disk tried to reopen it, failed as a look, and left the step stuck there. Its entries now go, the message row says <path>: deleted, skipped, and the same step is taken over what is left. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A name cut across writes on one open is one name, applied onceGabriel Schneider30 hours
| | | | | | Each write to name was taken as a whole name, so a name a client wrote in two pieces renamed the pane twice, the first time to half a name. name's writes are now held per open, as exec's and ctl's lines are, until the newline or the close. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A Theme hint drops whole names to fit, never cutting one mid-wordGabriel Schneider30 hours
| | | | | | The names were written into a fixed room until it ran out, the last one cut, and the click's form ran past the 128 bytes a 9P error carries. Each name now goes in whole or not at all, and both forms are sized to fit. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A clamped Recent range ends at a line's last character, never swallowing its ↵Gabriel Schneider30 hours
| | | | | | | | newline A range past the end of a file that had shrunk was clamped to the empty line after its final newline and to one past a line's last character, so the selection took the newline in. Its ends now clamp to the last line and to its last character, as addr's L:C does. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A look miss said again is its err record counted, as any repeated err isGabriel Schneider30 hours
| | | | | | Look's miss pushed its err record plain, so a script retrying one look filled the log with the same line, where other errs are counted (x2). Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Callers and Callees on a .zig file say the language server does not answer themGabriel Schneider30 hours
| | | | | | The in-process ZLS answers no call hierarchy, and no other backend speaks .zig, so the question went nowhere and came back empty, as if nothing called the function. A question no backend answers, or a server that advertises no call or type hierarchy, now answers @none with why, which the core says. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A language server question that finds nothing, cannot be answered or has no ↵Gabriel Schneider30 hours
| | | | | | | | room fails, and so does a write to an image's or PDF's body Callers or Callees with nothing found, Hover or Lspwhy with no room for its pane, and a question asked of no file's pane said nothing, the 9P write succeeding; a body write to an image or PDF pane went nowhere. A write that asks a language server now waits for its answer (turn.lsp_answers), and what fails there -- nothing found, no answer, a backend's @none why, a placement with no room (ENOSPC) -- fails the write and logs its err. No diagnostics is said, not failed. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Recent goes on across a Restore, and is kept after itGabriel Schneider30 hours
| | | | | | A Restore makes a new session, which never loaded the kept list, and saveRecent gives up until it has: Recent was empty after a Restore and nothing opened afterwards was kept. The new session now takes the old one's list (a boot from a dump reads the kept file). Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Merge: 9P round 21 + Afterglow removed + symmetric focus dimGabriel Schneider30 hours
|\
| * A focus change dims and brightens on the same spring, both waysGabriel Schneider30 hours
| | | | | | | | | | | | | | | | | | | | The pane focus left dimmed on its lift spring while the one it reached undimmed in a single frame, a pop the user could read as a flash. Now the focused pane fades back on the same spring (its body's text only: its tag and a selection are focus indicators no effect may alter), so a focus change is symmetric; Motion off snaps both. Measured on lapis with InactiveDim 35: the biggest frame-to-frame step of either half went from 3.4 levels in one frame to 1.5 (smooth) and 1.6 (bouncy), a ramp both ways.
| * Afterglow (G14) is removedGabriel Schneider30 hours
| | | | | | | | | | | | | | | | | | | | | | The user, looking at the lapis showcase: "one of the animations is like a flashing on the whole pane or something, that is really bad, just remove it". Every changed cell glowing meant a pane whose whole text changed (a file opened, a +Search refilled, a terminal's output) lit up at once: replacing a pane's text took its mean brightness from 38 to 70 and back over 250 ms. Gone like Ripple and Glitch: the builtin, the setting, its Chrome fx bit, the GUI's diff state and decor, the test, and the docs, which keep the user's words.
* | The docs say an Edit loop that finds nothing succeeds silently, as sam's doesGabriel Schneider30 hours
| | | | | | | | | | | | Edit ,x/zzz/c/bar/ with no match changed nothing and succeeded, which read as a failure next to s's no substitution; sam does the same, so it is kept and said. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A builtin or setting this build lacks is refused GUI-only, from an exec tooGabriel Schneider30 hours
| | | | | | | | | | | | On a terminal, Fonts written to an exec was no builtin there, so it ran as a shell command and ended exit 127; ctl said unknown control message. Both now say Fonts is GUI-only, invalid here (a builtin another platform's build has, not in this build). Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | Theme takes a name in any case, and a miss names its nearest themesGabriel Schneider30 hours
| | | | | | | | | | | | Names were case-sensitive, and a miss listed only the first letter's themes that fitted 40 bytes, 4 of the many d ones. It now lists every theme sharing the first letter when they fit the 128 bytes an Rerror carries, else the nearest by a plain likeness score (shared prefix, the name inside, its letters in order). Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A Dump into a DumpDir that is no directory says so; the doc says a missing ↵Gabriel Schneider30 hours
| | | | | | | | | | | | | | | | last directory is made DumpDir /dev/null said no such directory though it is there, and the doc claimed a missing DumpDir always fails, where its last component is made at the Dump. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | Recent keeps only files on disk, and its cap never drops an open oneGabriel Schneider30 hours
| | | | | | | | | | | | A renamed scratch never saved and a /virtual/ pane were recorded as recent files, and at 200 the oldest entry went even when that file was open. Opens, renames and closes now record a path only when it is a file on this host, and the cap drops the oldest closed entry. A name with a newline is not written to the kept list, where it would read back as two. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | get's refusal over unsaved text logs its unsaved record, as the other ↵Gabriel Schneider30 hours
| | | | | | | | | | | | | | | | refusals do Exit, Restore, Del and Delcol log unsaved <serial> <name> before their err; get logged only the err. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A list pane opened from a terminal that has not said its directory yet lands ↵Gabriel Schneider30 hours
| | | | | | | | | | | | | | | | in the session's ThemeSel (Themes) in an init file ran at a terminal whose shell had not reported its cwd, so +Themes opened as /+Themes. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | The panes present at boot are the log's first records, before what an init ↵Gabriel Schneider30 hours
| | | | | | | | | | | | | | | | file said The boot announce ran after the init file, so its msg (ThemeSel: renamed to Themes) came before new 1. A msg or path record said while the log is still empty now announces the panes first. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A builtin's Verbose announcement is the message row's alone, never loggedGabriel Schneider30 hours
| | | | | | | | | | | | With Verbose on by default, /log filled with msg - DumpDir, msg 4 Grep and the like, with machinery to take an announcement back out when its builtin failed or said something itself. A msg record is now only something said; the take-back machinery goes with it. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | /recent shows a name as /index does, a newline in it escapedGabriel Schneider30 hours
| | | | | | | | | | | | It printed paths raw, so a name holding a newline read as two rows. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A pty/ctl exec that cannot start its shell keeps the one runningGabriel Schneider30 hours
| | | | | | | | | | | | Each host closed the running shell before it forked the new one, so an exec whose shell failed left the pane with none and later runs answered error shell gone. A shell not there is now refused up front, and every host starts the new shell first, replacing the old only once the close-on-exec pipe says it ran; a failure there is only said (restartFailed). Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A script whose interpreter is not there is told apart from a missing shell, ↵Gabriel Schneider30 hours
| | | | | | | | | | | | | | | | and Tty refuses it up front Tty's up-front check found the script and let it through, so the pane was made, its exec failed ENOENT, and the log read new, msg shell: shell not found, del, then the err. The check now reads a script's #! line and refuses it, interpreter /no/such/interp not found, and an exec that fails ENOENT on a file that is there says the same. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A look at a ./ or ../ name that is not there names the file, not the pane's ↵Gabriel Schneider30 hours
| | | | | | | | | | | | | | | | directory Any relative name that opened nothing was blamed on the pane's directory (look: .../work/many: no such directory) though it exists; the directory is named only when it is gone. A plain name is still looked for as text, its miss logged as any look's. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A Find or Grep that finds nothing empties its directory's +SearchGabriel Schneider30 hours
| | | | | | | | | | | | It failed with no match but left the last search's rows in the +Search, where they read as this one's. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A repeated identical search reads back the +Search it left as it wasGabriel Schneider30 hours
| | | | | | | | | | | | When a Find or Grep found exactly what its +Search already held, the pane was kept but not marked as the one the search touched, so the exec read back the pane it ran in. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A directory's +Search is found by its directory, the pane that ran the ↵Gabriel Schneider30 hours
| | | | | | | | | | | | | | | | search included Find and Grep passed over the pane they ran in when looking for the +Search to fill, so a Grep written to a +Search's own exec made a second one, and the two swapped roles on each run after. Co-Authored-By: Claude Opus 5.5 <[email protected]>