summaryrefslogtreecommitdiff
path: root/docs/fs.md
Commit message (Collapse)AuthorAge
...
* The docs say how a follower sees repeats, what caps Newcol, that Restore ↵Gabriel Schneider28 hours
| | | | | | starts undo afresh, where dot ends after data and sel, and where $ sits on a CRLF line Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A tag write past the limit is refused whole, naming itGabriel Schneider28 hours
| | | | | | A write to tag longer than the room left was cut and applied in part. It now changes nothing and fails ENOSPC, tag: over 4096 bytes; the docs give the limit. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Mini with no argument is wrong #args, EINVAL; Find, Grep and Mini say their ↵Gabriel Schneider28 hours
| | | | | | | | names capitalised Mini needs a file but did not say so, so a bare Mini ran and failed EIO. It now requires its argument, refused wrong #args (EINVAL) as every such word is. Its failures, Find's and Grep's start with the builtin's own name (Mini:, Find:, Grep:), as the others' do. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* pty/run takes one line a run, its answer read before the nextGabriel Schneider28 hours
| | | | | | Two lines -- in one write, or as bash writes them, a line at a time on one open -- each ran, and the first's answer was lost under the second's. A write with more than one line, or a next line before the last answer is read, is now refused, EINVAL. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* pty/ctl exec on a command pane is refused: a command pane does not restartGabriel Schneider28 hours
| | | | | | exec on a finished command pane ran its line again, silently, with no header, footer or records. It is now refused, EINVAL, invalid exec: a command pane does not restart. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* An open's writes in a row to one place go in as one edit: a 10 MB body write ↵Gabriel Schneider28 hours
| | | | | | | | is linear Each body or data write copied and hashed the whole buffer, so a write the mount cut in 8 KB pieces was quadratic: 10 MB took 50 s and a 1 MB insert into 10 MB 11 s, holding the editor's turn. An open's appends to body, or inserts going on at data's address, are now held and put in as one splice (one copy, one undo step, one line-starts pass) before any other request, the close, or the editor's step once the writes pause 20 ms. fs.py-driven: 2 MB 2.19 -> 0.16 s, 10 MB 50.17 -> 0.78 s, 1 MB data into 10 MB 11.49 -> 0.26 s. A body-2m case (2 MB in 256 KB writes on one open) joins the perf gate: 84023 -> 15785 us; baselines re-recorded. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* An Edit x gives each of its searches the step budget, and a search that ↵Gabriel Schneider28 hours
| | | | | | | | spends it says it took too much time The budget was the compiled pattern's, spent over every search an x made: Edit ,x/x+/c/z/ over 100k lines ran out and failed, blamed on backtracking. Each search now starts with the whole budget, and one that spends it says regular expression search took too much time, gave up. (Not "too long": 9ns reads those words as ENAMETOOLONG.) Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A pattern up to 512 characters compiles; a longer one is refused naming the ↵Gabriel Schneider28 hours
| | | | | | | | limit mvzr's Regex holds 64 operations, so a pattern much past 64 bytes was refused as bad regular expression. pardes now compiles into mvzr's SizedRegex(512, 64), and a pattern that is too long (told apart from a malformed one by compiling it with room) says it is longer than mvzr's 512 operations. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A ctl or exec line with no newline runs with its write and fails it, unless ↵Gabriel Schneider28 hours
| | | | | | | | it needs more A last line with no newline was held to the close, so printf bogus > ctl answered 0 and failed only in the log, Edit ,s/zzz/y/ too. A write shorter than its Twrite is the whole of what was written (acme takes each write whole): its tail runs then and a failure is the write's. It is held only when the parser says it needs more -- an open { block, an a/c/i text -- or when the write filled its Twrite and may go on (the listener tells the core the room, msize less its header). Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The docs say a look's :col counts bytes, as addr's and every row's doGabriel Schneider28 hours
| | | | | | Columns are bytes everywhere a row is written (Grep, the language servers) and read (addr, look); the look's spelling did not say so. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A name refused for a leading blank says a blank at its startGabriel Schneider28 hours
| | | | | | Both ends said a blank at its end. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The docs match what Save to a directory not ours and an image's tag sayGabriel Schneider28 hours
| | | | | | A Save refused by the disk reads as EACCES through a mount (its words say denied), not EIO; an image's tag starts palette:commodore ascii:on by default. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Not-found failures say it once, in plain words: grep: pattern not found, ↵Gabriel Schneider28 hours
| | | | | | | | callers not found The ENOENT that 9ns reads from a failure's words came from a tacked-on suffix, grep: no match, not found, definition: nothing found, not found, no shell "x", not found. They now say it once: grep: pattern not found, find: name not found, Callers: callers not found, definition: not found, shell "x" not found (...). Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A second line written to name is refused EINVAL, in one write or on the same ↵Gabriel Schneider28 hours
| | | | | | | | open bash writes printf 'a\nb\n' a line at a time, so each line arrived as a whole name on the held open and renamed the pane twice. An open that has named its pane now refuses a further line, as a two-line write already was. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A ^ after | anchors its branch: ^def|^ finds lines starting either wayGabriel Schneider28 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 Schneider28 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]>
* A listing freezes at its open, so a read in several chunks never splices two ↵Gabriel Schneider28 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 Schneider28 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]>
* After a failed address, one that goes from it (., +, -) says there is noneGabriel Schneider28 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]>
* Symbols, Diagnostics and every language server list share their directory's ↵Gabriel Schneider28 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 Schneider28 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]>
* addr takes a row's range, L:C-L2:C2 or L:C-C2, so a Recent, +Search or ↵Gabriel Schneider28 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 PDF's body reads the text layer of the page it showsGabriel Schneider28 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]>
* Two opens writing one body are separate undo steps, however they interleaveGabriel Schneider28 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]>
* A name cut across writes on one open is one name, applied onceGabriel Schneider28 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 look miss said again is its err record counted, as any repeated err isGabriel Schneider28 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]>
* A builtin or setting this build lacks is refused GUI-only, from an exec tooGabriel Schneider28 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 Schneider28 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 Schneider28 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 Schneider28 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]>
* A builtin's Verbose announcement is the message row's alone, never loggedGabriel Schneider28 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]>
* A pty/ctl exec that cannot start its shell keeps the one runningGabriel Schneider28 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 Schneider28 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 Schneider28 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 Schneider28 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]>
* The writes of one open of data, body or xdata are one undo stepGabriel Schneider28 hours
| | | | | | bash line-buffers its stdout, so printf 'x\ny\nz\n' > data arrives as three writes and took three Undos. A write now leaves the join mark a truncation already left, so the next write on the file joins its step until the open is released; a truncation and any other edit start a step of their own. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A refusal over unsaved panes keeps its list in +Unsaved and shows a short noticeGabriel Schneider28 hours
| | | | | | | | | | | Exit's refusal (and Restore's, Del's, Delcol's, get's) put its full text on a notice that went: a long list of names, gone before it was read. The list now goes into one +Unsaved pane, filled again by each refusal, a row a pane (`<name>: Modified`) and the `Exit again to discard` line; the notice is short, `3 unsaved panes — Exit again to discard`. The 9P `unsaved` records and the write's err are as they were. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* ThemeSel is Themes and FontSel is Fonts; the old words still work in init ↵Gabriel Schneider28 hours
| | | | | | | | | | | | files and dumps The user asked for the plainer words. Every use is renamed: the builtins, leader paths, /commands, the docs and tutor, tests, and the themesel golden, re-recorded. An init file's ThemeSel or FontSel runs the new word and says `ThemeSel: renamed to Themes`, as ColumnTags is said; a dump naming an output pane by the old word restores it. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Recent lists the files opened lately, closed ones too, and a jump back to a ↵Gabriel Schneider28 hours
| | | | | | | | | | | | | | | | closed file reopens it A file closed by accident, its path forgotten, could not be found again: the jumplist dropped closed panes. Every file opened (a look, a Save of a scratch, a Restore, a rename) goes first in a list of 200, kept once, its dot noted when it closes, kept across sessions in $XDG_STATE_HOME/pardes/ recent. `Recent` (SPC f r) shows it in a reused +Recent, each row `path:line:col open|closed` a look reopens; /recent reads `open|closed <path>`. The jumplist keeps a closed file's entries, +Jumps marks them `(closed)`, and Back to one opens the file at its place. acme has no such thing; its dump and Load are the nearest. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Find and Grep share one +Search a directory, each run replacing the lastGabriel Schneider28 hours
| | | | | | | | | Each Grep with a new pattern opened another +Search, until the column refused panes. Find and Grep now reuse their directory's one, as acme reuses +Errors, and the exec reads back the pane it filled; a plain word's LookWord list search keeps a pane a pattern as before. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The docs: --detach runs the editor as $!, a line with no newline fails only ↵Gabriel Schneider28 hours
| | | | | | | | | | | | in the log, data reads to the end The skill said --detach forks and $! was not the editor's pid; it is, and /status agrees. A line written with no newline runs at the close, after the write is answered, so its failure is in the log alone: end lines with their newline. And `cat data` reads from the address to the end of the text, as acme's does; xdata is the range. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Errnos that fit: a Dump into a missing DumpDir and a shell that is not there ↵Gabriel Schneider28 hours
| | | | | | | | | | | | are ENOENT, a GUI-only setting EINVAL A Dump into a DumpDir not there failed EIO `file not found`; `no shell "x"` read as EIO through a mount; and a GUI-only setting on a terminal, EINVAL in the reply, had no word 9ns reads as EINVAL. Each says so in the words that give its errno: `no such directory`, `not found`, `invalid here`. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A ctl line that ran and failed is not quoted after its reason; only one ↵Gabriel Schneider28 hours
| | | | | | | | | | | | refused before running is Failures of a builtin through a ctl quoted the line after the builtin's own words, which already named it (`Mount dead /x: dial failed: no answer "Mount dead /x"`), while the same failure through exec did not. A line that ran says why in its own words everywhere now; only a line refused as no message at all quotes it, as Plan 9's cmderror does. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A name shows its own backslash as \\, and a terminal tag never carries a raw ↵Gabriel Schneider28 hours
| | | | | | | | | | | newline With `\n` for a newline and `\xNN` for a bad byte, a name holding a backslash and an n read back as one holding a newline. Names in /index, the log and a terminal's tag now double their own backslashes; and a terminal's directory with a newline no longer breaks its tag. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A shell that cannot start fails Tty and pty/ctl exec with why, before either ↵Gabriel Schneider28 hours
| | | | | | | | | | | | | | answers A shell whose exec failed (a script's missing interpreter) was reported started: Tty and pty/ctl exec succeeded, then the pane died. The child now reports a failed chdir or exec through a close-on-exec pipe the parent reads before acknowledging the shell; the host's spawn fails with the reason (`shell not found`, ENOENT), which fails the waiting write. A Tty whose first shell never ran leaves no pane; a terminal restarted by pty/ctl exec keeps its pane. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A tag write refuses NUL and the other control characters; a Dump that fails ↵Gabriel Schneider28 hours
| | | | | | | | | | | | says so A NUL written into a tag went into the dump, which the host then could not write, and Dump said nothing: a success that wrote nothing. Tag writes, the workspace's, a column's and a pane's, refuse control characters but tab and newline, DEL, C1 and bytes not UTF-8, EINVAL; and Dump reports any failure of its own instead of swallowing it. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A served-tree pane spoils no Grep, and `look .` from a gone directory is ENOENTGabriel Schneider28 hours
| | | | | | | | | | | A pane named `/virtual` gave Grep the root `/`, which swallowed every other pane's directory and ran out of walk before any file: every Grep missed. Grep passes over panes of the served tree. And `.` from a pane whose directory was gone resolved to the served tree's root (/virtual/), or through the jump list to another pane's directory: a dot path is the looking pane's own, and gone it fails, `look: <dir>: no such directory`. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Edit written to /tagexec or a column's exec is refused as the other pane ↵Gabriel Schneider28 hours
| | | | | | | | | | | words are Edit was let through the pane-word check (the root's ctl takes it at the active pane), so `Edit ,d` written to a tag no pane owns wiped the pane with the keyboard. Every pane-scope word a tag does not hold is refused there now, Edit included; a test enumerates them all. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The docs: the one rule covers pty/ctl exec, misses and gone directories are ↵Gabriel Schneider28 hours
| | | | | | | | | | | ENOENT, #100,#50 past the end, --detach forks The one rule's wording left out a pane's pty/ctl and the ENOENT a Find, Grep or missing directory now answers; `#100,#50` in a short text says out of range, its ends checked first; and the skill now says --detach forks, the pid being /status's. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* /index shows names as the log does, one line of UTF-8, and a newline in a ↵Gabriel Schneider28 hours
| | | | | | | | | | | | name as \n /index printed a name as it was, so a directory with a newline in it split its row in two, and bytes not UTF-8 went through; the log turned the newline into a space, silently another name. Both now show a name one way: a newline `\n`, other controls, DEL and C1 a space, bytes not UTF-8 `\xNN`. Co-Authored-By: Claude Opus 5.5 <[email protected]>