| Commit message (Collapse) | Author | Age |
| ... | |
| |
|
|
|
|
|
|
|
|
|
|
|
| |
not be written, permission denied; `pardes -` from such a directory pages into the session's
`/tmp/../etc` named a +Pager `/tmp/../etc/+Pager`, a second one beside
`/etc/+Pager`, and `~/x` was refused as relative. The directory is now
home-expanded and resolved before it is checked, and one that may not
be written is refused as a file's name there is (fs.deniedAbove).
`pardes -` run in such a directory (`git log` under /usr/src) asks for
the session's +Pager instead, so its text is still paged.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
| |
before
writePager emptied the answer only once the directory had passed, so a
read after a refused write on the same open still gave the last write's
serial. It is emptied first, as a refused look or exec leaves none.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
that asked it, and says on the message row that it previewed and applied nothing
A multi-file Rename filled a +Search preview but the waiting exec write
answered the pane it was asked from, and nothing was said. lspResponse
now notes the pane it filled (fs.lsp_result); the write that waited for
the answer reads that pane back, as a look or an exec answers the pane
it went to, and the message row says `Rename: N edit(s) across files,
previewed, not applied`.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
a 9ns mount maps back: pardes re-pins cloud9, whose fs.enameErrno knows acme's address and argument refusals
The tests' request helper asks cloud9's fs.enameErrno, the rules 9ns
turns a refusal's words back into an errno with, for every EINVAL and
ENOENT a request is refused with, and fails the test when a mount
would hear another (EIO, mostly): "this pane has no text to address"
was one. The re-pinned cloud9 maps acme's own refusals, which pardes
keeps in acme's words: no match for regexp, address out of range,
addresses out of order, range past end of body and the rest.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
| |
this pane has no text to address`, which a mount reads as EINVAL, not EIO
9ns maps a refusal back to its errno by its words; "this pane has no
text to address" held none it knows. The reference quotes the new words.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
invalid directory "relative": must be absolute`
9ns maps a refusal back to an errno by its words, and "the directory
must be absolute" and "one directory a write" held none it knows, so a
shell through the mount got EIO for both. They now say `invalid`, as
every EINVAL here does, and the reference quotes the new words.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
on showing the one it did, its file still the one named
A Restore makes a fresh core, which started at the default theme and
asked for the dump's ThemeFile; when that file had broken since, the
failure reverted to what the fresh core had loaded, nothing, and ink
became orchard. A Restore that asks for a ThemeFile now carries over
the theme the old session showed and the file it loaded (and its Theme,
unless the dump names one), so a failure there changes nothing.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
| |
dumped themes ...`, no `04:39:41 ` before it
Messages a host stamps (saved, reloaded, dumped themes) went into the
log with their clock and its double blank. The log has no times;
noteMessage records the words after the stamp (Message.body).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
| |
argument after a + is no unknown control message there
checkBuiltin split a line at its first blank only, so `Tty+bash` was
one unknown word on a ctl while exec ran it. It now splits at the +
for the words whose registry entry says they take one so.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
| |
EINVAL: no +Pager named into a missing directory, none quietly the session's
`/(/+Pager` was made for a missing absolute directory, and a relative
one fell back to the session's without a word. An empty line still asks
for the session's directory.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
| |
the pane has no text "(a terminal, ...)"
A terminal's body takes writes (its keys), so the old words named the
one kind that does. data, sel and dirty keep "this pane has no text",
which is true of all three.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
never FileTooLarge, ParseZon or a bare `parse zon`
Restore read failures named the Zig error (FileTooLarge, NotAFile,
ReadFailed), a file that is no dump said `not a pardes dump (ParseZon)`,
and a ThemeFile that did not parse said `parse zon`. Messages.errorWords
says an error in words (the few that read badly spelled out plainly,
the rest spaced and lower case, as reportError did), and zonWhy gives
the parser's first error with its line: `not a pardes dump: line 1:
expected ...`, `theme file x.zon: line 3: ...`.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
permission denied, and a Save there says so, not no such directory
`pardes noperm/a/b/c` and `pardes /proc/1/root/x` took the missing
directory for one Save would make, opened a pane and exited 0; its Save
then said "no such directory". fs.deniedAbove finds the nearest
directory there and asks whether it may be searched and written:
forwarding refuses such a name, exit 1, "permission denied", and a
failed Save says "permission denied", which the writer's 9P error
carries as EPERM (9ns: EACCES).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
program was killed there is no longer busy for ever
htop killed with `sig KILL` leaves the emulator on its alternate screen;
bash comes back and draws its prompt there, marks and all, but
promptInputReady refused any prompt on the alternate screen, so
pty/status said busy 1 and pty/run answered a bare `busy` for good.
A prompt mark there now counts. A run sent at such a prompt leaves the
alternate screen in the emulator first, as a reused command pane does,
so its output lands on the primary screen and is read whole, not
`exit 0 cut` with nothing. Busy there with no prompt drawn, and no
program name to give, a run is told `busy alternate screen`.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
| |
terminal by kind no longer picks a pane with no shell
A command pane runs one line and takes no typing; a script choosing
`$2=="term"` to type into got one. Its kind is now cmd; a shell's stays
term.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
stays open: another client's command in the same directory gets a pane of its own
A finished command pane was the next command's for its directory, from
any client, so with four clients scripting one session, one read
another's output as its own last run. An open of a look or exec file
whose write was answered a pane's serial now holds that pane: reuse
passes over it and a new command pane runs the line. The open's own
next command may run there again, and once it is closed the directory's
one command pane is reused as before.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
another client's exec meanwhile can never take the text into its pane
pardes - wrote `pager <dir>` to /ctl, then read /exec on a fresh open,
which answers the session's last answer: a client that exec'd in
between had its pane overwritten by the paged text. /pager takes the
directory and answers the +Pager's serial on the open that wrote it,
as /pane/new answers its own open; the ctl verb is gone. Client.ask
writes and reads on one open. The README's look recipe reads its
answer on its own open too.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
takes all that fit, before the hangup cuts it
A follower reads one record per read, and a Restore hangs every client
up, so records queued just before it -- the ones a script most wants,
what led up to the Restore -- were lost: the read after the first was
cut. Before the cut, each held read of /log is answered with every
whole record queued that fits it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
are refused alike: "this pane has no text to address"
A terminal took an addr write and evaluated it over nothing, saying
"bad address syntax" or "address out of range" by the expression, while
dot refused it as no text at all. A range file of a pane with no text
now refuses every write the same way, before the expression is read.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
| |
size quoted its own word in every refusal, as bad values were quoted
before round 31's change for the settings. The value is the offending
word here too, and is now what each size refusal quotes.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
whole; cut only when its start really scrolled away
A clear (ED 2, ED 3, a reset) under a running command marked its output
lost, so `clear; ls` answered only "exit 0 cut". The output's start is
now pinned again at the screen's top after the erase: what the command
prints from there is its answer, whole, and a cut is said only when
that start leaves the scrollback.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
look whose address fails never leaves the file it opened
`a.txt:2:3:`, as a compiler prints a place, failed as bad address
syntax, and still opened a.txt: the file was opened to read the
address in, and stayed when the address failed. The trailing colon is
now no part of the place, and a pane opened only to evaluate an address
that fails goes again, the miss said from the pane looked from.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
again, as a /ctl write of it does
The dump's ThemeFile line went to the settings table, which has no
such setting and never asks the host to read a file, so a restored
session came back in the default theme. The restore now makes the
request a /ctl ThemeFile makes, and the host loads the file.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
naming the file last loaded, or none, so they always replay
The request's path was taken as the theme file before the host had
read it, so a file not found or not ZON left /ctl saying ThemeFile
<that path>, and writing the report back failed again. The path a load
succeeds with is now kept apart; a failure puts the request back to it
(and watches it again), or to none.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
and log as different records, never merged as one (x2)
A setting's bad value quoted the setting's word, so "Verbose maybe"
and "Verbose nope" made the same err text and the log's repeat count
merged them. The value is the offending word, and is now the one
quoted, blanks and all; the log's dedupe, comparing whole texts,
then keeps them apart.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
what a range holds, EINVAL with why
A record from origin Q was taken as any other, and an offset past
2^32 was clamped to the largest one and acted on. Both are now
refused before anything runs, the overflow as "bad number"; a range
past the end was and is EINVAL too.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
cat sel reads it back; one open's writes run on from the last
The selection collapsed to a point after the write, so sel read back
nothing. What is written is now dot, and the next write of the same
open goes at its end and grows it (acme's wrselrange), so a shell's
several writes make one selection; another open's write replaces it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
log record; streams the text in bounded writes; never loses it; handles \r, NUL and BEL as a terminal does
Each paged command made another +Pager until placement failed, and
then git's text was lost with exit 0; a 130 MB page timed out half
written and dirty; a directory whose name held a newline left a stray
+New; and the log said new +New then rename. The root ctl's `pager
<dir>` now makes the directory's +Pager (named before it is announced,
placed without the keyboard) or empties the one there; the text goes
into it a line-ended 8 MiB chunk a write, one undo step, up to the file
limit and its note, and is left clean. A directory a ctl line cannot
name pages into the session's. Any failure prints the text to stderr
with why and exits 1. A carriage return keeps a progress line's last
state and CRLF is a newline; NUL, BEL, SO and SI go; empty stdin makes
no pane.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
read loop on event works
A read shorter than the record waiting was refused EINVAL, and bash's
read, a byte at a time on a file it cannot seek in, failed on the
first record. A short read now takes the record's front and the next
read the rest, as log and pty/data already did and acme allows. A
unit test reads two records a byte at a time; selfmount runs a bash
read on event through the mount.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
from every way a look comes; a PDF's :0 has no page 0
A look of `:12` had no path to resolve, so it fell through to a word
search for the text ":12" and found nothing. A digit-led address with
no path now names the looking pane, as `:/re/` already did: its look,
the root's (the keyboard's pane), Look, B3 and an event write-back all
reach it, a terminal's logical lines included. On a PDF, :0 is the
has-no-page miss rather than a refusal.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
choice: Petscii on the pane, TermImages for new ones
Under an outer terminal without kitty graphics a tty pardes cannot pass a
terminal pane's images on, so it draws them itself as an image pane's
Petscii does: each row of an image is matched to C64-palette glyph art
over the cells it covers (GlyphArt.renderRect, the exact-grid half of
GlyphArt.render), cached while it is on screen. yazi is still told the
kitty protocol works, so it keeps sending its previews.
The same art is a choice anywhere: the Petscii builtin now takes a
terminal pane too (PaneKind.picture), flipping its images between pixels
and glyphs, and a terminal holding images, or drawing them as glyphs by
choice, says petscii:on|off in its tag as an image pane does. TermImages
real|petscii (default real) is what a new terminal starts with; it is in
DumpConfig, /ctl and the reference.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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]>
|
| |
|
|
|
|
|
|
|
|
|
| |
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]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
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]>
|
| |
|
|
|
|
|
|
|
| |
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]>
|
| |
|
|
|
|
|
|
|
|
| |
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]>
|
| |
|
|
|
|
|
|
|
|
|
| |
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]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
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]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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]>
|
| |
|
|
|
|
| |
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]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
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]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
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]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
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]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
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]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
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]>
|
| |
|
|
|
|
|
|
|
|
| |
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]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
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]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
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]>
|