| Commit message (Collapse) | Author | Age |
| |
|
|
|
|
|
|
| |
Each Jumplist opened another +Jumps below the asking pane, so a few
clicks stacked stale copies of the list. Recent's refill of its own
pane is now shared, and Jumplist uses it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
so what they report writes back
Both said Theme and the name inside the .zon, which no Theme knows, so
writing the report back to /ctl failed with "no theme". While a loaded
ThemeFile is the theme in effect they now say the word that loaded it.
A Dump carries the line too, so a Restore reloads the file.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
shared, rather than stacking one per word
Each word looked for in a terminal (clicked, or written to look), where
no file of that name was, opened another +Search in the same directory,
one per word, until the column filled. Such a search now refills the
directory's +Search, as the file searches and the +Lsp answers already
share theirs. A `/` search keeps a +Search per pattern, which n and N
walk across (psearch.snap), so the sharing is marked on the word look
alone (Pardes.word_look).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
| |
Each query kind found its own output pane by its origin. So Lspinfo and
Lspwhy, which both write `<dir>/+Lsp`, opened two panes of the same name
in one directory, and so could a code action list or a format diff. The
language server's prose now shares one +Lsp per directory, the way the
file searches share one +Search, and each answer replaces the last.
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]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
unsupported for one the frontend lacks, and includes LocationsConfig
The report meant to be feedable back as configuration, but several lines
were not. Shell and Font each took three to six lines of "requested",
"effective" and "pending". The transition read "Panel transition
PanelSlide", with no Panel word. WindowOpacity and TaglineSize carried
"(pending)" and "(build-time only)". A GUI-only toggle such as Ligatures was
left out on the tty, and LocationsConfig was missing altogether.
Now every line up to a blank one is a word and its value:
- Shell <path>;
- Font <name>:<size>;
- one on/off line for each Panel word;
- `unsupported` for a setting this frontend does not have;
- LocationsConfig as it would be typed.
After the blank line comes what is in effect but set by no word, phrased so
that none of it starts with a ctl word. The test checks that each line
before the blank one starts with a setting word. The GUI scripts that read
the font lines (font_size.py, appearance_gallery.py) now read the new ones.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |\
| |
| |
| |
| |
| | |
Merge: audit top-five cuts + tag sweeps + Config/DumpConfig (on the audit bug fixes C9, C2).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
workspace tag reads Dump Themes Config Debug Exit
Config (SPC f c) opens init, found as the settings report finds it
(opts.startup_config_path: $XDG_CONFIG_HOME/pardes/init or
~/.config/pardes/init, and the macOS and Windows paths config.md gives). A
pane that already holds it is gone to instead; a file on disk is looked at;
with none, an empty pane is named for it, and Save makes its directory and
any above it first (File.make_dirs, fs.makeDirs) before writing. Without a
configuration directory it says so and opens nothing.
The report Config used to open, the startup path and every live setting, is
DumpConfig, in a +DumpConfig pane. No alias keeps the old meaning.
The workspace tag's default words put Themes where NextColor was, NextColor
staying a builtin, and Config beside it. A tag the user edited is kept as it
was: a dump stores only an edited one (topbar_custom), and a restore puts
back only that.
theme.snap types NextColor onto the workspace tag to click it, and tagnav's
walk back to Dump takes five long-word steps. The rest of the re-recorded
goldens differ in the workspace words and their widths only.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| | |
| |
| |
| |
| |
| |
| |
| | |
formats, and three orphan test scripts go
A2: a restored pane's tag tail comes from the dump's tag_tail, which every dump since 0.0.4 writes; the 27 earlier default tails that were recognised to upgrade, restoreTail, tailClass, savedPrefix and restoreTailAt, pdf_view's and image's legacySavedPrefix, a terminal's TTY tag prefix and its raw output tail replay, and the ThemeSel, FontSel and ColumnTags words (init lines and dumped output names) go, with their tests; the CHANGELOG says so. A4: test/fs_soak.py, referenced nowhere (monkey9p.py does its work). A6: test/column_grip.py and test/look_placement.py, referenced nowhere; the six review scripts docs/ui-review.md names stay.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |/
|
|
|
|
|
|
| |
copies, identical to their sources, go, and so does the label saying which was used
shaders/prebuilt/*.glsl were byte-identical to shaders/X.glsl or to prefix.glsl + post/X.glsl (checked with cmp, all 14), kept only so a -Dprebuilt-shaders build could name them; EffectCode and Config then labelled the GUI's shader source as live or prebuilt. The GUI embeds shaderSource (a concatenation, no glslc) either way now; the prebuilt SPIR-V stays, and zig build shaders refreshes only it. Config's report and EffectCode lose their GUI shader source line.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
| |
p.messages.at(i)
The rename deferred from the file split; no behaviour changes. Output.zig's one call follows.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
let the GUI rest; a perf gate
somtrmsz's contrast floors made ChromeTheme.fromTheme run its focus-tint
and separator searches (pow calls each), and Output's RowDecoration.styleAt
called it for every grapheme of every highlighted row: the 50k-line file's
render went from 0.11 ms to 13 ms. Pardes.bodyChrome now keeps the theme's
chrome, worked out again only when the theme differs; recolorSyntax asks
for it once a decorated row, and a plain row (nearly every row of a file)
never asks. ReleaseFast, medium fixture, median us, before -> after (main):
render 13150 -> 76 (111), key-down 14658 -> 79 (110), wheel 13589 -> 76
(109), open 14891 -> 2095 (2055), edit-char 16703 -> 3006 (1251; the rest of
that gap is editing and tree-sitter, not this).
Post.animating asked for frames whenever the window had focus and any pass
was ready, so a still pass kept the GUI drawing at the display's rate
(Bloom: 49% of a core idle, in a hidden test window). A pass now says
whether it moves on its own: the CRT (its hum and dither) and a Shadertoy
file whose source reads iTime, iFrame or iDate (shader_build.readsTime; the
flag rides the wire's post message); Bloom, Vignette and Grain are still.
Bloom idle: 49% -> 1.2%, as with no pass.
zig build perf-gate: the 50k-line file's gestures, each's fastest sample
within 3x of the recorded baseline's (test/perf-baseline-<platform>-
<optimize>.json, recorded from this build), run with every unit-test. On
the regressed code it fails at 180x for render.
|
| |
|
|
|
|
| |
The list kept a pane's Modified row after the pane was closed (discarded), so it named text there was no longer anything to lose of. A pane's closing now takes its row out.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
| |
one +Search
Only Find and Grep reused the directory's +Search; a language server's list made another pane of the same name each time. Every origin named +Search now shares it, but a plain word's search, which keeps a list a pattern for n/N to walk between.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
| |
in the session's
ThemeSel (Themes) in an init file ran at a terminal whose shell had not reported its cwd, so +Themes opened as /+Themes.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
| |
It printed paths raw, so a name holding a newline read as two rows.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
| |
It failed with no match but left the last search's rows in the +Search, where they read as this one's.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
| |
When a Find or Grep found exactly what its +Search already held, the pane was kept but not marked as the one the search touched, so the exec read back the pane it ran in.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
| |
search included
Find and Grep passed over the pane they ran in when looking for the +Search to fill, so a Grep written to a +Search's own exec made a second one, and the two swapped roles on each run after.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
| |
ends kept
A Recent row or a jumplist entry for a line the file no longer has failed the look; now it opens at the last line. The selection's anchor is remembered too, so a reopen restores both ends where they fit, and Recent and Jumplist share the (closed) marker.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |\ \
| | |
| | |
| | | |
cursor + faithful themes
|
| | |/
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
as legacy, a section per ported family
The picker's headings come from colors.theme_groups instead of one split at
native_theme_count, so acme (current, matched to plan9port acme's source)
no longer sits under a legacy heading. Ring order follows the sections:
the fifteen pardes palettes, acme, lapis, the faithful ports a family at a
time, then helix and dark, then the imports. An imported theme whose name a
port takes gets _helix, as zed's carry _zed.
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Exit's refusal (and Restore's, Del's, Delcol's, get's) put its full text
on a notice that went: a long list of names, gone before it was read. The
list now goes into one +Unsaved pane, filled again by each refusal, a row
a pane (`<name>: Modified`) and the `Exit again to discard` line; the
notice is short, `3 unsaved panes — Exit again to discard`. The 9P
`unsaved` records and the write's err are as they were.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
files and dumps
The user asked for the plainer words. Every use is renamed: the
builtins, leader paths, /commands, the docs and tutor, tests, and the
themesel golden, re-recorded. An init file's ThemeSel or FontSel runs
the new word and says `ThemeSel: renamed to Themes`, as ColumnTags is
said; a dump naming an output pane by the old word restores it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
closed file reopens it
A file closed by accident, its path forgotten, could not be found again:
the jumplist dropped closed panes. Every file opened (a look, a Save of a
scratch, a Restore, a rename) goes first in a list of 200, kept once, its
dot noted when it closes, kept across sessions in $XDG_STATE_HOME/pardes/
recent. `Recent` (SPC f r) shows it in a reused +Recent, each row
`path:line:col open|closed` a look reopens; /recent reads `open|closed
<path>`. The jumplist keeps a closed file's entries, +Jumps marks them
`(closed)`, and Back to one opens the file at its place. acme has no
such thing; its dump and Load are the nearest.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |/
|
|
|
|
|
|
|
| |
Each Grep with a new pattern opened another +Search, until the column
refused panes. Find and Grep now reuse their directory's one, as acme
reuses +Errors, and the exec reads back the pane it filled; a plain
word's LookWord list search keeps a pane a pattern as before.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
A +Search row for a pane with no path (a terminal's), a jump list row and
a line-number look said @p<slot>, the pane's place in the core's table,
which no client can see. They now say @p<serial>, and @p resolves a
serial. Re-recorded by name, their diffs checked: jumps, ttylook and
psearch (whose waits now say @p1) for @p<serial>, and with them argv,
nested, reflow, tinywin, ttyhelp and ttyonly for the boot scratch now
named <cwd>/+New (the change before).
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]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
makenewwindow puts them
Newcol makes an empty column; closing a column's last pane leaves it empty with
the keyboard on its tag; Delcol and Joincol alone take a column away; the
session's last pane closing quits. The +New stand-in and replaceStillborn /
stillborn_joiner are gone. Every new pane goes through exec.placeNew, which
follows acme's makenewwindow (active column, empty column whole, blank space,
halving the biggest) or, with Placement pardes, the old rules. ColumnTags is
gone: column tags are always shown. A grip drag shows acme's box cursor.
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]>
|
| |
|
|
|
|
|
|
|
|
|
| |
acme keeps what edits a text in its Text (dat.h:171-190) and the window
holds a body and a tag of that type. The cursor, the selections, the modal
state and the edit-buffer undo move off Pane into Text.zig, Pane holds
them as its body, and the edit and normal-mode operations take the Text
they edit. Nothing changes in behaviour; this is the step that lets the
tag become a second Text.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
Not a pure move: state moves. Pardes's three message-log fields
(`messages: [message_log]LoggedMessage`, `messages_head`, `messages_len`)
become the fields of Messages.zig itself (`log`, `head`, `len`), and
Pardes embeds one as `messages: Messages = .{}`. messageLog reads only the
ring, so it now takes `m: *const Messages` and is called
`p.messages.messageLog(i)` (Output's +Messages view and the log test);
logMessage still needs the panes and the 9P event log, so it keeps
`p: *Pardes` and writes `p.messages.log/head/len`. No behaviour change.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Pure move, no behaviour change (acme keeps this in exec.c): execute,
commandText, max_exec_depth, executeBuiltinLine, applyStartupConfig,
runBuiltin and applySettingBuiltin; the getarg-style operand code
(withArg, PointerOperand, pointerOperand, heldSelection, chordEachSel);
takesCommandLine and the terminals commands run in (spawnTty, spawnV9fsTty,
spawnTtyWithMount, evictLonePristineTty, replaceStillborn, ttyForDir);
placeDoc; and the save path (submitSave, saveFile, saveTo, askWrite), with
the acme-chords test, go verbatim to exec.zig.
The methods become free functions taking `p: *Pardes`. executeBuiltinLine
is called from ~170 places as `p.executeBuiltinLine(..)`, so Pardes keeps
one declaration alias for it and those call sites stay; the other 104 calls
change from `p.execute(..)` to `exec.execute(p, ..)`. ninep/ctl.zig has a
local named exec, so it writes `pardes.exec.execute` instead of importing
the file.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Pure move, no behaviour change (acme keeps this in look.c): expanding the
word under a click (ExpandedWord, expandedWord, expandedSel, cursorWordSel),
the n/N walk (LookFrom, lookEdge, lookStand, lookWalkPanes, lookPast,
wholeRowSpan, lookSpanIn, lookWalk, landLookSpot, noteLookSource,
armLookWalk), search results (Search, SearchStart, submitSearch,
lookFirstHit, runSearch, searchStep, jumpResult), the look-hover preview
(LookHoverWait, LookHoverPreview, FileWordSpan, PdfWordPreview,
invalidateLookHover, cancelLookHover, lookHoverPane, noteLookHover,
refreshLookHoverFromRaw, advanceLookHover) and lookAt with its targets
(focusPaneLine, selectSpan, openPaneTarget, focusPaneByPath,
clearNavigationSelection, resolveLookTarget, locationText,
canonicalLookLocation, pdfLinkLocation, followPdfLink), with five tests, go
verbatim to the end of look.zig after its word and target resolution.
The methods become free functions taking `p: *Pardes`; their 143 call sites
change from `p.lookAt(..)` to `look.lookAt(p, ..)` (tests reach them as
`pardes.look.x`). Inside look.zig the moved code's `look.` prefix drops.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Pure move, no behaviour change: the Message stamp helpers, LoggedMessage,
setStatus, setMessage, showMessage, dismissMessage, dismissLine,
advanceMessages, advanceLine, messagesAnimating, MessageMotion,
messageFrames, messageMotion, noticeText, noticeLife, blendRgb,
logMessage, messageLog, reportError, the notice painters (leaderText,
noticeCols, Printed, printRight), collectNotices, and the six message
tests go verbatim to Messages.zig.
The methods become free functions taking `p: *Pardes`. setStatus,
setMessage and reportError are called from ~170 places as `p.setMessage(..)`,
so Pardes keeps three declaration aliases (`pub const setMessage =
Messages.setMessage;`) and those call sites stay as they are; every other
call changes from `p.x(..)` to `Messages.x(p, ..)` (46 of them). The five
shells' `pardes.Pardes.Message` become `pardes.Messages.Message`. The
message ring's fields stay on Pardes for now; moving them into Messages is
a separate change.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
|
|
Pure move: the body of `pub const Output = struct { ... }` is now the file
Output.zig, dedented, with the imports it uses; panes.zig keeps
`pub const Output = @import("Output.zig");`, so `panes.Output.x` callers
are unchanged. decorateRow and RowDecoration.styleAt become pub because
File calls them from another file now. Output.zig joins the embedded
source list.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|