summaryrefslogtreecommitdiff
path: root/src
Commit message (Collapse)AuthorAge
...
* | A pane's child runs with PAGER=cat and GIT_PAGER=cat where the user's ↵Gabriel Schneider29 hours
| | | | | | | | | | | | | | | | | | | | | | | | environment sets neither, so a pty/run or a command pane never hangs in a pager git log or man run through pty/run, or in a command pane, sat in less at its first screen: no one presses q, and the run never answers. The child's environment now names cat as the pager when the inherited one names none; a user's own PAGER or GIT_PAGER is kept. It is every pane child's, a terminal's shell too, since a pty/run's line runs in it. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A refusal's +Unsaved goes in the session's directory when the active pane's ↵Gabriel Schneider29 hours
| | | | | | | | | | | | | | | | | | | | | | directory is not there Exit or Restore refused over a pane named into a directory that does not exist made +Unsaved in that missing directory, where its rows could not be looked at and a Save of it could only fail. The list now goes in the session's directory when the asking pane's is not on disk. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A ctl refusal quotes the offending word alone, everywhere: wrong #args in ↵Gabriel Schneider29 hours
| | | | | | | | | | | | | | | | | | | | | | | | control message "Newcol", not "Newcol 2" Some refusals quoted the whole line, arguments and all ("Newcol 2", "Verbose maybe", "lock x"), others the word alone ("Theme", "Mount"), so a script matching one could not match the other. Every ctl refusal, the root's, a pane's and a column's, now quotes the message's word alone, and one too long to quote whole gives up its middle. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A look at a file it may not read says which: "look: <path>: permission denied"Gabriel Schneider29 hours
| | | | | | | | | | | | | | | | | | The refusal said "look: permission denied", leaving the script to guess which of the paths it looked at was locked. A file or image that will not open is now named in the failure, its path cut in the middle when long. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | An event reader whose pane closes reads EOF, not ENOENTGabriel Schneider29 hours
| | | | | | | | | | | | | | | | | | | | A script following a pane's event in a loop ended in an error when the pane went, though nothing had gone wrong: the pane was simply done. A read on an event open whose pane has closed now answers no bytes, the end a pipe's reader sees when its writer goes, so cat and while-read end cleanly. pty/data keeps acme's answer. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A look at file:0:0 is refused, as a zero column after any other line isGabriel Schneider29 hours
| | | | | | | | | | | | | | | | | | The zero-column check ran only after a nonzero line, so file:0:0 went on as an address and failed some other way, or not at all. The check now reads the look's whole tail first, line 0 included, and refuses a zero column in addr's words. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | /index and the log escape a control byte, DEL or C1 in a name as \xNN, as ↵Gabriel Schneider29 hours
| | | | | | | | | | | | | | | | | | | | | | they do a byte not UTF-8, so the name decodes to what it is A control byte in a name read as a space, so /index could not be decoded back to the name the name file now accepts (\x07 and a space read the same). Every byte a name holds that is not printable UTF-8 is now \xNN there; a message's text keeps spaces. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A builtin refused when its record is written back through event fails that ↵Gabriel Schneider29 hours
| | | | | | | | | | | | | | | | | | | | | | | | write, EIO and its err, as fs.md says A Del refused over unsaved text, written back by an event reader, said so on the message row and answered the write ok, so the script that wrote it could not tell. The write-back now captures failures as an exec write does: the first one fails the write with its words and the errno they read as. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A second pardes --detach=NAME while NAME runs says "a session named NAME is ↵Gabriel Schneider29 hours
| | | | | | | | | | | | | | | | | | | | | | already running" and exits 1, with no error trace The second session built its whole core before its bind failed, then returned an error that main printed with a Zig error-return trace. The name is now checked first: a live session's socket is said, and the process exits 1 having made nothing. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | One diff-aware expansion for a click, a 9P whole-line look and an empty ↵Gabriel Schneider29 hours
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | event write-back; a blank context line resolves to its path:line The mouse expanded a diff line by its kind (a header or a hunk line's prefix to the line's address, a hunk line's code to words), but an empty look written back to event used the plain word expansion, so ML on a `+` took nothing, and a 9P look of a blank context line (` `) was refused as whitespace. look.diffClick is now the one answer: the mouse, the whole-line look and the event write-back all ask it, and a blank context line is a line like any other. A test asks all three on each kind of line. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | log stats 0, and pardes re-pins cloud9 whose 9ns opens such a file direct ↵Gabriel Schneider29 hours
|/ | | | | | | | | | | | | | | | and nonseekable: fs.md's follow recipe with cat works through a mount The log stated the length an open would freeze, a length a mount's kernel could take as its end, and a splicing cat read it from the kernel's offset. log now stats 0, as the other streams and generated views do, and the re-pinned cloud9's 9ns opens any file stating 0 FOPEN_DIRECT_IO | FOPEN_NONSEEKABLE. A look at such a file (the mounted index) reads a regular file that will not seek as a stream rather than refusing it as a pipe. selfmount runs the recipe, exec 3<>log; echo follow >&3; cat <&3, through the mount and hears a record made after it started. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Release Pardes 0.15Gabriel Schneider29 hours
| | | | Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The cheatsheet draws mouse buttons as a mouse, keys as chips, and pairs as ↵Gabriel Schneider29 hours
| | | | | | | | | | | | | | | | | | | | | | | | tables #btn and #chord draw a mouse (left button, wheel, right button) with the pressed part filled; the wheel is a narrow slot on a paper halo, hollow or filled, so it never reads as a button. A chord is the held button, then for each click the held one and that one down, with arrows between; #btn(.., shift: true) adds a ⇧. HTML gets a span with an aria-label. A key is one soft pill with no border: a combination (Ctrl-w) reads Ctrl + w and a sequence (g g, SPC f c) g › g, separators muted inside it; #keys("h", "j", ...) sets alternatives as separate pills. The drift test reads every key a #keys call names. #pairs sets key | meaning content as a two-column table on alternating tints; split: 2 sets the leader map as two such tables side by side. The mouse chords get their own table: cut, paste, copy (B1-B2 then B1-B3, one B1 hold, as mouse.zig says), 2-1 with an argument, 2-3 cancelling. The A4 page draws its own title and drops the content's level-1 heading. docs/typ/README is the function contract for content files. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The tutor follows the guide's order, points at its sections, and no longer ↵Gabriel Schneider29 hours
| | | | | | teaches $ as line end or the terminal tag's old words; a test checks the words, paths, chords and tags it names Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Themes become a short Typst topic: choosing one, the native palettes and ↵Gabriel Schneider29 hours
| | | | | | ports, and a theme file's roles Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Building gathers the platforms, options, tests, release gates and how the ↵Gabriel Schneider29 hours
| | | | | | core, threads, detached sessions and 9P fit, from the old design notes checked against the code Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The reference is fs.md's per-file semantics, errors and limits in Typst, ↵Gabriel Schneider29 hours
| | | | | | with the settings table, and says what the pane ctl's Left, Right, Up and Down do Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Scripting over 9P has one chapter, and the served README and the 9P skill ↵Gabriel Schneider29 hours
| | | | | | shrink to a summary, the traps and a pointer to it Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Release Pardes 0.14Gabriel Schneider29 hours
| | | | Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A link looked at in a detached session with no frontend attached opens no ↵Gabriel Schneider29 hours
| | | | | | | | | | | | browser and says so in a msg With no frontend to send it to, the link was kept and nothing said, so a script could not tell the look had landed or why nothing opened. It still opens nothing on the session's own desktop, and now leaves "look: <url>: no frontend attached to open it in a browser", logged as a msg. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* An editor's private pardes-osc133 prompt files go at Exit and at a fatal ↵Gabriel Schneider29 hours
| | | | | | | | | | | | | | | signal, and a start sweeps the ones a dead editor left /tmp had gathered thousands of private prompt files: Exit removed its own, but an editor killed by a signal, or a crashed one, left them for ever. They now carry their editor's pid in the name, a SIGTERM or SIGHUP removes them before the signal's death, and each start removes those whose pid kill(pid, 0) answers ESRCH for. Files of the older shape carry no pid and are left alone, as a running older editor may still read them; the shared ones in the runtime directory are kept, being every session's. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Mount with no dial is wrong #args, and a dial that is no address says bad ↵Gabriel Schneider29 hours
| | | | | | | | | | | | dial address, both EINVAL Mount name alone failed "Mount name dial: missing argument" and a malformed dial "Mount: bad dial", both EIO, though each is a malformed request. They now say wrong #args and bad dial address (with the forms a dial takes), and a builtin failure in those words answers EINVAL, as 9ns reads them. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Callers, Callees, Refs and the type hierarchy words with one answer say ↵Gabriel Schneider29 hours
| | | | | | | | | | | where they jumped, "Callers: the one, <place>" A word that asks for a list jumps straight to a lone answer, with no list to show it was the only one, so the jump read as a definition jump or a miss. It now leaves a message naming the place. A definition's jump, which is its answer, says nothing new. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* With several REPLs bound for a language the pane always asks which, as ↵Gabriel Schneider29 hours
| | | | | | | | | | | | documented, whether or not a program runs in each Only REPLs with a program running were counted, so with two bound and one at its shell prompt the text went to the other without a word, and which REPL got it depended on what happened to be running. All bound REPLs are offered now; one chosen with no program running is sent nothing and says so. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Edit's w and the other left-out sam commands fail EIO in words, never ↵Gabriel Schneider29 hours
| | | | | | | | | | | | | EOPNOTSUPP, and /os refuses a rename or a chmod as not permitted, EACCES "w is not supported in pardes" read through a mount as EOPNOTSUPP, as if the file system lacked an operation, and a chmod under /os was answered "invalid truncate", EINVAL. An Edit command pardes leaves out now says so in words 9ns reads as EIO, and a rename or mode change of an /os file is "permission denied", EACCES. fs.md's Failure section and /os entry say both. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* An editor killed with SIGTERM or SIGHUP removes its 9P socket, and a start ↵Gabriel Schneider29 hours
| | | | | | | | | | | | | | | sweeps the pardes-9p-<pid>.sock files whose pid is gone The runtime directory had gathered a hundred sockets of dead editors: only a clean exit removed its own, and a signal or a crash left it. The terminal's kill handler and, where nothing else handles the signals, a handler of the listener's own now unlink the socket before the signal's death. At listen, each pardes-9p-<pid>.sock whose pid kill(pid, 0) answers ESRCH for, that is a socket of this user's and that nothing answers on, is removed; a live pid's, a named session's and anything else are never touched. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* name takes any byte a file name can hold, controls, edge blanks and bytes ↵Gabriel Schneider29 hours
| | | | | | | | | | | | not UTF-8 included, so what name reads writes back as it was A pane opened on a file whose name held a tab, a control byte or bytes not UTF-8 read that name from its name file, and the same bytes written back were refused. Only what no file name holds is refused now: a second line and a NUL. The ctl word name still refuses a second blank after the word, as a line's words are split at blanks. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Attach in a detached session is refused with words: bare is wrong #args, a ↵Gabriel Schneider29 hours
| | | | | | | | | | | | | name no session has is "no such session" A detached session's core has no frontend loop to take an Attach, so the word was asked and never answered: a ctl write of it succeeded and nothing happened. The core now knows it is a detached session's, and Attach there says why: bare names no session but itself, a name with no session behind it is said so, and one that is a session is told to be attached from a frontend. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Views generated by each read stat 0, as acme's do: data, xdata, index, ↵Gabriel Schneider29 hours
| | | | | | | | | | | | layout, recent and listeners; fs.md says which files have real lengths A stat of index, layout, recent or listeners built the whole view to count it, and data and xdata reported the body's length though a read answers what addr selects. Those now stat 0, as screen and pane/new already did, and fs.md lists the files whose length is real and says to read the rest to the end. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A Restore brings back clean a pane whose file was never on disk, such as ↵Gabriel Schneider29 hours
| | | | | | | | | | | | Config's new init; only a file that existed when dumped is said deleted A restored pane whose path was not on disk was marked deleted on disk, so Config's not-yet-written init came back dirty and asked before Del, Exit or Restore. The dump now records whether the file was on disk (older dumps read as yes), and only one that was and is gone is said deleted. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Forwarding pardes @pN for a pane the session has not is refused, "this ↵Gabriel Schneider29 hours
| | | | | | | | | | | | session has no such pane", exit 1 and no pane made; one it has is looked at @p999:1 was taken as a new file's name, so a pane named <cwd>/@p999 was made and the launch succeeded; an @pN the session did have was the same stray pane. A pane address is now checked against the session: one it has is a look at it, one it has not is refused with the reason and exit 1, as a refused name is. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Forwarding to a running pardes says why in words: a name with a newline is ↵Gabriel Schneider29 hours
| | | | | | | | | | | "a file name is one line", never NotOneLine The forwarding refusal printed the error's name for anything the session itself did not answer: NotOneLine, NotAFileName, NoWorkingDirectory. Those are now sentences, a dial failure is said as the message row says one, and any other error is its name's words. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A shell's > into an empty pane's body is one undo step, as into any otherGabriel Schneider29 hours
| | | | | | | | | | The truncation of an empty body is no edit and pushes no step, but it still marked the open's writes as joining the step it would have pushed, so the text written after it had no undo step at all. A truncation that changed nothing (of body, data or xdata) now leaves the step to the write that follows. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* :N on a PDF turns to page N, from the pane and from the root's look; @pN:N ↵Gabriel Schneider29 hours
| | | | | | | | | | | | | | answers ok with no err; an address in a pane with no text names the pane A PDF pane took :N as a word to search for, and @p<pdf>:N failed as "is no text to address" after the page had nothing to do with it, an err in the log for a look that meant something. A PDF's address is now its page: :N turns to it, one past the last is the has-no-page miss, and a byte offset or a pattern is refused saying a PDF's address is a page. The refusal for any other textless pane named an empty path when the look was a bare :addr; it names the image or @p<serial> now. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A shell command from the workspace's or a column's tag runs as a command ↵Gabriel Schneider29 hours
| | | | | | | | | | | | | | | pane in the session's directory, never typed into the terminal with the keyboard A command clicked in a header tag, or written to /tagexec or a column's exec, was typed into the active terminal when it sat at an empty prompt, so it ran in that pane's directory and left no run or exit record. It now always gets a command pane of its own in the session's directory, as acme's row and column tags have no directory but the session's. tags.md writes the rule down: pane words act on the column's active pane, a column's words on the column, shell commands as their own panes, and over 9P a pane's word is refused. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A pane's tagexec goes to the event reader holding the pane as an x record, ↵Gabriel Schneider29 hours
| | | | | | | | | | | | as acme's tag clicks do, not run past it A real click in a held pane's tag was already told to the reader, but the same click written to the pane's tagexec ran at once, so a script holding the pane could not intercept it. The line is now an x record (l for a look), done when the reader writes it back. A column's or the workspace's tag is still no pane's and runs as before. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Release Pardes 0.13Gabriel Schneider29 hours
|\ | | | | | | Co-Authored-By: Claude Opus 5.5 <[email protected]>
| * A one-page A4 cheatsheet, the first file of a Typst docs corpus in docs/typGabriel Schneider29 hours
| | | | | | | | | | | | | | | | | | | | | | | | docs/typ/cheatsheet.typ holds the facts as semantic calls (#key, #btn, #chord, #word, #tag, #addr, #file, #cmd, #doc); docs/typ/style.typ defines those once, drawing them for paged output and emitting HTML elements under --features html; docs/typ/cheatsheet-a4.typ is the page. `zig build cheatsheet` renders it when typst is on PATH. A config.zig test reads every .typ in docs/typ and fails when one names a builtin, key binding or default tag pardes no longer has. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A diff line looks up the path and line it names, as any look doesGabriel Schneider29 hours
|/ | | | | | | | | | | | | | | | | | | | | | | | The look on a diff line was its own resolver: a walk up to .git/.jj from the diff's directory, its own "no such file here" and "deleted by this diff". A review tool's cached patch, in no repository, missed every file though the session's terminals sat in the checkout. Now a diff line only expands and transforms. Its expansion (what the hover shows) is the whole line for a header, a `@@` line, or a hunk line pointed at on its prefix, and its text is the look address the line names (look.diffAddress): `path` for `diff --git`/`---`/`+++`, `path:c` for `@@ -a,b +c,d @@`, `path:N` for a hunk line's new line (a removed line's, the new line now where it was). That text goes through the regular look exactly as if selected by hand: same resolution, placement and errors. A 9P look of a whole diff line takes the same transform. Kept: the line classification, hunk arithmetic, git prefix stripping and timestamp cutting (diff.zig). Gone: the repo-root walk, its messages, Target.old_side and deletesAhead, and the click's row stash (Pardes.diff_look). A test compares a B3 on a cached patch's line with a look of the hand-selected `entry/src/entry.rs:2` in the same session. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Release Pardes 0.12Gabriel Schneider29 hours
|\ | | | | | | Co-Authored-By: Claude Opus 5.5 <[email protected]>
| * Over a program that tracks the mouse, B2 and B3 are pardes's execute and ↵Gabriel Schneider29 hours
| | | | | | | | | | | | | | | | | | | | look, as in any pane, and Shift sends them to the program as its buttons 2 and 3; B1 and the wheel stay the program's, Shift keeping them pardes's The Shift that sends B2 or B3 is left out of their reports and of the drags they hold: it only chose the target. A B2 or B3 sweep of pardes's moves nothing to the program under 1003. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | Recent and /recent keep PDFs and images as they keep files, and an open ↵Gabriel Schneider29 hours
| | | | | | | | | | | | | | | | | | | | | | | | file's row is where its dot is now Only text files were recorded, so a PDF read yesterday was not there to find again, and an open file's row showed the place it last closed at, stale by however far it had moved since. A PDF is kept at its page and reopened there from its row; an image by its path; an open one's row reads its pane's place at the time of the listing. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A ThemeFile that fails names its file: "theme file /x/mine.zon: file not ↵Gabriel Schneider29 hours
| | | | | | | | | | | | | | | | | | | | | | found", not "theme file: file not found" The read and parse failures come back after the write, often from a relative name resolved against the config directory, so which file was missing or bad was left to guess. They now carry the resolved path, its middle cut when long. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | PdfSections on a PDF with no outline says so, "this PDF has no outline", ↵Gabriel Schneider29 hours
| | | | | | | | | | | | | | | | | | | | | | rather than open an empty +PdfSections An empty pane with no word of why read as a failure to load, and was kept to be re-shown on the next press. With no outline there is nothing to list: the press is refused with the reason, and a read or slot failure is said too, where it returned silently. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A look at a PDF's page past its last is a miss, "has no page N", never the ↵Gabriel Schneider29 hours
| | | | | | | | | | | | | | | | | | | | | | | | last page in its place manual.pdf:999 on a twelve-page PDF showed page 12 and said nothing, so a stale or mistyped page number looked like a place found. It is now the miss a line past a file's end is, whether the PDF is open (it stays on its page) or not (nothing opens). A restore or a start-up page past the end still lands on the last. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | DumpConfig writes a setting this shell cannot show as a "# Word unsupported" ↵Gabriel Schneider29 hours
| | | | | | | | | | | | | | | | | | | | | | comment, GripWidth among them on the tty, so the whole report writes back to /ctl The report said it could be written back as is, but "Lift unsupported" and the tty's "GripWidth 100" were each refused by the root ctl, and "DumpDir (none)" would have named a directory "(none)". Those lines are now comments, and a test writes every line of the report back. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | Every setting's bad-value refusal names what it takes: InactiveDim 0-100, ↵Gabriel Schneider29 hours
| | | | | | | | | | | | | | | | | | | | | | | | MessageLinger 0-60000 milliseconds, a path's limit, a font's form A setting that chooses among words named them, but one that takes a number, a path or a font said only "bad value" over 9P and "does not take that value" from a tag, leaving the range to be guessed. The refusal, both ways, now says its range or what it takes, from one table beside the words. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A Rename the language server finds nothing for says so, "Rename: nothing ↵Gabriel Schneider29 hours
| | | | | | | | | | | | | | | | | | | | here to rename", and fails the write that asked it An empty answer to a rename returned without a word, so Rename on a place with no symbol looked like a rename that worked. It is now the not-found failure every other query gives. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A look's miss cuts a long path in its middle with the Rerror cutter, keeping ↵Gabriel Schneider29 hours
| | | | | | | | | | | | | | | | | | | | | | | | the file's name, never mid-word at 64 bytes "is no text to address" cut the path at 64 bytes, often mid-word and losing the file's name, and the other misses cut theirs at 256 from the end, losing it too. Every miss now goes through fitErr, the cutter an Rerror uses, which gives up the middle of the longest path so the start and the name at the end both stay. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | The jump list never holds two entries in a row the same: when the one ↵Gabriel Schneider29 hours
| | | | | | | | | | | | | | | | | | | | | | | | between them goes, they are one A closed pane's entry dropped from between two visits to the same place, or a closed file's entry reopened beside its own, left twin entries, and Back spent a press going nowhere while Jumplist listed the place twice. The compaction that drops dead entries now folds a twin into the one before it, keeping the current entry on the one kept. Co-Authored-By: Claude Opus 5.5 <[email protected]>