<feed xmlns='http://www.w3.org/2005/Atom'>
<title>pardes.git/src/host_io.zig, branch main</title>
<subtitle>Pardes</subtitle>
<id>https://git.0x4200.cafe/pardes.git/atom?h=main</id>
<link rel='self' href='https://git.0x4200.cafe/pardes.git/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/'/>
<updated>2026-10-02T01:58:12Z</updated>
<entry>
<title>Edit's w to a file changed on disk since read is refused once, as Save is (w again to overwrite), the rest of an X/'/w written and the refused named; Edit filters get a pane command's environment ($PARDES_MOUNT, $PARDES_9P, $PARDES_PID, $winid); an Edit with no commands runs beside one whose commands run unless it touches a file that one changes, refused busy (EBUSY) as is a second Edit with commands</title>
<updated>2026-10-02T01:58:12Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-10-02T01:58:12Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=3ddd34bcd94ba95d9cacbf6afcb9f89a16a414ce'/>
<id>urn:sha1:3ddd34bcd94ba95d9cacbf6afcb9f89a16a414ce</id>
<content type='text'>
Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>A look at a directory opens a pane listing it, as acme's directory window: named dir/, its entries in acme's columns (bytewise, dotfiles kept, a directory's marked /), a look at an entry from there, Get or a look again reads it again, never dirty, Save refused; DirLook terminal keeps ls in a terminal</title>
<updated>2026-10-01T20:47:47Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-10-01T20:36:52Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=2dbb047a82523c578cb511058c6e1b745cfc8073'/>
<id>urn:sha1:2dbb047a82523c578cb511058c6e1b745cfc8073</id>
<content type='text'>
Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Saving the init file in a pane (Config) applies its settings at once; its commands are not run a second time</title>
<updated>2026-10-01T13:36:28Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-10-01T13:31:23Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=4db57bf5bd788a292fcf2cfbea3b6d8b281510f0'/>
<id>urn:sha1:4db57bf5bd788a292fcf2cfbea3b6d8b281510f0</id>
<content type='text'>
A setting changed in the init file took effect only at the next start.
The host's Save now hands a written init file's text back to the core,
which applies its setting lines again (each idempotent), with the same
notice and err for one that fails; a command line in it (`Newcol`)
belongs to the start and is left alone.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>A Rename the server answers for this file alone, while other open files of its language say the name, is previewed, never applied; Lspwhy shows the files synced first</title>
<updated>2026-10-01T11:53:11Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-10-01T11:08:54Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=3ac3923e314954451a38a94918552b60ad3a93b3'/>
<id>urn:sha1:3ac3923e314954451a38a94918552b60ad3a93b3</id>
<content type='text'>
zls renaming at a declaration answers with that file's edits only,
cold or warm, whatever it was told of (checked against zls directly:
from a call site in main.zig it renames both files, from the
declaration in util.zig it never does), so the first Rename applied in
util.zig and left main.zig broken. The client now looks for the old
name in the other open files of the language; when one says it and the
answer left it alone, the edits are a preview with a row naming each
such file, and the message row says the server renamed in this file
only. Lspwhy carries the open files too, so its trace shows `synced X
first` for the query it explains.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>A Rename, references and the like tell the server of every open file of its language first, so a rename reaches files it had not seen and the preview lists them</title>
<updated>2026-10-01T10:16:43Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-10-01T09:22:44Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=85b60dedb6bdb192abd11b2d58ca7c0e8c944b18'/>
<id>urn:sha1:85b60dedb6bdb192abd11b2d58ca7c0e8c944b18</id>
<content type='text'>
zls renames only in the documents in its store, and syncDoc told it of
a file only when a query was asked from it, so renaming in progress.zig
left main.zig unchanged and broken, with no preview. For a query whose
answer can reach other files (rename, references, implementation,
workspace symbols, calls and type hierarchy), the host snapshots every
other open file and the client syncs those its server answers for
first. The mock server answers a rename in each document it was told
of; lsp-rename-files opens main.rs by a look, renames from lib.rs, and
its preview lists both.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>With Pager pardes, a terminal's shell also gets SYSTEMD_PAGER and SYSTEMD_PAGERSECURE=0, and the pager's path is quoted only when it needs it</title>
<updated>2026-10-01T04:35:12Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-10-01T04:08:26Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=006fdc1d758fc2f9b956051e75f31a0122bd7883'/>
<id>urn:sha1:006fdc1d758fc2f9b956051e75f31a0122bd7883</id>
<content type='text'>
journalctl and systemctl read SYSTEMD_PAGER, not PAGER, and in their
secure mode run only less, so a pty/run of either still waited in it;
and systemd, splitting a pager on blanks and exec'ing it, never ran the
quoted path. Where the user's environment sets neither, a terminal now
gets SYSTEMD_PAGER as PAGER is set and secure mode off (this pager has
no shell to escape to), and the path is single-quoted only when it holds
a blank or shell character. Command panes keep cat.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>A terminal pane draws the kitty graphics its program places, so yazi's image and PDF previews show</title>
<updated>2026-10-01T03:53:17Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-10-01T03:35:37Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=28c74918cde4092d964daa847c026ed3de282683'/>
<id>urn:sha1:28c74918cde4092d964daa847c026ed3de282683</id>
<content type='text'>
yazi asks the pane XTVERSION, and ghostty-vt answers "libghostty": yazi
takes it for Ghostty and sends its previews by the kitty graphics protocol
with Unicode placeholders (a=T,U=1, then U+10EEEE cells). ghostty-vt stored
the images, but nothing drew them: the placeholders showed as tofu in the
GUI and as raw codepoints in the tty, in every build since terminal panes
answered queries (vkznsvzs, 2026-07-01). Before that no query was answered
and yazi fell back to chafa's text art.

Each frame, TerminalImages.zig reads the active screen's images and
placements (virtual ones through their placeholder runs, and ones placed on
a cell), cuts each into the cell rows it covers, maps those rows through
the body's own row walk, clips them to the pane, and hands them on as
ImagePlaces with exact geometry (NativePlacement.exact). The GUI draws
them as textures; the tty passes them to an outer terminal with kitty
graphics as one placement per row, its source cropped to whole cells.
Placeholder cells draw no text. Scrolling, a delete, a resize, the
alternate screen and a closed pane all fall out of reading the emulator's
state every frame.

A pane now knows its size in pixels: CSI 14/16/18 t are answered, the
emulator's width_px/height_px follow the shell's cells, and the pty's
winsize carries pixels (host_io.ptyWinsize), so yazi and a nested pardes
size their images right. ghostty-vt's image store is 64 MiB per screen
(its library default, 10 MB, refused a large preview), PNG transmissions
are decoded with stb_image, and RGB images are converted only while shown.

test/yazi_preview.py runs yazi in a hidden window on a PNG and a PDF and
checks the captures, also through a tty pardes nested in the pane.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>pardes - reads stdin into a +Pager pane, and is a terminal's PAGER and GIT_PAGER, Pager pardes|off to opt out; command panes page through cat</title>
<updated>2026-10-01T03:12:18Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-10-01T02:58:54Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=3815a0bfad5818e2caf85a00c0c2d3aecc13bd1c'/>
<id>urn:sha1:3815a0bfad5818e2caf85a00c0c2d3aecc13bd1c</id>
<content type='text'>
A paging command in a terminal, or run through its pty/run, sat in
less, and a pty/run never answered. `pardes -` now reads stdin to its
end, strips terminal escapes (colour, OSC, overstrike), and shows it:
inside a session as a clean &lt;cwd&gt;/+Pager pane made through pane/new and
back at once, outside one as a new editor whose first pane it is, as
`vim -` does. A terminal's shell gets PAGER and GIT_PAGER set to this
pardes's own path and `-` where the user's environment sets neither;
`Pager off`, a setting in /ctl, init and DumpConfig, leaves terminals
started after it to the environment. A command pane's one-shot shell
keeps cat, its output being a pane already.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>A command run from a pane gets acme's $winid, the serial of the pane it was run from; one from a column's or the workspace's tag gets none</title>
<updated>2026-10-01T03:12:18Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-10-01T02:32:31Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=48c129a701d60abdb836bbb400d949cc61ed2820'/>
<id>urn:sha1:48c129a701d60abdb836bbb400d949cc61ed2820</id>
<content type='text'>
PARDES_PANE names the command pane itself, so a script a click ran had
no way to address the pane it was run in, as acme's win scripts do with
$winid. The command pane now remembers that pane and its child gets
winid set to it; a header tag's command, which no pane owns, gets winid
unset. PARDES_PANE is unchanged.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>A pane's child runs with PAGER=cat and GIT_PAGER=cat where the user's environment sets neither, so a pty/run or a command pane never hangs in a pager</title>
<updated>2026-10-01T03:12:18Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-10-01T02:26:13Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=afe51fc6c3675a6aa8ab2f5caf64796b65597c2c'/>
<id>urn:sha1:afe51fc6c3675a6aa8ab2f5caf64796b65597c2c</id>
<content type='text'>
git log or man run through pty/run, or in a command pane, sat in less
at its first screen: no one presses q, and the run never answers. The
child's environment now names cat as the pager when the inherited one
names none; a user's own PAGER or GIT_PAGER is kept. It is every pane
child's, a terminal's shell too, since a pty/run's line runs in it.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
</feed>
