0x4200.cafe
pardes/manual.html

Manual

The parts of Pardes that are not keystrokes. The keys are on the Tutor page; the whole index is SPC ? inside the editor, which prints every builtin next to the keys that run it.

A pane is one of four things

Every pane is a tag line plus a body, and the body decides what it is.

  • Terminal. A real pty through ghostty-vt, with 16 MiB of scrollback and OSC 133 prompt semantics. Outside the raw shell the prompts are stripped and the command you typed at each one is kept.
  • File. Line-number gutter, tree-sitter highlighting from 26 grammars, Save, open-at-line, undo and redo.
  • Image. .png .jpg .jpeg .gif .bmp .ppm .pgm .tga. Real pixels where the shell can place them — kitty graphics in a terminal, GPU textures in the SDL and macOS windows — and a PETSCII block-glyph matcher where it cannot.
  • PDF. MuPDF, rendered as one continuous strip of pages.

A document takes a column of its own the first time you open one; every later one splits below it, so documents share that column and shells keep theirs.

PDFs

A PDF pane’s tag is live and says what it is doing:

pdf 3/128 width PdfFit filtered PdfTint PdfSections /path/to/it.pdf

The page you are on out of the count, then each of the three commands with its current setting written in front of it. Those are ordinary words — middle-click one and it runs.

  • PdfFit — a reading column you scroll down, or the whole page at once panned sideways.
  • PdfTint — original pixels, a theme duotone, or a filtered mode that repaints in the theme and adds back three quarters of each channel’s distance from the source’s own luminance, so colour survives and a grayscale scan comes out identical to the duotone.
  • PdfSections — the document outline as a buffer of rows you step with n and open with Enter.

/ searches the document’s real text through MuPDF. Where the shell can place pixels you can also drag out a text selection and take it with SPC y; where it cannot, the vertical keys step whole pages instead of scrolling.

PDF support is a build option — -Dmupdf, on for the native builds and off for the browser — and -Djpx alongside it is what makes a scanned document render at all rather than as a stack of blank pages.

The language backend

ZLS is compiled into Pardes and called in process. No subprocess, no JSON-RPC, no daemon, and no index warming up in the background — which also means nothing is cached between queries, so every question re-parses. It reads one language, .zig; on anything else the code queries do nothing at all, with no error row.

Helix’s five gotos keep helix’s own letters — gd gD gy gi gr, and Ctrl with a left click for gd. One answer jumps straight there; several fill a results buffer that n and N walk and Enter opens.

Ten more are builtins under SPC l: hover, rename, code actions, references, document and workspace symbols, file and tree diagnostics, and two that describe the backend itself rather than your code — one prints its version, what it answers and what it refuses, the other re-runs the query at the cursor out loud and says where it stopped. ]d and [d step the diagnostics; = writes a formatting diff into a buffer rather than applying it.

In insert mode, Tab straight after a . asks what could go there. What comes back is not a popup and nothing is typed for you: it is a buffer of rows, one per candidate, each pointing at where that candidate is declared. Picking one is looking at it.

Themes and fonts

228 themes, folded into one ring at compile time: three of ours first — helix (the default), dark, acme — then every theme helix and zed ship, generated from vendored sources when Pardes is built and sorted by name.

At 228, stepping the ring is browsing rather than arriving. NextColor steps it, Theme <name> goes straight to one, and ThemeSel lists them all into a buffer whose rows are those commands: step one with n, wear it with Tab.

The SDL and macOS builds add the same pair for fonts — a terminal’s font belongs to its emulator and a browser’s to the page, so those two builds have no font picker at all. FontSel lists every monospace face on the machine, one Font <name> row each. Monospace only: the grid is a fixed cell, and a picker that runs what you step onto would otherwise wear an unreadable face on the way past.

The one file Pardes reads

Before its first frame a native build reads a file called pardes in your config directory — $XDG_CONFIG_HOME/pardes when that is set to an absolute path, otherwise ~/.config/pardes, and ~/Library/Application Support/pardes on macOS. SPC f c prints the resolved path into a buffer whether or not anything is there, which is the case you actually ask in.

The format is one builtin command per line, spelled exactly as you would execute it anywhere else:

Theme gruvbox_dark_hard
Shell zsh
Tagbottom

Blank, unknown or malformed lines are ignored in silence and a bad line does not stop the ones after it. Two things to know: every toggle toggles, so Wrap in your config turns soft wrap off, because it starts on — and while a word that is not a builtin is never handed to a shell, Exec is a builtin — so an Exec line in this file types that command into a shell before your first frame. It cannot rebind a key: the keymap is one compiled-in Zig file, where a wrong binding is a compile error instead of a line that quietly did nothing.

Where it runs

  • Terminal (the default build) — libvaxis, inside whatever terminal you already have.
  • SDL3 — its own GPU window with a FreeType atlas; the CRT filter and the font picker live here.
  • Browser — a freestanding WebAssembly core driven by vanilla JavaScript and rendered as real DOM text, no canvas. No ptys, no host filesystem and no language backend; it replays a session dump. See Replays.
  • macOS — a native AppKit and CoreText app over a static library, with the trackpad mapped to acme’s three buttons.