summaryrefslogtreecommitdiff
path: root/src
Commit message (Collapse)AuthorAge
* Incl dir ... adds directories a look at a name found nowhere else is tried ↵Gabriel Schneider41 hours
| | | | | | in, as acme's includename, <stdio.h> too; bare Incl lists them and Incl - empties them; the session's, seeded with /usr/include and /usr/local/include, kept in a dump; Indent's refusal says Enter keeps the indent always Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Enter, o and O give the new line the old one's indent as it is, tabs and ↵Gabriel Schneider41 hours
| | | | | | | | | all, as acme's autoindent does; a level more after an opening delimiter is a tab where the indent is tabs The indent was rebuilt as spaces, partial levels dropped, so a tab-indented line went on with spaces (or with one space, after Enter). Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Putall saves every pane holding unsaved edits to a file, each as its own ↵Gabriel Schneider42 hours
| | | | | | Save, a refused one said and the rest saved all the same Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Enter and Tab on a tag word tell an event reader as a click on it does, at ↵Gabriel Schneider42 hours
| | | | | | its place in the tag; only a look takes a diff line's address, an exec there takes the word (follows vpmzwuzk) Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Get reads a pane's file again, refusing unsaved edits once as Del does, and ↵Gabriel Schneider42 hours
| | | | | | Get file loads that file into the pane; in a directory pane it reads the directory again. Load is Restore, as Put is Save; Abort's refusal says it is acme's debugging word Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Back and Forward keep to the focused file: Ctrl-o, Ctrl-i, the mouse's side ↵Gabriel Schneider43 hours
| | | | buttons (now the tty's 8 and 9 too), the builtins and 9P go to the nearest place that way in this pane, else in this file in another pane, else of any file; JumpScope all takes every place in order as before
* A look at a directory opens a pane listing it, as acme's directory window: ↵Gabriel Schneider43 hours
| | | | | | named dir/, its entries in acme's columns (bytewise, dotfiles kept, a directory's marked /), a look at an entry from there, Get or a look again reads it again, never dirty, Save refused; DirLook terminal keeps ls in a terminal Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A close's held last line runs before the close is answered when no editor ↵Gabriel Schneider43 hours
| | | | | | step is out, so its err is in the log by then; with a step out it still waits for that step (follows rzxqzosq; monkey9p's one_failure_rule) Co-Authored-By: Claude Opus 5.5 <[email protected]>
* One Look path: Enter, Tab and a bare Look take what a click at the cursor ↵Gabriel Schneider43 hours
| | | | | | | | | | | | | | | | | takes, a diff line's address included, and an event reader is told of them as of a click The keyboard expanded the cursor's word on its own (look.expandedSel), so a diff line's address (and a hunk line's code word, without its +/-) was the mouse's alone: Enter on `+line` looked for the text in the diff. Now exec.operandAt is the one expansion: pointerOperand is it with a gesture's selection borrowed, the Enter/Tab path and a bare Look (exec.currentOperand) are it from the cursor, and both dispatch through mouse.dispatchPointerBuiltin, so a pane with an event reader hears a key's look or exec as a click's. A test runs one diff line and one file:12:5: line through a B3 click, a B3 sweep, Enter, a bare Look, the look file and an event write-back, and asserts each lands in the same file, line and column. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The tutor opens with its title alone, and the slogan lines go: setup's ↵Gabriel Schneider45 hours
| | | | | | opening, the guide's and reference's "carry" framings, the tutor's "Two carry the rest" Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The guide answers a first session: n walks a build's errors from its command ↵Gabriel Schneider45 hours
| | | | | | pane, a finished one is already normal, why make wants the project root, opening beside, a builtin's argument by mouse, 12G, and SPC ? is Help everywhere; the tutor's tagline and button names match the site, and the cheatsheet's tree gains data, look and exec Co-Authored-By: Claude Opus 5.5 <[email protected]>
* An image's or a terminal's tag says petscii:on when it is drawn as glyph ↵Gabriel Schneider47 hours
| | | | | | | | art, as it always is with no graphics; Petscii on|off still chooses for when there are The images and tagbottomimage goldens are re-recorded for the word. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A window whose focus moves to a PDF or picture while the cursor glides goes ↵Gabriel Schneider47 hours
| | | | | | | | | | | | | idle: the glide stops instead of holding frames for ever glideCursor returned early when no cursor was drawn, so a glide under way (right-click a PDF from a tag: the cursor sets off for the new pane) was never stepped again and cursor_glide.moving() kept continuous() true: the GUI redrew at full rate, every frame, until focus came back to a cursor. With no cursor drawn the glide is now dropped; the next cursor lands. A pixel shell's only: the terminal has no cursor glide. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Show, don't tell: the guide, the tutor, scripting, setup and the landing ↵Gabriel Schneider47 hours
| | | | | | lead show an example first and cut the prose it makes redundant; the reference's 9P tree and REPLs name Look and Exec Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The guide, the cheatsheet and the tutor point to helix's keymap for every ↵Gabriel Schneider47 hours
| | | | | | key, and say where pardes differs Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Builtins are chips that link to a glossary generated from the registry, and ↵Gabriel Schneider47 hours
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | the virtual filesystem is drawn as a tree #word draws a builtin as a chip on the tag's ground over a rule (Look and Exec in acme's look green and exec red), a <code class="word"> in HTML, and links it to its entry in a new Builtins chapter wherever that chapter is in the same output (the book, the site). The chapter is drawn from docs/typ/builtins-tty.json and builtins-gui.json, which `zig build builtins-json -Dplatform=tty|gui` writes from the registry and the Help rows (src/builtins_json.zig, tools/gen_builtins_json.zig; summaryOf in ninep/ctl.zig is now pub); style.typ merges them, marking the window-only words. The doc steps refresh their build's file first, and each build's unit-test fails when its file is stale. Everyday words first (`everyday` in style.typ), then groups by leader prefix as Help has them, then settings, the words with no path, debugging and internals, and last an A-Z index of every word. `zig build book` joins the doc steps. #fstree draws a directory tree with its connectors, a description column and links to the sections that document each file; reference.typ draws the served tree with it, each pane, pty and column file on its own line, and a test in config.zig checks it against ninep/tree.zig's files both ways. The cheatsheet has a two-level version. On the site the tree reads as `tree` text in w3m and wraps descriptions under the names on a phone. The site's tutor draws its B1, B2, B3 and 1-2 chords as mouse glyphs; the landing credits Plan 9 and acme, as does the book's title page; install.typ no longer lists the mirrors (the footer does). Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Alt/Option-click is B2 and Super/Cmd-click is B3, sweeps included, as in ↵Gabriel Schneider48 hours
| | | | | | | | | | | | | plan9port: a one-button trackpad can execute and look The core decides it at the press (mouse.emulateButton) and keeps it to the release, whatever keys are let go between. Ctrl-click stays a definition, and a program tracking the mouse still gets the plain click (Alt as its meta, Super as nothing). The SDL, macOS and web shells now pass Super; the macOS and web shells pass Alt on a click too. A terminal's mouse report has no Super bit, so in a terminal only Alt-click is B2. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Builtins are written by name: each chapter and the tutor define Look and ↵Gabriel Schneider48 hours
| | | | | | Exec once and then say Look and Exec; the cheatsheet draws every mouse button as its icon; one-button clicks (Alt is B2, Super is B3) are in the guide and cheatsheet; building says how to send patches to the list Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The docs call pardes's scripting interface a virtual filesystem, served over ↵Gabriel Schneider48 hours
| | | | | | 9P, and the guide opens on look and execute as the core idea Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Scripts find the session as m=\$PARDES_MOUNT, else 9p; SPC q quits; upper ↵Gabriel Schneider2 days
| | | | | | keeps a selection's newline and its tag words once; the reference takes line files, init errors, dumps, dials and Save on +Tutor Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The docs give back the day-one lines the trim cut, the tutor becomes ↵Gabriel Schneider2 days
| | | | | | exercises on a +Tutor copy, the README builds the GUI and says what a terminal needs, and Shift-Esc says it needs the kitty keyboard protocol Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The docs trimmed to their path: a guide with Words you'll see and one Where ↵Gabriel Schneider2 days
| | | | | | commands run and panes go table, scripting's first tag word Fmt and eight traps, setup as the one home of the pager and the servers, a scannable cheatsheet, an honest README, the edge cases moved to the reference, and the pager's colours Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A name held for its newline that no newline could make good (a terminal's, a ↵Gabriel Schneider2 days
| | | | | | component over 255 bytes, a path too long) is refused by the write that held it, not at the close (monkey9p's close_runs_only_line_files; follows sswkwwvv) Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The web build compiles again: a dump asks whether a picture is on disk only ↵Gabriel Schneider2 days
| | | | | | where there is a disk (fixes zkmtpmmq) Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A bare Save on a +-named pane that is no output (+Tutor) asks for a path, as ↵Gabriel Schneider2 days
| | | | | | +New's does, never writing a file named +Tutor Co-Authored-By: Claude Opus 5.5 <[email protected]>
* SPC q runs Exit, refused once over unsaved panes as the tag word is, as ↵Gabriel Schneider2 days
| | | | | | helix's :q Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A setting only the other frontend has (Font, GripWidth in a terminal) is ↵Gabriel Schneider2 days
| | | | | | passed over in the init file, not failed: one init file serves the window and the terminal Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Every pane pardes spawns gets $PARDES_MOUNT, the session's own directory ↵Gabriel Schneider2 days
| | | | | | | | | | | | under 9ns --mntgen ($NINE_MOUNT/pardes/<name>), unset when it is not known 9ns says --mntgen with NINE_MNTGEN=1 (cloud9). Under `9ns --unix` the mount is the server it dialled, never this session (its socket does not exist until it starts), so it stays unset there; scripts fall back to `9p -a "unix!$PARDES_9P"`. Nothing is statted: the name comes from the session's socket and the environment. selfmount checks both modes. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* `> exec` through a mount no longer hangs the editor, and a close holding a ↵Gabriel Schneider2 days
| | | | | | | | | | | | | | | | | | last line is answered at once: the line runs at the editor's next step A shell's truncating open of exec (or look, ctl, log, pager) sends a setattr that changes nothing; it waited for the editor to be quiet, and through a 9ns mount that quiet could never come: 9ns answers nothing else on the mount while the setattr is out, and the editor's step may be out reading a pane's file through it. This was the "truncating open of exec hangs, only in selfmount" mystery. Only a truncate of a pane's file or a tag waits now. A close holding a last line with no newline hands it to the editor's step (tree.runClosedLines, beside fillClosedPagers), as a /pager close does, and is answered at once; a refusal is the log's err. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* `pardes --wait` whose $PARDES_9P no longer answers says the session is gone, ↵Gabriel Schneider2 days
| | | | | | exit 1, instead of drawing a screen of its own in the asker's terminal Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A dump no longer embeds a picture or a PDF that is on disk: Restore reads it ↵Gabriel Schneider2 days
| | | | | | | | | | | from there, as a clean file's text is Every Dump carried each image's and PDF's bytes in base64 (a 900 KB PDF made a 1.3 MB dump), and a Restore showed that copy however the file had changed. One on disk now goes by its path alone; one not on disk (no file behind it) still has its bytes kept. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A +Pager keeps its program's colours: the session parses what /pager is ↵Gabriel Schneider2 days
| | | | written after its directory with ghostty-vt, SGR becomes spans drawn over the plain text, every other escape is dropped, and PagerColor off pages it plain
* Saving the init file in a pane (Config) applies its settings at once; its ↵Gabriel Schneider2 days
| | | | | | | | | | | | commands are not run a second time A setting changed in the init file took effect only at the next start. The host's Save now hands a written init file's text back to the core, which applies its setting lines again (each idempotent), with the same notice and err for one that fails; a command line in it (`Newcol`) belongs to the start and is left alone. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The init file reads past a UTF-8 BOM, and every line it fails is said and ↵Gabriel Schneider2 days
| | | | | | | | | | | | logged with its line number, never silent A BOM made the first word unknown, a word no builtin has was skipped without a word, and a setting that refused its value said nothing (the init file ran with announcing off). Each failing line now leaves a notice and an `err - init file line N: <why>` record; `#` still starts a comment only at a line's start, so `#ff0000` stays a value. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* `answer z` quotes `z`, a bare `name` says it names nothing, and `Repl ↵Gabriel Schneider2 days
| | | | | | | | | | | | | klingon` is invalid (EINVAL), its message citing no doc path A refused answer quoted the word `answer`, not the choice refused. A `name` with nothing after it was an unknown control message. A Repl of no such language failed EIO with a pointer into the reference; it now says `invalid language` (EINVAL, here and through a mount) and how many more there are. A builtin's failure that says invalid anywhere is EINVAL, as 9ns reads it. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A rename preview's rows are one format whichever file they are in: ↵Gabriel Schneider2 days
| | | | | | | | | `file:L:C-E`, the range's end too, for the asked-about file as for the others The asked-about file's rows said `file:L:C` while other files' said `file:L:C-E`. lsp-rename-files is re-recorded for the one row it shows. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A look at a path not there under a peer's mount is a miss, the write ↵Gabriel Schneider2 days
| | | | | | | | | answered, as any path to no file is It failed the write with the peer's "file does not exist". A file not found, here or through a mount, is now said and logged as a miss. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Mount dials: a relative socket path is a bad dial address, a socket path not ↵Gabriel Schneider2 days
| | | | | | | | | | there says no such socket (ENOENT), and the hint says tcp! takes a numeric address `Mount peer rel/x.sock` dialled relative to wherever the editor ran; `Mount peer unix!/nonexistent` said `dial failed: no answer` (EIO); and the hint offered `tcp!host!port` where only a numeric address is taken. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* /pager takes one directory an open, as pty/run takes one line: a second ↵Gabriel Schneider2 days
| | | | | | | | | | line, in the same write or the next, is refused EINVAL Through a mount `printf 'a\nb\n' > pager` arrives a line a write, so the second asked for another +Pager on the same open, its answer replacing the first. An open that asked already refuses another. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A bound REPL whose program exited is skipped, as the docs say: out of the ↵Gabriel Schneider2 days
| | | | | | | | | | | | question, the running one taking the text, and a done command REPL's tag says no id Two bound REPLs always asked, an exited one offered and, chosen, sent nothing. Now an exited one is left out: one still running takes the text with no question, none running is said (`no program running`), and nothing runs as a command. A command pane bound as a REPL whose command is done no longer shows its id in the tag. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* An exec or Tty from a pane whose directory is a peer's path refuses before ↵Gabriel Schneider2 days
| | | | | | | | | | | making any pane: `exec: <dir>: no such directory`, no `exit 127` pane left A peer's directory (`/n/peer/x`) is no directory on this host, where the shell starts, so a command there ran in a pane that could only say `(pwd) exit 127`, and a Tty made a new/del pair. missingDir now counts such a path missing, as it does a local directory that is not there. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* An unsaved pane restored from a dump that says nothing of its disk (no ↵Gabriel Schneider2 days
| | | | | | | | | disk_hash, an older dump) asks at its first Save, as for a file changed on disk What its text was read against is unknown, so a Save could write over a newer file without a word; it now asks once first. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A command or terminal pane refused for room is refused before anything is ↵Gabriel Schneider2 days
| | | | | | | | | | | | | | | logged or answered of it, and a serial is never handed out twice A command pane with no room logged `new N` and `run N ls`, was answered to its exec, then went with `del N` and no `exit N`; and sync gave N back (`next_serial -= 1`) to the next pane made, so a script holding N found another pane under it. Tty did the same. Both now take a refused placement back at once, before the run is logged or the serial answered (the pane was never announced, so it leaves no record), and fail the write with no room. The decrement is gone: gaps are fine, and a serial once said names one pane for good. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A command line runs when its newline comes, or at its open's close, never ↵Gabriel Schneider2 days
| | | | | | | | | | | | | | | | because a write was short: a long line cut by a mount is one line A write shorter than its message, and not a multiple of 4096, was taken as whole, its tail a line. 9ns cuts a FUSE write of up to 512 KiB into 65512-byte Twrites, the last one short, so a 600 KiB `Edit ,c/.../` arrived cut and its tail ran as an unknown control message; the 1 MiB refusal failed the same way. Each open now holds a partial line until its newline, or its release, which ends the last line; an Edit block is whole when it closes, as before. A name write with a NUL still fails its write at once. selfmount writes a 600 KiB Edit line and a 1.1 MiB line through a real 9ns mount; building.typ says how lines are cut. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Grep's miss says `Grep: text not found`: it is a literal search, and ↵Gabriel Schneider2 days
| | | | | | | | | "pattern" suggested a regular expression Still ENOENT through a mount ("not found" is in 9ns's table, and the unit tests' errno-words check holds it so). The guide's quote follows. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Shift-Esc always backs out: in every mode and pane it goes to the previous ↵Gabriel Schneider2 days
| | | | | | | | | | | | | | | pane, as Esc does from normal, and a raw program never sees it; Ctrl-b alone toggles raw Shift-Esc switched a terminal in normal or insert mode into raw, so the one key meant to get out of anything got a script or a person into a program instead. It is now handled before any mode: an open prompt is closed, insert mode left, a pending count dropped, and Last runs, the pane keeping its mode (a raw terminal stays raw). Ctrl-b is the only switch between raw and normal. The keymap's two chords become one, back_out; the cheatsheet row, the guide's mode table and the tutor say so, and the tty and builtins goldens are re-recorded. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Release Pardes 0.23Gabriel Schneider2 days
| | | | Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A language server goes with its children when reaped, and every server's ↵Gabriel Schneider2 days
| | | | | | | | | | | | | | process group is killed as pardes exits: no zls or `zig build --build-runner` outlives the editor The server is spawned with setsid, its own group's leader, but reap() signalled only its pid, and nothing reaped the servers at exit: the socket closing was left to tell them. zls busy in its build runner at a cold start did not notice, and lived on with its `zig build` for as long as no one killed it (found as three orphans 40 minutes after their sessions had gone). reap() now signals the group, and an atexit hook, registered at the first spawn, kills every server's group. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* `pardes --wait FILE` with $PARDES_9P set but no pane of its own (an agent's ↵Gabriel Schneider2 days
| | | | | | | | | | | | or a script's EDITOR) asks that session and waits there, not a screen of its own Forwarding asked for $PARDES_PID and $PARDES_PANE, which only a pane's shell has, so a client that talks to a session from outside its panes got a full editor drawn in its terminal. With --wait and $PARDES_9P alone, the file is looked at through the session's root look and the wait is for that pane's del. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A Mount dial with a network pardes does not dial (`nowhere!x`) is a bad dial ↵Gabriel Schneider2 days
| | | | | | | | | | | address, EINVAL, not a session name that does not answer A dial with a `!` and no `/` that was neither tcp!, quic! nor unix! was taken for a session's name, failing as `dial failed: no answer`, EIO. It is now refused as the malformed address it is, before any dial. A path with a `!` in it still dials. Co-Authored-By: Claude Opus 5.5 <[email protected]>