| Commit message (Collapse) | Author | Age |
| |
|
|
|
|
|
|
|
|
|
|
| |
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]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
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]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
pane its tag and 2 rows
Joincol moved every pane of the keyboard's column into the next one
whether they fit or not. Two columns of two panes in a 12-row window
became one column of four, wanting 12 rows where 10 were free, a layout
that `size` then refused as it stood. Joincol now tries the join in place
first (layout.joinFits: the panes and width moved, minimaFit asked,
everything put back, nothing dropped or logged). A join that does not
fit is refused, "Joincol: no space: the joined column cannot give each
pane its tag and 2 rows".
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
a refused one stand
A `>` to a tag that a client sends in several writes is checked a write
at a time. When a later one is refused, the earlier accepted ones stay in
the tag. Buffering the whole open to apply it or none would cost more
than it saves, so fs.md now says what happens: each write stands on its
own, and only the refused one changes nothing. A test covers a
truncation, an accepted write, then a refused one.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
4096 bytes fits
`echo <4096 bytes> > tag` wrote 4097 bytes and was refused "over 4096
bytes", although a rewrite drops that one trailing newline and would have
held exactly 4096. The limit now counts a truncating write's text without
the newline it drops, for a pane's, a column's and the workspace's tag. An
append still counts its newline, which it keeps.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
acme's placement does
A pane/new whose column had no room was refused "no space for a pane in
that column", even with another column holding a tall pane that could
give rows. acme takes rows wherever a window has them before saying
there are none. pane/new now tries the other columns as +Errors already
did: an empty one, else its tallest pane's bottom half, last column
first. It is refused only when no pane anywhere can give the rows.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
err record says tag: once
The refusal's text began with "tag: ", and the log's err record puts the
file's name before the reason. So the record read `err - col/1/tag: tag:
no space: over 4096 bytes`. The text is now the reason alone, as the
control-character refusal's is, and the record names the file once.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
runs as nothing at an exec, a ctl or the init file
DumpConfig's information lines ("Platform: tty", "Startup config: ...")
began with words. Written back, as the report means to be, or clicked,
each ran as a shell command or failed as an unknown control message.
Each now starts with `# `. A line starting with `#` is a comment, as in a
shell: it runs as nothing, silently, at an exec, at the root's, a pane's
or a column's ctl, and in the init file. Documented in fs.md and
config.md.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
and spends no column serial
Newcol tries its column before keeping it: the new column is inserted,
the panes' rows are shared out again, and where a pane would be left
under its tag and two rows the column is taken back. The trial showed.
insertColumn logged `newcol N` and the take-back `delcol N`, so a
follower saw a column come and go around the err. Laying the column out
also gave it a serial, so the next column made skipped one. The trial is
now unannounced, since insert and drop have unlogged forms. A refusal puts
the serial counter back where it was, after first giving every existing
column its serial so the trial's is the only one spent. Only a column
that stays is logged, and it gets the next serial.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
directory, not the keyboard pane's
New, Tty and commands clicked in a tag no pane owns ran in the session's
directory, but Help named its +Help after the pane with the keyboard, and
Find walked that pane's directory. So the same click gave different
results depending on which pane was focused. Both now take the session's
directory from a header, through execDir as the others do.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
pane's does
A pane tag read back its text alone, but a column tag and /tag appended a
newline and gave a stat size one byte longer. So `$(cat tag)` agreed across
the three kinds while `cat tag | wc -c` and a byte compare did not. All
three now read the text alone, and fs.md says so.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
The words New and Tty make a pane in the session's directory, and fs.md
already has them run at a tag no pane owns. But /tagexec refused New as a
pane's word, since the workspace tag does not hold it. Every header exec
also failed ENOENT when no pane was left, and Tty gave up when it had no
pane to take a directory from. Now New and Tty are every tag's words.
A header exec with no pane runs at the stand-in, as a click in the empty
window's tag does, and Tty with no pane asking starts in the session's
directory, as New's scratch does.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
pane reads back nothing
Newcol written to /tagexec read back `1`, the pane with the keyboard, which
the word never touched. That was a pane word's fallback (a pane's exec
answers the pane it ran at) applied to a tag no pane owns. A word in a
column's or the workspace's tag now answers the pane it made, refilled, went
to or focused, and otherwise nothing.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
| |
`>` write leaves the tag as it was
A column's or the workspace's tag took any length, so a write past 4096 bytes went in and a later Dump failed on it (bad dump tag), and a truncating open wiped any tag before the write after it could be refused. The column and workspace tags now refuse what a pane tag refuses: the 4096-byte limit (ENOSPC, tag: no space: over 4096 bytes) as well as the control characters they already did. A truncation of any of the three is held until the write after it is known to fit, and done with it; a refused write drops it; a close or read with no write after it does it then (so `: > tag` still clears). A test runs a truncating write too long, a control character and a bare truncation at each kind, and Dumps after. docs/fs.md says so.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
| |
a write to pane/new, is its error alone, and every refusal is said in words
The one-failure rule is a write's. A refused remove, pane/new's open refused for want of a slot, and an OTRUNC open's refused truncation (data's after a failed addr) also logged an err, and a reply carrying only an errno reached the client as the C library's text (Operation not permitted). tree.handle now gives such a reply Plan 9's words, chosen so 9ns maps each back to its errno (EPERM's to EACCES, as Plan 9's does), and serveFs logs errs for writes only, not a write to pane/new, which is only read. docs/fs.md and the 9P skill say so, and that a look miss quotes what was written.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
| |
With Verbose on by default, /log filled with msg - DumpDir, msg 4 Grep and the like, with machinery to take an announcement back out when its builtin failed or said something itself. A msg record is now only something said; the take-back machinery goes with it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
says so
A NUL written into a tag went into the dump, which the host then could
not write, and Dump said nothing: a success that wrote nothing. Tag
writes, the workspace's, a column's and a pane's, refuse control
characters but tab and newline, DEL, C1 and bytes not UTF-8, EINVAL; and
Dump reports any failure of its own instead of swallowing it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
words are
Edit was let through the pane-word check (the root's ctl takes it at the
active pane), so `Edit ,d` written to a tag no pane owns wiped the pane
with the keyboard. Every pane-scope word a tag does not hold is refused
there now, Edit included; a test enumerates them all.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
character
An empty name, a word written to log other than follow, a data, sel, dot
or dirty write to a pane with no text, a truncate other than to zero,
and a control character in a look line written through a held open were
refused with no words, logged as `Invalid argument`. Each says its reason
now; and DEL is refused in exec and look lines as in names.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
the focused pane
Undo, Msg and the other pane words written to a tag no pane owns ran at
whichever pane had the keyboard. They are refused as the root's ctl
refuses them, EINVAL; the tag's own words (a column's New, Tty, Find,
Grep) still run.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
| |
writeCtl never cleared what the last write touched before its lines ran,
so `New` through col/<n>/ctl read back the earlier write's serial too.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
| |
tagexec's does
A word run from a header runs in the session's directory (execDir), but
New named its scratch after the pane with the keyboard.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
A builtin that failed through a ctl failed the write and logged its err,
but through look, exec, tagexec or a column's exec it only said so on the
message row, logged as a msg, and the write succeeded. Now every click
write runs its builtin as a ctl line does (ctl.captured): a failure fails
the write, with its words (EINVAL for malformed input, else EIO or what
the words name), logs one err and no msg or announcement. get's Modified
and a look miss are shown but logged once, as their err. A control
character's refusal names its reason, a failed click reads back nothing,
and look never reads back a pane closed since. The special case for a
cut-short Edit through exec goes (the rule covers it); fs.md's table of
exceptions becomes the one rule, as does the skill.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
takes
A column's ctl refused an unknown word in words 9ns maps to EIO, and
took New extra as New. It now refuses the word as unknown control
message (EINVAL, as the root and pane ctls) and any word but Tty with
an argument as wrong #args. A bare answer on a pane's ctl says answer
takes a choice or -, not unknown control message.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
| |
A command from a column's tag ran in a command pane at the foot of the
last column, however far from the tag, and could reuse a finished one
anywhere. It now goes to the tag's column, under both placements, and
reuses only a finished command pane in that column.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
| |
A command or Tty run from the workspace tag or a column tag started in
the focused pane's directory, though those tags have none of their own.
As acme's row and column tags do, they now run in the session's
directory, where pardes started (Pardes.sessionDir); a pane's tag and
text keep the pane's. The same for /tagexec, a column's exec and ctl.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
| |
A command line longer than the 1024 bytes a command pane takes was said on
the message row after the write had already succeeded. An exec write (the
root's, a pane's, tagexec, a column's) now refuses it before anything runs,
EINVAL with "a command line is at most 1024 bytes" and an err record; a
builtin's line, a long Msg or an Edit block, is not limited.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
and a tag's words log as the session's
/tagexec runs a word as a click in the workspace tag, as col/<serial>/exec
does in a column's. A column's exec was write-only; it and /tagexec now
read back the serials the last write touched, as /exec does. A click in a
tag no longer goes to the focused pane's event reader, and what a word
run from a column's ctl or exec or /tagexec says is logged msg -, not
against the focused pane. The README, fs.md and the skill say so, and
document the answer record.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
| |
noteError named every column node col/<serial>/tag, so a refused ctl write
or rmdir pointed at the tag. It now names col/<serial>/ctl, /exec, /tag or
the directory itself.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
A script could read and write a column's tag but not act on the column.
col/<serial>/ctl takes Delcol, Joincol, New and Tty, each acting on that
column as from its tag; col/<serial>/exec runs a word as a middle click in
the tag; rmdir col/<serial> closes an empty column and refuses one with
panes (ENOTEMPTY, an err record saying why). The root ctl's refusal of
Delcol and Joincol points at col/<serial>/ctl. A dump keeps each column's
serial and Restore logs restoredcol <old> <new>; the dump golden gains
them. Documented: Joincol's survivor, the column on the right, keeps its
serial and tag.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
Writing a serial to /focus gave that pane the keyboard but left the active
column where it was, so pane/new under Placement acme went elsewhere, and
/layout's active named the keyboard's column rather than where a new pane
would go. A focus write now sets the active column as the user's click
there would, under either Placement, and /layout's active names the active
column, which pane/new and a look place into.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
/col/<n> named a column by its index, which shifts when a column left of it
closes: exactly what scripts trip on. A column is now /col/<serial>, its
serial kept while it lives and never reused; /layout lines give serial and
index (`<serial> <index> ...`), active names the serial, /index's last
field is the column's serial, and the log says newcol and delcol with
serials. Docs, the skill and the tree's README say so.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
|
|
A script could not see where the panes sit or edit the tags a person
clicks in. /layout lists each column, its index, x and width in cells,
current or not, empty or full, and its panes' serials, then the active
column; /tag is the workspace tag and /col/<n>/tag a column's, read and
written as a pane tag is (one line: a newline written in is a space, and a
truncating write drops the one ending it); /index's lines end with the
pane's column; the log says newcol <n> and delcol <n>. acme serves no
column files, and the docs say so.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|