| Commit message (Collapse) | Author | Age |
| |
|
|
|
|
|
|
|
|
| |
active pane's
No pane asked for it, so borrowing the directory of whichever pane last
had the keyboard named it after an accident; acme's new window has acme's
directory.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
busy for ever
A one-row pty loses the prompt's input mark as soon as the prompt wraps,
and busy detection never sees the shell idle again. Placement already
keeps a new terminal at tag + 2 rows; a winsize write now keeps the pty
at two. A pane dragged down to one body row keeps a one-row pty, since
a taller pty than the pane shows would put its cursor below the pane.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
A pane from pane/new or New takes the bottom half of its column's last
pane, as acme's coladd does (cols.c:62-65); when that pane is too short
to give it a tag and 2 rows, the fallback halved the tallest pane and
put the new one under it, mid-column (the 7 9 8 found). It now goes last
all the same, with half the tallest pane's rows (its tag measured at the
column's width). Tty from a pane's ctl already follows acme's
makenewwindow (the active column first, util.c:456-467); fs.md now says
so rather than beside that pane.
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 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]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
skill's log line
Round 15's doc findings: one table of which files fail a write and which
only say so; mark to make a loop's data writes one undo step; the
100-byte scratch exemption and the chord write-back in the skill; the
skill's log line with ask, answer, changed, newcol, delcol and the
restored records; a directory looked at opens a terminal that runs ls,
and why; a plain word in a terminal is listed in +Search, its rows
@p<serial>.
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]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
argument
Writing a chorded exec's three records back as read ran the argument
and its location as shell commands. The first record (flag 8) now takes
the next record as its argument when it comes in the same write, else
the one kept from the click (or, with none kept, waits for it); its two
follow-up records, however they are written, are consumed as its, never
run. Tested written back together and one per write.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
Tty's ls
Round 14's doc findings: a raw pty/data paste of more than one line needs
the second \r unless it ends in a newline (not only an indented last
line); the event flag bits (1 builtin, 2 expansion, 4 filename, 8
chorded, with its two records) and what writing back each record kind
does; why a new Tty types ls; and the sam box's N+1 for text without a
final newline (out of range).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
| |
A follower read the ring's whole history before anything new, and there
was no way to skip it. Writing follow new instead of follow skips what the
open froze and waits for what comes after (tail -n0 -f); fs.md and the
skill say that follow replays first.
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]>
|
| |
|
|
|
|
|
|
|
|
| |
sam takes the end of input as a text block's end, so a block cut short (a
write that lost its tail, an open closed early) inserted half of itself.
An Edit whose a, c or i text never meets its . line now fails with "a, c
or i text not ended by a . line" and changes nothing, as an unclosed {
does; at a close, logged as an err.
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]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
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]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
current and active
Round 13's doc findings: a sam gotchas box in the skill ($-1 with and
without a final newline, N+1 at the end, ^/$ at the end, 2,1, y's leading
empty piece, c's literal &, columns from 1); the skill's Restore log order
made the true one (new, restore, restored, restoredcol); a relative
Restore path is looked for in DumpDir then the session's directory, and a
bare one takes the last dump; a follower sees each (xN) as a new line;
reading data or xdata moves addr; a second read of look/exec on one fd is
EOF (re-open or seek 0); /layout's current (the keyboard's column) and
active (acme's activecol) defined; no room, not no rows left; why a
scratch's dirty blocks nothing under 100 bytes; the changed record listed.
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]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
range reaches a REPL
Round 12's doc findings: the README's ctl line gains Restore, Placement and
size (still 45 lines, detail in fs.md); Tty's argument is a shell and Tty
on a pane's ctl opens a new pane; a .py pane's range goes to its REPL as
an MX<q0> <q1> event write-back; after a Restore panes are renumbered
(columns count from 1 again, so often keep theirs), a command pane shows
exit ? and does not re-run, and REPL bindings are gone. acme's p adds no
newline to what it prints (ecmd.c:744, pdisplay), so pardes's p does not
either.
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]>
|
| |
|
|
|
|
|
|
|
| |
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]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
byte columns
Round 11's doc findings: the skill names the full-column refusal beside the
64-pane cap; fs.md and the skill say an Edit block still open when its open
closes fails with unmatched { and an err; and line:col's byte columns get
the tip for character columns from tools (the same on ASCII, else a
search or #n). A unit test pins the unmatched { at close.
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]>
|
| |
|
|
|
|
|
|
|
|
| |
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]>
|
| |
|
|
|
|
|
|
|
| |
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]>
|
| |
|
|
|
|
|
|
|
|
|
| |
mvzr matches bytes, and only the addr path widened a match to runes, so
,x/./a/|/ on é split it into invalid UTF-8 and ,s/./X/g gave a combining
sequence four X's. Edit's matches now go through the same rune alignment
(and an empty match steps a rune, not a byte). runeStart no longer walks a
stray continuation byte back onto the ASCII before it: an invalid byte is
a place of its own.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
a REPL
sel's write was documented in fs.md only; the skill says it now. With
command lines held per open, an Edit block may come in several writes (a
shell's line-at-a-time printf), so the heredoc advice goes. Kill never
stopped what a REPL runs, since pardes did not start it; the docs point at
pty/ctl sig INT.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Placement could split a pane down to a tag and one row, or give a new one
less. Every placement now checks the pane it made and each pane it shrank
against its tag (wrapped at its width) plus two rows: where they lack the
room, the column's tallest pane is halved instead, and where none can give
it the new pane is refused with "no space for a pane in that column"
(ENOSPC over 9P) and closed at the step's end, once its maker is done with
it. splitBelow and splitParent leave two body rows (a boot layout, split
before any row exists, is as before). Re-recorded by name: lookpanes (panes
one or two rows lower) and splitparent (the 6-row squeeze now refuses);
fs.py closes the scratches and long-named panes it no longer needs, since
its 24-row session filled.
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]>
|
| |
|
|
|
|
|
|
|
|
| |
9ns reads an error's words, not its errno: "window shut down" came out as
EIO where every other file of a gone pane gives ENOENT, and "no pane
slots" as EIO. The event and pty/data reads a pane closed under now say
"no such pane: its window shut" (ENOENT), and the cap says "no space for
a pane: 64 max" (ENOSPC; 9ns has no word for ENFILE).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
| |
A follower that saw ask never heard the question end when its pane closed
first. Retiring a pane with a question still up now logs answer <serial> -
before its del.
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]>
|
| |
|
|
|
|
|
|
| |
With no address after a failed write, a read of addr itself failed (EIO
through a mount), which reads as a broken file rather than as no address.
It now reads empty, as an unset limit does; data and xdata still refuse.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
| |
A shell's > truncates limit, which lifted it, before the write; a write
that then failed left no limit at all. The truncation now keeps the old
limit until that open's write, and a failed write puts it back; a bare
truncation still lifts it once its open is released.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
| |
sam and acme address runes; pardes snapped #n, line:col, dot and data's
reads to grapheme clusters, so a lone combining mark or a CRLF's \r could
not be addressed. #n, line:col, a search's match, dot (both ways) and data
now land on rune boundaries (modal.runeStart and friends), and the tty's
cell drawing is untouched. The README, fs.md and the skill say so.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
| |
Forward line addresses followed acme's number(), which refuses the empty
line after a text's last newline, so 1 of an empty buffer and 2 of "a\n"
were out of range and Edit 1i/header/ failed on an empty file. They now
follow sam's lineaddr (editors/sam/address.c:180-215): #0,#0 and #2,#2.
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]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
second Enter, a follower across Restore, and why wc waits
Dogfood round 9's doc findings: ENOENT for a missing pane, file or dump is
right, so the skill says EIO or an errno that fits; Joincol folds into the
column on the right, the joined panes below its own; the skill gives the
64-pane cap; Python's second \r is needed only when the paste lacks a
trailing newline; a log follower loses nothing within a session, but a
Restore hangs it up; and a tag word gets no file argument, as in acme, so
bare wc waits on stdin (pardes has no $%).
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]>
|
| |
|
|
|
|
|
|
|
|
| |
With job control on, a command's & jobs get process groups of their own,
so Kill's signal to the foreground group and the shell's group left them
running, orphaned. A stop of a command pane now signals every process
group in its shell's session (Linux; a /proc scan). Jobs still outlive a
command that exits on its own. Docs and the skill say it per route.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
| |
mvzr refuses $ anywhere but at the very end, so /h$|zz/ and Edit ,x/r$|pi/
were bad patterns while /zz|h$/ worked. Its matcher already ends an
alternative at .end, so a build-time patch, anchor-checked like the group
one, lets $ stand before | and ). The upstream report is in
docs/mvzr-group-backtrack.md.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |\ \ |
|
| | | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
The core owns the motion, as Lift: animation.CursorGlide keeps the focused
cursor's four corners on springs (leading corners at the flavour's pace x2.4,
trailing ones x follow, so a jump smears and collapses; a long jump bows by
the flavour's arc), sampled at each frame's own time. A step of a cell or
less, insert mode, a focus change and any scroll (a file's view, a
terminal's output) land at once; a snap lands a glide under way too. The
quad is clamped to the focused pane when drawn (never its springs). Chrome
carries it on the wire (cursor_glide: bit 1 a cursor, bit 0 gliding;
cursor_alpha; cursor_quad, grid cells; cursor_idle_ms): the GUI draws the
quad as an overlay in the cursor's colour, at 85% (70% on the long
flavours) rising to solid as it lands, and hides the cells' cursors while it
does: one or the other every frame. Only the focused cursor glides.
Blink (CursorBlink, on by default in pixel shells) is the shell's: from
cursor_idle_ms and when the frame arrived, solid while typing and 500 ms
after, 530 ms halves with 80 ms eased edges, solid after 10 s idle, and
never while the window is unfocused or minimized or on a virtual clock. An
edge redraws the last frame with no core render (level B, blink_redraws);
an attached GUI blinks from the same field without a frame per edge.
Tests: snaps a cell, glides a jump with smear and bow, arrives under a pixel
by 150 ms on smooth and lands exactly, shifts with a scroll; blink holds,
eases, stops; the core glides a jump (ge) frame by frame (gliding exactly
while it moves, alpha rising, exact at rest), snaps a step (j) and a switch
to insert mid-glide; a terminal's scrolling output lands its cursor; wire
round-trip of the cursor record.
Shared files: src/animation.zig, src/pardes.zig, src/config.zig (toggle
CursorBlink), src/surface.zig, src/detached/wire.zig.
|
| | |/
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
esp32p4
uzksuumxruzr turned -Dembed-sources on for esp32p4 (before it, the board
was the one build without them). The sources are ~1.8 MB against a 1.5 MiB
app partition, so the object built but the firmware did not link:
.flash.rodata overflowed by 786392 bytes and .flash.text by 1732312.
Default off everywhere; -Dembed-sources=true still embeds them.
Without them the image is 1459760 B, 113104 B under 1.5 MiB.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
The README's log line names newcol, delcol, ask, restored and restoredcol;
it says what $m is under 9ns --unix; and a build that embeds no sources no
longer lists src/ (derived from the build, and tested). fs.md says what the
rest of a typed line does after Kill for each shell (fish runs on, bash
abandons it), that Exec <text> in a .py pane runs a command and never the
REPL, and why appending to a tag wants printf and a leading blank.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|