| Commit message (Collapse) | Author | Age |
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
freed at one
The ranges beside the primary were an inline array in every Text, which at
1024 grew each pane by about 60 KiB. They are now allocated when a second
range appears (Text.reserveSels) and given back when the selection is one
range again (Text.dropSels); a column's or the workspace's tag allocates from
Text.gpa, any other text from its pane's. A refused tag edit restores them by
copy. The Pane size budget is back to 128 KiB, and a test holds that a single
cursor allocates nothing for them.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
helix goto_word: the words of two or more word characters between the
view's first and last lines get two-letter labels, nearest the cursor first,
one forward and one back in turn (modal.jumpWords). The next two keys choose
one and select it, stretching the selection to it in select mode; any other
key takes the labels away. The words live on Pane.jump, and renderBody paints
their labels over the body's cells in the selection colours, the one change
on the render side.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
| |
Z is helix's sticky view mode: the z keys stay armed after each until Esc,
which leaves the mode and does nothing else (no pane hop). zm is
align_view_middle: an unwrapped view scrolls sideways so the cursor's column
is in its middle.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
helix smart_tab: in insert mode, Tab where text precedes the cursor on its
line moves past the end of the node the cursor is in, the parent-node end of
Alt-e; in leading blanks it indents. Only where the file has a grammar: the
reference pins smart tab off, which a file without a grammar agrees with, so
there Tab still indents. Shift-Tab is insert_tab, and the differential
harness now reads the S- modifier.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
| |
helix commit_undo_checkpoint: u after the insert session goes back to the
text as it was at Ctrl-s, a second u to before the session. It pushes an
undo snapshot where the session stands.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
| |
helix's earlier/later walk its history tree by time; pardes's history is a
line, where earlier and later are undo and redo, so the keys are aliases.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
| |
helix goto_last_modification: every range moves to the end of the last
change (the start of a deletion, the end of an insertion), extending in
select mode. The position is kept on the Text in surface rows, set where
setEditText hands a body its new text, so a terminal's typed text has one
too and moves with its scrollback.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
helix's expand/shrink, previous/next sibling, all siblings, all children and
parent-node end/start (Alt-o/up, Alt-i/down, Alt-p/left, Alt-right, Alt-a,
Alt-I, Alt-e, Alt-b; Alt-n stays the new terminal) walk a whole-file parse
the file keeps (File.node_tree), made on the first such key after an edit and
reused until the next, never per key. syntax.walkNodes follows helix's
TreeCursor over every node, anonymous ones included, and Alt-i goes back to
what Alt-o grew from while the selection still holds it. The harness runs
without grammars, so the cases prove the plain-text no-op; a test replays
eleven JSON walks whose results were taken from the installed hx.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
range forward
K and Alt-K share the s/S prompt, which now carries a mode rather than a
split flag: a range stays when a match starts inside it (K) or when none does
(Alt-K), the primary becomes the first, and keeping none leaves the selection
as it was (helix keep_or_remove_matches). Alt-: is ensure_selections_forward.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
The limit was 64 everywhere, which helix-golf's enumerate_and_align outgrows
(%s |\d+ makes 121 ranges). It is now memory.limits.selections, per platform,
and the counts that hold it are u16. The ranges stay inline in each Text, so a
pane grows by about 80 KiB on the desktop (three texts and the regex prompt's
snapshot); the Pane size budget in Terminal.zig moves from 128 to 160 KiB and
says why.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
Macro.zig keeps keys to be typed again. Q records into @ (or "<reg>) in
helix's key notation until the next Q; q replays a register's keys count
times through the modal handling, where Esc does not hop panes and Enter,
Tab and Space neither look, execute nor open the leader. . replays the
normal command that entered the last insert session once and what was typed
in it count times (helix repeat_last_insert). a at the end of the text now
adds the newline helix's append_mode does, which a terminal's text does not.
helix-golf's invert_dictionary passes.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
$ was a second key for line end, which helix never meant: in helix it is
shell_keep_pipe. It now arms the pipe prompt with a $ marker, runs the
command once per range with that range's text on stdin, and keeps the ranges
it exits 0 on; the primary stays if kept, else the last kept range takes
over, and keeping none changes nothing. The runner's answer is all or
nothing, so the command runs in a subshell whose status is echoed as its
output. Line end stays on helix's own gl and End; the snapshots, tutor and
docs that pressed $ for it press gl.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
read it whole
setEditText freed the text a tag edit was handed once it had copied the
tag's own part out of it, but every caller reads that text back to place the
cursor, and surround goes on to edit it again: ms and md in a tag read freed
memory. The same held for a terminal without an edit buffer and a text with
no pane. The text is now kept until the next such edit (edit.retireEditText),
which covers every caller at once; the callers the audit found reading it
back are surround's two, the paste and replace paths, the number adjust, and
the insert-mode Enter.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
Insert mode dropped the selection on the first key and restored only the
primary's appended-over span on Esc. Now each insert-mode edit is made at the
bare cursor as before, and the range is then carried through it with helix's
Range::map rules: typing slides an i range and stretches an a range, Enter
(which now also drops the blanks before the cursor, as helix does) slides or
stretches by what the cursor moved, and an arrow collapses. The replay gives
every other range the same. Esc after a pulls each range's end back by one
(helix restore_cursor), which replaces Text.append_at. The wiX-edit-drops-sel
and msel-append waivers are gone.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
Registers.zig replaces the one yank buffer: every register keeps a value per
range, y fills them in document order, and p, P, R and insert Ctrl-r put
value i at range i, repeating the last (helix paste_impl). "<reg> names the
register for the next command; _ swallows, # numbers the ranges, . is each
range's text, % the file's name, / the last s/S pattern, and + and * are the
system clipboard through the ClipYank and ClipPaste paths. SPC y now writes
+ alone, as helix's does. The acme chords and a paste into a terminal take
the default register joined by newlines. The msel-yank-paste waiver is gone.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
helix-golf's enumerate_and_align ends on %s |\d+<ret>&. align_selections
treats the k-th range of each line as column k and puts spaces before each
range until its head reaches the widest head of its column, measured in
display cells, which File.rawDisplayCol already gives. A range over several
lines refuses, as in helix. The example itself still needs more than 64
ranges, which the selection model does not hold.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
| |
helix's delete_char_backward dedents: when everything before the cursor on its
line is blank, it deletes back to the previous multiple of the indent width,
a whole unit when already on one (a tab before the cursor still goes alone).
pardes deleted one space, so O<backspace> under an indented line left three
of four, which is where helix-golf's function_into_class ended up.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
helix-golf swaps keys and values with rotate_selection_contents (webS_to_
<ret><A-(>, then per line). Each range's text moves to the next range (the
previous one for Alt-(), in one edit; a count rotates by that many ranges,
each range comes back over the text it now holds in its own direction, and
the primary follows its text. That is the harness's helix; 25.07.1 read the
count as a group size and left the primary alone.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
| |
helix-golf's text_into_array turns lines into an array with %<A-s>ms"<A-J>i,:
join_selections_space joins like J and leaves one cursor on each space it
inserted. J and Alt-J now make one edit over every range, as helix does,
rather than J being replayed per range; that is what lets Alt-J hand back
all the spaces as the new selection.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
| |
[<space> and ]<space> measured from the cursor's line, so over a selection of
several lines whose head was at the bottom, [<space> opened a line INSIDE the
selection. helix takes the range's line_range: above its start, below its end.
helix-golf's export_from_mod (yp[<space>) is where it showed.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
| |
R always left the head on the pasted text's last char. helix maps the
replaced range through the change, so a backward selection comes back
backward, its head on the first char: helix-golf's reverse_golf_example
(xbR) is where it showed. SPC R shares the path.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
| |
ms<ch> always left the wrapped range pointing forward. helix gives each range
back with_direction(range.direction()), so a selection made backward (b, or v
moving up) keeps its head on the open, which is where the next motion starts
from. helix-golf's csv_to_sql (bms`) is where it showed.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
language's files
Repl python in a terminal's tag or on its ctl binds it (Repl - unbinds, Repl
bare says the binding, the same word again changes nothing), with an id,
python-a, python-b, in its tag. An exec made by a gesture on the body of a
file in that language -- a middle click or the execute key, on any text, a
single word too -- or on the REPL's own body is typed into it, bracketed if
its program asked for that, else line by line with a once-said warning for
Python's blank lines, then Enter; the message row says -> python-a in the
tag's name tint, the log send <from> <to> <id>. Several bound for the
language: the pane asks which on its notice band, as Del asks, one key
answering, Esc none, nothing remembered. The gesture is known where it is
dispatched (mouse.zig, the execute key), so the tag's words, Exec <text> run
by name and a command word @`cmd` stay commands, and a 9P exec is never
sent. A finished command pane is no REPL; bindings are not dumped. The docs
spell out the escapes, the pdb and input() caveat and the no-bracketed-paste
papercut.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
A signal effect carried only a slot, so a Kill followed in the same step by
the pane's closing and its slot's reuse signalled the new pane's child; and a
command pane whose child had exited and been reaped kept a process group id
another process could take. The effect now carries the pane's serial, checked
as it is performed, and a host signals no command whose exit it has recorded;
the core already sends Kill only to a command it has not been told is done.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
A job left in the background (sleep 100 &) held the pty open, so the pane
stayed running and the child a zombie until the job ended; a command that
closed its terminal and ran on got its end of file at once, the host waited
100 ms for an exit, reported exit ? and hung it up. Now each command's child
is watched on a thread (waitid with WNOWAIT, so its pid stays its own until
the host reaps it), and the host tells the core the exit from that: after the
pty's end of file, so the output before the exit is in, or 50 ms after the
exit without one, a job holding the pty. The pty stays open until both, so a
command that let go of its terminal is never hung up by it. All four front
ends; a host that cannot start the watcher reads the exit at end of file as
before. Tests: host_io's for both cases, and cmdexit.snap end to end.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
command
A program that crashed out of a full screen left the command pane's emulator
in the alternate screen with mouse reports, bracketed paste or a hidden cursor
on, and the next command ran in that. Before the '% line' separator the pane
now leaves the alternate screen, turns those modes off and soft-resets
(DECSTR). The docs add that a command which clears the screen and its
scrollback erases the pane's history above it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
| |
Every builtin that takes an argument split a word at its first +, so
Dump+2024.zon ran Dump with 2024.zon. A builtin now opts in with plus_arg,
read by the registry, and only Tty does.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
retaken spawns nothing
The spawn effect carried only a slot, and the host read the command and shell
off whatever pane held the slot as it forked: a command pane closed and its
slot taken by the next one before the effects ran forked the new pane's
command twice. The effect now carries the pane's serial and is dropped when
the slot holds another; forkShell checks it again after giving up the turn
for its directory's stat, the one moment a 9P client can change the panes
under it. Every front end performs spawns with the turn, from its step.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
A terminal's tag said Tty whatever shell it ran. The host's acknowledgement
of the shell it forked now sets the word to Tty+<shell>, tinted like the tag's
name. Word+arg is taken as Word arg, one word a tag can hold and a click can
take whole (+ is a word character), so Tty+fish opens a terminal on fish, as
Tty fish does; Tty takes the shell as its argument, which the host forks for
that pane instead of the configured one. Every snapshot whose screen shows a
terminal's tag changes: 69 goldens, re-recorded by name, whose 297 changed
lines are all Tty becoming Tty+bash (the harness runs bash), the cursor
columns and style spans that moved with it, or that text cut at a pane's
width.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
shell's prompt
A middle click, an exec write or a tag word that no builtin knows was typed
into some terminal for the pane's directory, sharing whatever state that
shell was in and answering nothing, so a misspelling vanished into a shell.
Now only a line clicked at an interactive terminal's prompt is typed there.
From anywhere else it runs as a command pane: a terminal whose child is
$SHELL -c the line in the pane's directory, full emulation, which shows its
output and then exit N from the host's reaping of the child, and stays. A
finished command pane is the next command's for its directory, which runs
below what it showed after a '% line' line (acme appends to +Errors and never
clears it, util.c:213); a running one gets a second pane. Kill ends a command
pane's whole process group, the log records run and exit, exec reads back the
command pane's serial, and a line is at most 1 KB, read off the pane as the
host forks rather than carried in every spawn effect. ttyForDir's search for
a free shell is gone. The goldens of chordcut, cmdword and layout-open change
where a file's exec now opens a command pane, and ttytaken is rewritten to
exec from the terminal itself; docs/open-questions.md records the decision.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
request is served
serveFs expired them, but a read is answered while a step is out in a
syscall, because reads change nothing, and this one changed pane messages
and needs_frame from under the step. The detached session's loop now expires
them between steps, and while nobody is attached and a message is up it
looks again every 100 ms rather than waiting for something to wake it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
| |
/a/;/b/ searches b from the end of a (acme's addr.c:170-171 sets ar to the
left side), and /a/,/b/ searches both from the current address; the review
asked that it be confirmed, and it held.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
reader too
A line written to the root's look or exec is a click at the pane with the
keyboard, and in acme every click on a window whose event file is open goes
to its reader; the root's acted at once. It now goes to the reader as the
pane's own does. The docs say what that means for a helper holding event
(its own exec comes back as a record: run it through ctl, or write the
record back), and why an event record counts bytes where acme counts runes:
every offset pardes serves is in bytes, #n and q0/q1 too, so the count
follows them rather than switch alone, and an acme library reads it right
for ASCII text.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
The Restore marked the connections to cut in cloud9's Conn.user, which cloud9
also writes, clearing it for a connection accepted into that slot on another
task: a client dialling in as the marks were made could be marked old and
cut. Each connection is now stamped from a counter as it opens (cloud9's
opened hook), and a Restore cuts those stamped before its own count; nothing
is written from two tasks.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
| |
Exit and Restore shared one warned-at revision, so a Restore a script was
refused over ctl spent the warning, and the person's next Exit quit without
asking, throwing the text away. The warning now records which word gave it,
and only that word goes ahead on it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
The served README, the skill and docs/fs.md now say where an address search
starts, that an event record's text may hold newlines and is read by its
count, that truncating tag clears its default words too (append to keep them,
u in the tag to get them back), how Dump and Restore behave and where dumps
go, that Kill stops only the foreground job (the rest of 'sleep 30; echo done'
still runs) and that Joincol needs a column to the right. The skill and
fs.md had Collapse as a column word; it folds the pane it is given.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
A message lingers until input dismisses it, and a detached session with nobody
attached has no input: its messages, and /screen, kept what was said long ago.
The session now marks the core unattended while no client is attached, and
the core drops a pane's messages once the newest has been up MessageLinger on
the clock, checked as it is stepped or served. A pane's older lines go with
its newest rather than each on its own clock; the render pipeline's clock is
the place for that.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
Both did nothing without a word, from a click or a ctl write alike, and a
script could not tell a no-op from success. Joincol in the rightmost column
now fails 'Joincol: no column to the right'. A Theme name that is none says so
and names the themes sharing its first letter, since all of them (ThemeSel
lists them) are too many for a message or a refused write; a startup config
line still fails quietly, as its other bad lines do.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
and the error words keep it so
The served README said every refused write reads as EINVAL, but a mount's
errno is 9ns's reading of the error's words, so a no-match or out-of-range
address and a refused Exit came back EIO, as the dogfood run saw. That split
is the useful one, malformed against failed, so the docs now state it rather
than the words being bent to EINVAL; a test pins each error's words to its
side of it. It caught one: 'regular expression search took too long' read as
ENAMETOOLONG, and now says it gave up past its step budget.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
| |
After a pane made by Tty or Newcol written to a ctl, /look and /exec still
read the serials of the last look or exec, and a script took the old pane for
the new one. A ctl write now resets them and records what each line made, or
else the pane it ran at, as a look or exec does.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
| |
stat said a terminal's body was 0 bytes while a read gave its screen and
history, and the docs promise real sizes; a client that sizes its read from
stat got nothing. The length is now that of the text a read answers, counted
the way the pane's ctl line already counts it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
is refused
-/re/ searched forward, since only ?re? set the direction, where acme's
address() takes the direction a minus set (addr.c). And #100,#50 was taken,
leaving data to act on an empty range at 100; sam refuses it as 'addresses out
of order', which acme leaves out, and so does pardes now. The rest of the
dogfood report on addresses already held and is now tested: an expression is
evaluated from the current address, as acme evaluates it from w->addr
(xfid.c:446), so a search starts where the last address or data write left
it and . is that address. Taking . as the selection instead, as the report
asked, would part from acme, which has dot only in its ctl messages; the docs
say which is which.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
are tested for their offsets
Dogfooding saw a body right-click reported as ML0 0 2 3 qty. On file panes
the offsets were right in every case tried here (a scratch made over 9P and
clicked while another pane is active, after a hover, scrolled, soft-wrapped,
tab-indented, inside parentheses); the test now holds them. The 0 0 form
is a terminal's body, which has no offsets to give (its body is a history
snapshot); since the event file now takes a record back whole, such a record
can still be written back and done, and the docs say so. What the test did
find: a click on whitespace sent an empty record, where acme's look3 and
execute return without a word on an empty expansion (look.c:37, exec.c:141).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
the pane
A script writing to pane/N/exec bypassed the client holding that pane's event
file, which a middle click on it would not: acme sends a window's clicks to its
event reader (look.c:53, exec.c:173). Such a line is now an F record at 0 0
carrying its text; the root's look and exec still act at once. acme takes back
only origin, action and range, which a record with no place in the text cannot
use, so the whole record as read is taken too, and for an empty range acts on
its text.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
and restores
A client that wrote Restore saw its connection cut with no answer, and could
not tell a Restore from a crash. The listener now lets the writer's answer out
before the cut, and cuts only the old editor's connections, refusing their
requests meanwhile; a client that dials during it is the new editor's and
stays. Dump logs 'dump <path>' and the restored editor's log 'restore <path>'.
Keeping connections across a Restore was weighed and left: the fids name the
old editor's panes and opens, so it would mean carrying serials and open
records into the new one, where acme's Load only adds windows. tty's Restore
also closed its shells' ptys without reaping them; it retires them now.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
not windows and a repeat cap
The windows returned wrong matches: a candidate reaching a window's edge was
left to the next window, half a window on, which could answer a match starting
mid-token rather than the leftmost, and addr then pointed data's next write at
the wrong bytes. The repeat cap missed mvzr's own worst case, a chain of a?,
and alternation under a repeat, each exponential inside one mvzr call the
deadline could not interrupt; and it refused ordinary s/S patterns. build.zig
now patches the fetched mvzr at build time with a step counter on its
backtracking recursion (matchPattern), so a fresh fetch keeps it and a moved
anchor stops the build; regexp.zig gives each compiled pattern a budget, about
300 ms here, and a search that spends it fails as taking too long. Windows,
the cap and their special cases are gone, and matches are exact again.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
| |
'<name>: Modified' read like a failure to retry, and a script that retried
Exit or Restore threw the text away without knowing it. The refusal now names
the word asking and what repeating it does, '<name>: Modified (Exit again to
discard)', and the skill sets it apart from lock's 'file in use', which is
the one to retry.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
Restore replaces every pane with a dump's, so a pane edited since its last save
lost that text without a word, where Exit asks. acme's Load only adds a dump's
windows and so never asks; Restore now asks what Exit asks (acme's rowclean and
winclean, wind.c:511-529): each modified pane says so once, and Restore again
with nothing edited since goes ahead. Exit and Restore share the check and its
warned-at revision, as acme's winclean clears one dirty flag for any asker.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
waiting pty/run is cancelled
Review asked the docs to say what a script trips on: acme ignores OTRUNC on
data (fsys.c:543), so truncating it is an extension; addr sits past each write,
so a second echo x > data inserts after the first; and a pty/run line waiting
for a fresh terminal's first prompt waits for ever if none is drawn, so the way
out is to interrupt the read. The lock's retry advice was already there.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
| |
A client retrying a write that fails the same way pushed one err line after
another until the log's ring held nothing else. The same err as the newest
record is now that record with a count, (x4), as +Messages counts repeats; a
follower that has already read the record still gets each repeat as its own
line, since it may be waiting on exactly that.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|