# Changelog ## 0.0.1 - Snapshot captures are deltas against the previous capture in the same script, and a scripted click may name a word (`press middle @Del 2`, `@Del#2` for the second pane on a row, `@Save-2` for a column beside one) instead of a screen column. Adding one builtin word to a tagline used to rewrite 78 goldens (3,758 lines) and silently move seven scripts onto the wrong word: `tutor.snap` had been clicking `Grep` and asserting a tutor pane, `tagbottomimage.snap` clicked 176 columns from the `Del` it claimed to execute. Seven tests regained their subject, the corpus dropped from 16,700 lines to 5,722, and the same edit now moves 337 lines. - `zig build snap -- --update` regenerates in parallel at the widest probe settings and then verifies every golden it just wrote, instead of capturing once, serially, and blessing whatever it saw: 77s to 41s, and a capture that does not reproduce is reported rather than committed. - `zig build unit-test -Dtest-filter=` runs one test. The whole binary is 14s, so a one-line change used to cost the full run; the test runner's own `--test-filter` was silently dropped by the build. - A snapshot script covers the `Save` prompt for the first time: armed on a `+New` scratch it draws on the message row, prefilled with the pane's own directory, and submitting it turns the scratch into the file it names. - `pardes --fs` serves acme's control filesystem over Linux FUSE: a directory per pane holding `addr`, `body`, `ctl`, `data`, `errors`, `event`, `rdsel`, `tag`, `wrsel`, `xdata`, plus `index`, `cons` and `new/` at the root. A program that opens those files is an editor extension — no plugin API, no interpreter. `--fs=` names the mount point instead of deriving one under `$XDG_RUNTIME_DIR`; every pane shell gets `PARDES_FS` and `PARDES_PANE`. See docs/acme-fs.md and examples/acmefs/. - While a script holds a pane's `event` file open, buttons 2 and 3 in that pane are REPORTED to it instead of performed, so the words in that pane's tag are the script's commands (acme's extension model). Keyboard Enter/Tab still execute, so a scripted pane stays editable. - Writing an event record back (`origin type q0 q1`) makes pardes perform the Look or Exec it names — the same door acme has always had, and the reason the mount is 0700. - Version tracking: the compiled version is embedded from build.zig.zon and shown by Changelog. - New builtins: Changelog, Newtty, and Joincol. - Markdown tree-sitter highlighting, including nested fenced code blocks. - `.patch` and `.diff` files are highlighted. - Coloring dispatch keys off the buffer title. - Opening a new file only splits into a new column when both panes would be at least 100 columns wide. - Terminal ANSI colors render only in tty mode; normal mode is a plain editing view, so an edit can never shift a shell row's colour. - `New` and `Newcol` open an empty scratch buffer instead of a shell or a temporary file. Its directory is inherited from the pane it was opened from. - `Save` on a scratch asks for a path, prefilled with that inherited directory, and the buffer becomes an ordinary file once written. - `Save` reaches every pane that holds text of its own and leads its tagline: a terminal ("Save New Newtty Del Filter") and an output buffer like `+Search` ("Save New Newtty Del") as well as a file. Images and PDFs keep the plain tail — their bytes on disk already are what they are. - `Save` takes the path as an ARGUMENT (`Save notes.txt`, or a selection chorded onto the word) and asks for one only when it was not given, the way Find and Grep ask for a pattern. A relative path resolves against the pane's own directory, with `.` and `..` normalized; a path that cannot be made absolute is refused rather than written next to the process. - Writing to a path never rewrites the pane: a terminal stays a terminal, an output buffer keeps its rows and its place in the n/N ring, and an open file keeps the file it has, so `Save ` is a copy and not a rename. The scratch `+New` is still the one exception, becoming the file it names. - A dropped pane's memory outlives its frame, so a pane pointer taken during that frame stays valid until the next one repairs it. - The core owns the event loop. Each platform is now a `Host` of optional function pointers; an unimplemented method falls back to an in-process default, so a host with no methods at all is still a complete pardes. - Ctrl-V and Ctrl-Shift-V paste in a tty pane: the default register and the system clipboard, typed at the program the way a terminal emulator pastes (bracketed under mode 2004). A paste arriving from the desktop reaches the shell instead of an edit buffer the pty cannot see. - The default filesystem is pardes's own source, embedded from an allowlist (src/source_manifest.zig): what a host with no file method reads, and what the browser has always read. It replaced a build-time generator that embedded every tracked .zig file. - `zig build run-isolated` builds and runs `pardes-isolate`: the same source with one comptime option, whose host supplies only the terminal. The filesystem is not disabled in it, it is absent — the libc paths compile away. - Typst highlighting: headings, `*bold*` spans, raw/code blocks and inline raw spans, and `#`-prefixed function calls (including the sigil itself). - Fenced Typst raw blocks with a language tag (e.g. ```` ```zig ````) get that language's grammar injected, the same treatment markdown fenced blocks already had. - Markdown bold, italics and inline code spans are highlighted: pardes now builds the markdown inline grammar, a second parser off the same dependency, and re-parses the block grammar's `inline` nodes with it. Only the block grammar was built before, so emphasis had no nodes to match. - Escape in a PDF pane is the document's own cancel: it drops the mouse selection and the search highlight overlay and stays where you were reading. It used to run `Last`, which moved focus out of the pane and left every following key going somewhere else. `Shift-Esc` is now the hop out — the same chord that leaves a raw tty. - `gj`/`gk` move one VISUAL line, following the automatic breaks of a soft-wrapped body and keeping the goal column inside the row. `j`/`k` are unchanged: whole file lines. With `Wrap` off a line is one visual row and the two pairs are the same motion.