summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAge
* A terminal pane draws the kitty graphics its program places, so yazi's image ↵Gabriel Schneider6 days
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | and PDF previews show yazi asks the pane XTVERSION, and ghostty-vt answers "libghostty": yazi takes it for Ghostty and sends its previews by the kitty graphics protocol with Unicode placeholders (a=T,U=1, then U+10EEEE cells). ghostty-vt stored the images, but nothing drew them: the placeholders showed as tofu in the GUI and as raw codepoints in the tty, in every build since terminal panes answered queries (vkznsvzs, 2026-07-01). Before that no query was answered and yazi fell back to chafa's text art. Each frame, TerminalImages.zig reads the active screen's images and placements (virtual ones through their placeholder runs, and ones placed on a cell), cuts each into the cell rows it covers, maps those rows through the body's own row walk, clips them to the pane, and hands them on as ImagePlaces with exact geometry (NativePlacement.exact). The GUI draws them as textures; the tty passes them to an outer terminal with kitty graphics as one placement per row, its source cropped to whole cells. Placeholder cells draw no text. Scrolling, a delete, a resize, the alternate screen and a closed pane all fall out of reading the emulator's state every frame. A pane now knows its size in pixels: CSI 14/16/18 t are answered, the emulator's width_px/height_px follow the shell's cells, and the pty's winsize carries pixels (host_io.ptyWinsize), so yazi and a nested pardes size their images right. ghostty-vt's image store is 64 MiB per screen (its library default, 10 MB, refused a large preview), PNG transmissions are decoded with stb_image, and RGB images are converted only while shown. test/yazi_preview.py runs yazi in a hidden window on a PNG and a PDF and checks the captures, also through a tty pardes nested in the pane. Co-Authored-By: Claude Opus 5.5 <[email protected]>
*-. Release Pardes 0.16Gabriel Schneider6 days
|\ \ | | | | | | | | | Co-Authored-By: Claude Opus 5.5 <[email protected]>
| | * A PDF page taller than one raster is drawn at the size it is shown, in bands ↵Gabriel Schneider6 days
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | around the screen, not squeezed into 4096 rows and blown up The render geometry (pdf_bridge.c) clamped a page's LONGEST side to max_dimension: 4096 in the SDL policy, 1200 in Kitty's. A page 841.89 x 4818.9 pt, fit to a 1570 px wide pane, came out 715 x 4096 and was drawn 2.2 times too large at 1x, 4.4 times at 2x; Kitty's raster was 210 px wide. Every request now caps a raster ROW at max_dimension, and caps the height too only while that keeps the page at least as large as it is shown (RenderRequest.display_width/height, set from the fit). A tall page fit to width is rasterized at the pane's own width, in SDL, and at Kitty's 96 dpi as any other page is there. Such a page is not one buffer. A raster over 8192 rows (a texture's and Kitty's 10000-pixel limit) or over 64 MiB is banded (pdf_view.zig): its slot holds the rows on screen and a screenful either side, in 512-row chunks, and is rendered again, keeping the chunks it has, once the screen comes within half a screenful of its edge. Each chunk comes from its own render reaching 32 rows past both edges, so a row of the page is the same however it was scrolled to, and no chunk shows its clip edge: band rows are within 3 levels of a whole-page render (108 pixels of 45 million on the reported PDF). Highlights paint over the band's clean rows as over a page's, and the band uses the page's CTM, so search, selection and pointer geometry are unchanged. A display-list render now culls to the band (a scissor in page space). No pixel changes, but a frame that renders new rows of the reported page at 2x fell from 33-43 ms to 13-16 ms (pdf-scroll-bench, --cell 16x32). design.pdf's scroll-bench pixels are identical. Co-Authored-By: Claude Opus 5.5 <[email protected]>
| | * pdf-scroll-bench takes --cell WxH, --slow-frames N and one tall page, and ↵Gabriel Schneider6 days
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | reports the rasters' peak bytes A single tall page is four screenfuls of strip as much as four pages are, so the gate asks for the strip, not the page count. --cell 16x32 is the same window on a 2x display, and peak_kib is the most the pane's rasters, clean copies and spares held after any frame. Co-Authored-By: Claude Opus 5.5 <[email protected]>
| * | The docs describe the pager that landed: pardes - and its +Pager pane, a ↵Gabriel Schneider6 days
| | | | | | | | | | | | | | | | | | terminal's PAGER, command panes' cat, Pager pardes|off, and pty/run no longer waiting in one Co-Authored-By: Claude Opus 5.5 <[email protected]>
| * | The book and the HTML gain "Setting up your environment" after the guideGabriel Schneider6 days
| | | | | | | | | | | | | | | | | | | | | | | | | | | chapters lists setup.typ second and #doc takes a setup id. Shell lines (#cmd) follow the density too: roomy in the book and the HTML, with a tint and space around them, tight on the A4 sheet; the book sets code blocks on the same tint. Co-Authored-By: Claude Opus 5.5 <[email protected]>
| * | Setting up your environment: a 9ns mount, pardes as the editor, pager and ↵Gabriel Schneider6 days
| | | | | | | | | | | | | | | | | | yazi opener, the shells with prompt marks, language servers, fonts and plan9port, each snippet tried Co-Authored-By: Claude Opus 5.5 <[email protected]>
| * | The docs take the 9P agent's round 30: log stats 0, names escape every ↵Gabriel Schneider6 days
| |/ | | | | | | | | | | control byte, $winid and the pager defaults, the one client rule, and Shift-Esc said one way in the guide and the cheatsheet Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | pardes - reads stdin into a +Pager pane, and is a terminal's PAGER and ↵Gabriel Schneider6 days
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | GIT_PAGER, Pager pardes|off to opt out; command panes page through cat A paging command in a terminal, or run through its pty/run, sat in less, and a pty/run never answered. `pardes -` now reads stdin to its end, strips terminal escapes (colour, OSC, overstrike), and shows it: inside a session as a clean <cwd>/+Pager pane made through pane/new and back at once, outside one as a new editor whose first pane it is, as `vim -` does. A terminal's shell gets PAGER and GIT_PAGER set to this pardes's own path and `-` where the user's environment sets neither; `Pager off`, a setting in /ctl, init and DumpConfig, leaves terminals started after it to the environment. A command pane's one-shot shell keeps cat, its output being a pane already. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | nested-optout's golden is re-recorded: it held the old tag words and a boot ↵Gabriel Schneider6 days
| | | | | | | | | | | | | | | | | | | | | | | | | | without its +New scratch, as nested.golden no longer does The long-standing failure was the golden alone. Its tags read the words of an older release (NextColor, Togglettymode, no Delcol) and its boots had no +New scratch under the terminal, both of which boot.golden and nested.golden, recorded since, already show. The nested editor's own behaviour, a --nested launch opening inside the pane rather than forwarding, is unchanged in the new capture. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | -Dplatform=esp32p4 with another -Dtarget is refused, as build.zig meant: the ↵Gabriel Schneider6 days
| | | | | | | | | | | | | | | | | | | | | | check reads the target asked for, not the board's pinned one The refusal compared the resolved target, which build.zig pins to the board for esp32p4, so it could never fire and -Dtarget=x86_64-linux built firmware anyway, silently. It now reads -Dtarget as given and refuses any target but riscv32-freestanding. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | The leader key's comment says where it applies: every normal mode, a tag's ↵Gabriel Schneider6 days
| | | | | | | | | | | | | | | | | | | | | | and a PDF's too, never a raw terminal's config.zig said leader paths apply in body normal mode only, but normal.zig takes the leader action for every target it handles, tags and the column and workspace tags included, and a PDF pane passes it through. The behaviour is the useful one; the comment is corrected. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | Shell's help says what a bare Shell is: $SHELL if it is executable, else ↵Gabriel Schneider6 days
| | | | | | | | | | | | | | | | | | | | | | /bin/sh, not "the login shell" The settings table and the bad-value refusal said bare Shell returns to the login shell, but defaultShell takes $SHELL when it can run it and /bin/sh otherwise; the passwd entry is never read. Both now say what the code does. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A command run from a pane gets acme's $winid, the serial of the pane it was ↵Gabriel Schneider6 days
| | | | | | | | | | | | | | | | | | | | | | | | run from; one from a column's or the workspace's tag gets none PARDES_PANE names the command pane itself, so a script a click ran had no way to address the pane it was run in, as acme's win scripts do with $winid. The command pane now remembers that pane and its child gets winid set to it; a header tag's command, which no pane owns, gets winid unset. PARDES_PANE is unchanged. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | Forwarding pardes FILE for a new name in a directory it may not read or ↵Gabriel Schneider6 days
| | | | | | | | | | | | | | | | | | | | | | write is refused with words, not a pane that only fails at Save A new name forwarded into a directory that is there but locked opened an empty pane named for it, and the failure came only at its Save, long after the launch. The directory is checked first: one that cannot be read, written and entered is refused, exit 1, no pane made. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A pane's child runs with PAGER=cat and GIT_PAGER=cat where the user's ↵Gabriel Schneider6 days
| | | | | | | | | | | | | | | | | | | | | | | | 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 Schneider6 days
| | | | | | | | | | | | | | | | | | | | | | 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 Schneider6 days
| | | | | | | | | | | | | | | | | | | | | | | | 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 Schneider6 days
| | | | | | | | | | | | | | | | | | 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 Schneider6 days
| | | | | | | | | | | | | | | | | | | | 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 Schneider6 days
| | | | | | | | | | | | | | | | | | 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 Schneider6 days
| | | | | | | | | | | | | | | | | | | | | | 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 Schneider6 days
| | | | | | | | | | | | | | | | | | | | | | | | 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 Schneider6 days
| | | | | | | | | | | | | | | | | | | | | | 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 Schneider6 days
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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 Schneider6 days
|/ | | | | | | | | | | | | | | | 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 Schneider6 days
| | | | Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The book and the HTML set #pairs tables roomy, the A4 sheet tightGabriel Schneider6 days
| | | | | | | | | A pairs-density state, set to tight by cheatsheet-a4.typ and roomy otherwise, gives book and HTML tables more row padding and room between the key and the meaning. The book sets its body at 10pt with more space around sections and between paragraphs and list items. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The book and the HTML hold every topic, and #doc links to its chapter or sectionGabriel Schneider6 days
| | | | | | | | | | | | | chapters now names guide, cheatsheet, scripting, reference, themes and building. #doc takes the chapter ids, keeps the old ones mapped onto them (tags and fs to the guide and the reference, config, keys and detached to their guide sections), and links in the book and the HTML, where a doc-links state says every chapter is there; on the A4 sheet it names the chapter and section. The reference points at the scripting and building chapters by #doc instead of in words, and the guide heading for pardes FILE and --wait keeps its two dashes. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* docs/typ gets book and HTML wrappers over one chapter listGabriel Schneider6 days
| | | | | | | | | | | style.typ lists the chapters in reading order (guide, cheatsheet, scripting, reference, building), each with its content file or none while unwritten. book.typ sets them as an A4 book with a title page and contents, the tutor read from src/tutor.txt last; html.typ sets them as one HTML page with a nav of anchors. An unwritten chapter shows a placeholder, so both compile before the topics exist. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The cheatsheet draws mouse buttons as a mouse, keys as chips, and pairs as ↵Gabriel Schneider6 days
| | | | | | | | | | | | | | | | | | | | | | | | 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 README says what pardes is, how to install it, and what to read nextGabriel Schneider6 days
| | | | Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The tutor follows the guide's order, points at its sections, and no longer ↵Gabriel Schneider6 days
| | | | | | 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 Schneider6 days
| | | | | | 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 Schneider6 days
| | | | | | 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 Schneider6 days
| | | | | | 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 Schneider6 days
| | | | | | shrink to a summary, the traps and a pointer to it Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The guide walks a newcomer through pardes day to day, and the cheatsheet ↵Gabriel Schneider6 days
| | | | | | says what Esc and Shift-Esc really do Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Release Pardes 0.14Gabriel Schneider6 days
| | | | Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Docs say how a look resolves a relative path: the looking pane's directory, ↵Gabriel Schneider6 days
| | | | | | | | | | | then each jump-list pane's, most recent first fs.md's look section and tags.md said nothing of where a relative path is looked for, so a look that found a file in a directory visited an hour ago, or not in an open pane never visited, was a surprise. The order is written as look.zig's resolveLookTarget has it. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A link looked at in a detached session with no frontend attached opens no ↵Gabriel Schneider6 days
| | | | | | | | | | | | 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 Schneider6 days
| | | | | | | | | | | | | | | 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 Schneider6 days
| | | | | | | | | | | | 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 Schneider6 days
| | | | | | | | | | | 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 Schneider6 days
| | | | | | | | | | | | 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]>
* Docs give a look miss's real words, that event is one reader's, the real cap ↵Gabriel Schneider6 days
| | | | | | | | | | | | | | on held reads, Dump's Restore word, a reused command pane's runs, and the one-write trap fs.md's look misses now read as the editor says them (<path>:99 has no line 99, has no page N); event says a second reading open fails file in use; held reads say the 64 state-holding opens are the real cap, under the 128 a connection may park; Dump says it adds a Restore word to the workspace tag; a reused command pane's body is said to keep each run under a % line, with how to take the last. The 9P skill gains the trap that bash's printf to a mounted ctl arrives one write per line. 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 Schneider6 days
| | | | | | | | | | | | | 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 Schneider6 days
| | | | | | | | | | | | | | | 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 Schneider6 days
| | | | | | | | | | | | 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 Schneider6 days
| | | | | | | | | | | | | 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]>