| Commit message (Collapse) | Author | Age |
| |
|
|
|
|
|
|
|
| |
Any rename marked the pane dirty (saved revision one back), while the
guards ask only whether its text was ever edited: /index said dirty for a
pane Exit let go without asking. The name is no edit now, so /index, the
guards and Restore agree; Save writes under the new name all the same.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
so a mount reads EINVAL
A line over 1024 bytes or with a control character was refused with its
errno EINVAL but words 9ns reads as EIO (no `invalid` in them), and logged
`err - exec`. They now say `invalid command line: ...`, and the root's
err record names the pane the line would have run at.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
| |
The line-past-end check read only a file pane's lines, so a terminal's
look went nowhere and said nothing. A terminal's lines are its logical
lines, as a +Search of it lists them.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
started answers runs
The host could not start the shell (its chdir failed), and the pane stayed
with no pty: a run written to it waited for a prompt for ever. Tty now
refuses a directory that is not there, `Tty: <dir>: no such directory`,
before making a pane; and a terminal whose shell the host could not start
(Pardes.shellFailed, from each host's spawn) answers any run with
`error shell gone`.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
| |
A builtin that would open a prompt nobody can answer (Save with no name
on a scratch, through a ctl write) failed the write without saying a
failure, so the announcement rule missed it and `msg N Save` stayed.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
| |
`err - exec: ...` said nothing of where the line ran; the root's exec and
look run at the keyboard's pane, and their err now names it, as a click
there would.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
is said as `dial failed: <reason>`
Mount took any well-formed dial and nothing was found out until the
first look through it, which then said `look: look: dial`. Mount now
probes the peer (version, attach, its root) with the turn out, and fails
its write, mounting nothing, when none answers; the dial errors read as
words, `no answer`, `timed out`, `hung up`, and a look through a peer
gone since names its path: `look: /n/peer/f: dial failed: no answer`.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
| |
Every look that found something cleared the looker's selection first, so
`@p5:2` or `f.txt:2` written to a pane's look collapsed its dot to
q1-1. Only a look that stays in the pane starts from a clean selection
now; one that goes elsewhere takes away just the click's highlight, and a
miss changes nothing, as acme's look does.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
reads the first word
In acme flag 2 promises a second record with the expanded range, and
acme's libraries read one. F records set it always and a click with no
range known set it, with none following: a library then took the next
event for it. Records here carry the word already, so 2 is never set.
Flag 1 now reads the first word as acme's lookup does, so `Msg hi` is 1.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
The check read how the weights shared the rows after the resize, not
whether the rows could hold every pane's tag and two rows: a pane the
proportional squeeze took short made `size` refuse, growing included,
and refuse sizes it took a moment before. It now asks layout.minRows,
the minimum placement asks, per column; a size they fit is taken, and a
pane the resize took under its minimum gets its rows back. An out of
range size says `invalid size`, which 9ns reads as EINVAL, as the doc had.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
| |
`file:?foo?`, `@p5:?foo?` and `:?foo?` were not taken for addresses (the
first character had to be one of `0-9+-/$.#,;`), so they went the path
way and found nothing.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
| |
Only a line number reached a terminal (the line way); any other address
went to lookAddress, which wanted a file and said the terminal was no
text. The body is now the lines a +Search of it lists, addressed from the
cursor, and the match selected as a +Search row's range is.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
| |
active pane
`@p<serial>:<line>` goes the line way (parsePathLine), where a serial
naming no pane quietly did nothing and look read back the active pane.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
A failure said while it ran (Exit's refusal, a Del refused) or later by
the host (a Save's write, a Dump's) left `msg N Save` in the log as if it
had worked. The announcement's record is remembered and taken back out
on either, unless a follower read it already. A refused pane/new logs its
err alone, and a failed Dump says its reason in words (`file not found`,
not `FileNotFound`) so its msg goes and the err is the one record.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
| |
87 of the listed words had no description: settings have no doc comment
to read, so each now carries a one-sentence doc, and the builtins without
one got theirs. Exit's no longer names an internal function, and Repl's
first sentence is short enough to be read whole.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
| |
@p<serial> took a line spot but an address after it (/re/, #n, $, 0/re/,
a range) was dropped, the name failing the file check, and an unknown
serial fell through to a search. The pane is now addressed like a file;
a miss and a serial no pane has each log an err, and look reads back
empty.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
| |
A new Tty is in raw mode, where a right click is its program's, and a
look written to it over 9P did nothing for that reason. The look file is
no keyboard input: over 9P a plain word is listed in a +Search pane and
read back whatever the terminal's key mode.
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]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
deleted, reloaded
get on a file gone from disk failed with a bare ENOENT; it now says get:
<path>: no such file. A watched file deleted on disk was silent; the pane
keeps its text and says <file> deleted on disk (Save writes it again)
once, logged changed <serial> deleted (only a path the watch has read: a
pane renamed to a name never on disk is not deleted). A get that throws a
dirty buffer's
state away logs changed <serial> reloaded, as the watch's reload does.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
| |
With LookWord list, or in a terminal, a look lists every place in a
+Search pane, yet look read back the source pane, as if the hit were
selected there. It now reads back the +Search pane it made.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
Save through exec on a terminal (or a scratch) opened its path prompt on
screen, where no script could see or answer it, and a second Save stacked
another. Opened while a 9P request is served, it now logs ask <serial>
save path; answer <path> on the pane's ctl saves there and closes it,
answer - closes it; asked again, the open one stands. A pane closed with
it open logs answer <serial> -.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
Newcol with every column slot taken, or a column too narrow to split,
did nothing and said nothing. It now fails (a ctl write with it) with no
space for a column: 16 max (ENOSPC through 9ns), or that the column is
too narrow. MAX_COLS is 16 on a desktop, 6 on the board; each column
costs about 8 KB of core state (the Pardes struct grows from 1.47 MB to
1.56 MB), most of it its tag's text. fs.md and the skill give the cap.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
Repl showed Joincol's first line and Joincol another's, because a comment
had drifted above the wrong declaration in builtins.zig; Kill's was cut
mid-sentence and Exit's cited exec.c:892. The drifted line is back on
Joincol, a parenthesis citing source (.c, .zig) is dropped, and the first
sentence is kept whole up to 240 bytes, then cut between words with an
ellipsis. A test checks every description opens its own word's comment.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
A /commands line gave a word, its argument and root or pane, but not
what it does, and called Edit a pane's word though the root's ctl takes
it too. Each line now ends with -- and the first sentence of the word's
doc comment (read from builtins.zig itself, so there is one copy), and
Edit is both. fs.md says a pane's word such as Undo or Msg is refused at
the root.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
| |
The workspace had /tagexec and a column its exec, but a pane's own tag
could be clicked only by an event record. pane/<n>/tagexec runs each line
as a click in that pane's tag (never redirected to its event reader, as a
header's is not) and reads back what it touched. The README, fs.md and
the skill list it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
choices, a clean reload is logged
get's refusal now quotes the line as a builtin's (Save's) does; a bare
answer while a question stands says what it takes (answer takes k j or
-); and a clean buffer reloaded from disk logs changed <serial> reloaded,
as the kept dirty case logs changed <serial>. (A failed Save already says
why: Save <path>: <the error in words>.)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
A plain word looked at (a look write, a right click, an ML record written
back) opened another identically named +Search pane each time, until the
panes ran out, and never wrapped. As acme's look3 searches the text for
it (look.c:210), it now selects the word's next place in that pane after
the dot, wrapping at the end, and opens nothing. LookWord list, a new
root setting, keeps the +Search listing (search is the default); the
rsearch snapshot and an output test that walk the listing say LookWord
list. (The leader-path check over every builtin gets a comptime
branch quota, as one more builtin took the GUI build past the default.)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
| |
A bare Shell reset to the default without saying which; it now says
Shell: the default again, <shell> ($SHELL, else /bin/sh). A line:col of
column 0 said only address out of range; it now adds that a column
counts from 1.
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 watched file rewritten on disk was loaded over a buffer's unsaved edits
and its dirty flag cleared, so Exit and Del no longer asked about them. A
clean buffer still reloads; one with edits keeps its text and stays dirty,
says <file> changed on disk (get reloads it, Save overwrites it), logs
changed <serial>, and its Save warns once before overwriting the newer
file, as acme's Put refuses a file modified since read (exec.c:577); get
asks as ever (winclean, exec.c:513). The restored-watch test's dirty case
now keeps the snapshot, and the filewatch snapshot script (re-recorded
by name) checks both halves: the edited pane keeps its edit and says so,
the clean one reloads.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
Finding where an Edit block ends parsed the whole block again for every
line, copying it into the scratch arena each time: a 10k-line $a block
took minutes and tens of GB. sam_edit.waitsFor says what the block waits
for, and while that is a text block's . line, only such a line is parsed
again (editEnd, shared by Messages and completeEnd), its copy freed. A
10k-line block now takes well under a second and 50 MB of scratch.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
| |
"window not locked by this open" was acme's word; pardes has panes.
Its test compares the constant, so it follows.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
| |
The refusal listed every language and was clipped to fit, ending mid-word.
It now names six, those that start as the word did first (pithon:
python), says how many more, and points at docs/tags.md, which lists them
all.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
size refused an out-of-range line without saying the range, took a size
too small for the panes (leaving bodies of no rows), and a terminal
squeezed to its tag kept a pty of its old size. The refusal now names
20x6 to 4096x4096 (a bare size is EINVAL like any malformed line), a size
that would leave any pane less than its tag and 2 rows is refused and
undone, and a terminal's pty is resized with its pane down to one row
(only a folded or unplaced one keeps its grid).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
| |
A directory passes access(X_OK), so Tty /etc made a pane whose shell
exited 127 and Shell /etc was taken. The shell lookup now refuses a
directory, and both say "not a shell: /etc is a directory" (Tty and
Shell share one refusal, host_io.Shell.refusal). shellset's golden takes
the shared wording (re-recorded by name).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
| |
A --detach session nobody is attached to stayed 80x24, too small for an
agent's panes, and nothing could change it. The root ctl takes size <cols>
<rows> while no frontend is attached (refused while one owns the size), and
a client that attaches later still sets its own (the server compares with
the core's size). Documented with the 80x24 default.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
| |
Edit's p and = put their output in +Errors, and when its column had no
room the placement refusal failed the whole Edit. +Errors now tries every
column with room, the last first, and with none its text is logged as msg
records, a line each; the Edit succeeds.
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]>
|
| |
|
|
|
|
|
|
|
|
|
| |
A builtin failing a ctl write logged its Verbose announcement, its words as
a msg, and the write's err, so the same failure again never repeated the
newest record and never collapsed. Its err alone is logged now (the msg is
still shown and kept in +Messages). A repeat of a record a follower has
read is a new line with the running total, (xN) being N in all. fs.md
states both rules.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
Shell took any word and the host quietly ran another shell at the next
spawn. It now refuses a path or name that is not executable ("Shell: x:
no executable by that name", failing a ctl write, logged err), a bare
Shell goes back to the default, and a default $SHELL that is not
executable falls back to /bin/sh. shellset's golden takes the refusal on
the message row (re-recorded by name).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
| |
With no Shell set, pardes ran fish, which a box may not have and a user
may not use. The default is now the user's login shell ($SHELL), else
/bin/sh; an explicit Shell still overrides it. The tests pin their own
shell (snapshots bash, the python suites /bin/sh or bash) and pass with
SHELL unset; the Config report and docs say where the default comes from.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
| |
1000 Undos with nothing left made 2000 log lines: the Verbose announcement
and the answer each time. A msg repeating the newest record is now that
record counted, (xN), as err's already were (shared as pushCounting), unless
a follower has read it; and a builtin's own words that start with its name
take the place of its announcement just before them.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
| |
A pane's Undo or Redo with no step left did nothing and said nothing. It
now says "Undo: nothing to undo" (or Redo's) as a message, not a failure,
so a ctl write of it still succeeds as acme's silent Undo does. The docs
give the 256-step history.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
A mount cuts a write at its message size, and each piece ran on its own: a
line cut at the boundary ran as shell commands and a 50 KB Edit block
broke. An open of look, exec, tagexec, any ctl or a column's exec now keeps
an unfinished last line, or an Edit block still open, until its next write
or its release, and never runs a fragment. The same open record holds what
its last write touched, which a read on it answers (as /net/tcp/clone
does); an open that never wrote reads the session's last as of its open.
A release that runs a held line waits for quiet and counts as a change;
a clicked line with a control character is still refused at its write.
Tested in unit tests, fs.py (python client, 8 KiB) and selfmount.py (the
kernel mount, a 1000-line seq burst and a 50 KB Edit block).
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]>
|
| |
|
|
|
|
|
|
|
| |
The miss message clipped what was looked at to 48 bytes, mid-word, and a
path past 160 bytes turned the has-no-line message into a bare no match.
Both now carry up to 256 bytes, cut on a character boundary with an
ellipsis past that.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
| |
Look's clean start cleared the active pane's selection before the address
read the dot, so the root look's file:/re/ always found the same match, a
miss collapsed the dot to a caret, and dumps kept the collapsed dot. A pane
already open on the path is now addressed where it stands.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
A ctl Edit that missed answered `Edit: no match for regexp "Edit
/nomatch/d"`, quoting the whole program; it now names the address that
missed (`no match for regexp /nomatch/`) and quotes no line after. An s
on an empty dot says `no substitution: dot is empty`. A \\1 is blamed
only once its pattern has matched, as before. tags.md says & is special
in s and not in c, a or i, as in sam.
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]>
|