pardes Setting up your environment

Setting up your environment

Install

pardes 0.23, the terminal build, static, any x86_64 Linux (62 MB):

curl -LO https://pub-66384ba880784f119ce95123b92fa5c6.r2.dev/pardes-x86_64-linux-static
echo '740992b18bdcfefc4db449dcbdb12423b4505eb2b3fb360aaa6dc57cc2fdda9f  pardes-x86_64-linux-static' | sha256sum -c
chmod +x pardes-x86_64-linux-static && mv pardes-x86_64-linux-static ~/.local/bin/pardes

pardes 0.23, the window, x86_64 Linux with glibc 2.29 or later; it loads Wayland or X11 and GL or Vulkan from the system (67 MB):

curl -LO https://pub-66384ba880784f119ce95123b92fa5c6.r2.dev/pardes-gui-x86_64-linux
echo 'a1c68b347d424b8077fb5af4050dd8455dc849adb0c1e2fc325b1646f5a255e5  pardes-gui-x86_64-linux' | sha256sum -c
chmod +x pardes-gui-x86_64-linux && mv pardes-gui-x86_64-linux ~/.local/bin/pardes-gui

The checksums are also in SHA256SUMS.

Or build it from source:

git clone https://git.sr.ht/~gbrls/pardes && cd pardes

With Zig 0.16 (the build fetches everything else; once that is downloaded, a first build from a clean cache took 62 seconds on 16 cores):

# pardes, in a terminal
zig build -Dplatform=tty --prefix ~/.local
# pardes-gui, its own window
zig build -Dplatform=gui --prefix ~/.local

Then run pardes or pardes FILE.

A 9P mount: 9ns

9ns, from cloud9 (git.sr.ht/~gbrls/cloud9, whose zig build builds it on Linux; it needs /dev/fuse), mounts 9P trees through FUSE as a plain user. With --mntgen it mounts every posted session at /mnt/9p and exports $NINE_MOUNT; a pardes session is $NINE_MOUNT/pardes/<pid or
name>
. Run pardes inside one, and everything it starts sees the session’s virtual filesystem as files:

9ns --mntgen -- pardes-gui

A desktop launcher that still starts pardes without 9ns or /dev/fuse (absolute paths: the Exec= line takes a $ only escaped, and a desktop PATH may lack ~/.local/bin):

[Desktop Entry]
Type=Application
Name=pardes
Exec=/bin/sh -c "if [ -x /home/me/.local/bin/9ns ] && [ -e /dev/fuse ]; then exec /home/me/.local/bin/9ns --mntgen -- /home/me/.local/bin/pardes-gui; else exec /home/me/.local/bin/pardes-gui; fi"
Terminal=false

Or let every interactive shell wrap itself, once. fish, in config.fish:

if status is-interactive; and not set -q NINE_MOUNT
        and test -e /dev/fuse; and type -q 9ns
    exec 9ns --mntgen -- fish
end

bash, in ~/.bashrc:

if [[ $- == *i* && -z $NINE_MOUNT && -e /dev/fuse ]] && command -v 9ns >/dev/null; then
    exec 9ns --mntgen -- bash
fi

pardes as your editor

pardes --wait FILE opens FILE as a pane and returns when you close it (outside pardes, it starts an editor that returns when you are done):

set -gx VISUAL 'pardes --wait'; set -gx EDITOR 'pardes --wait'   # fish
export VISUAL='pardes --wait' EDITOR='pardes --wait'            # bash, zsh

git commit, crontab -e and fish’s edit_command_buffer (Alt-E) read VISUAL before EDITOR, so set both.

A pager

ls --color=always | pardes -   # into the directory's +Pager, colours kept

With Pager pardes (the default) a terminal’s shell gets PAGER, GIT_PAGER and SYSTEMD_PAGER set to it (and SYSTEMD_PAGERSECURE=0) wherever your environment leaves them unset, so git log, journalctl and man arrive as a pane, a diff drawn as one; command panes page through cat. man reads MANPAGER first, which pardes never sets. Pager off in the startup file leaves them all yours, for terminals started after it; PagerColor off makes the text plain.

yazi in a terminal pane

In ~/.config/yazi/yazi.toml (yazi 26), an opener that forwards files to the session as panes:

[opener]
pardes = [
  { run = 'pardes %s', desc = "Open in pardes", for = "unix" },
]

[open]
prepend_rules = [
  { mime = "text/*", use = "pardes" },
]

yazi’s own edit opener runs $EDITOR and waits, so EDITOR='pardes
--wait'
already opens a pane there. Without a file manager, right-click on a path does the same.

Shells and PATH

pardes injects OSC 133 prompt marks into bash and fish (after your own ~/.bashrc and config.fish); they make Esc at an empty prompt and pty/run work. Other shells, or exec zsh inside a bash pane, get none: pty/run answers error no prompt marks. Terminals and command panes inherit pardes’s environment, its PATH included, so a script on that PATH is a word you can click.

Language servers

pardes starts a language server for a file it knows, from PATH:

.zigzls (PARDES_LSP_ZIG)
.rsrust-analyzer (PARDES_LSP_RS)
.c .h .cc .cpp .hpp .cxx .hxxclangd (PARDES_LSP_C)
.gogopls (PARDES_LSP_GO)
.ts .tsx .js .jsx .mjs .cjstypescript-language-server --stdio (PARDES_LSP_TS)
.pypyright-langserver --stdio (PARDES_LSP_PY)
PARDES_LSP_ZIG=$HOME/src/zls/zig-out/bin/zls pardes   # another zls
PARDES_LSP_PY= pardes                                  # none for .py

Lspinfo (SPCli) says what is running.

Fonts and themes

The terminal build uses your terminal’s font. The SDL window carries Adwaita Mono and finds others in /usr/share/fonts, /usr/local/share/fonts, ~/.local/share/fonts and ~/.fonts; Font Iosevka:16 picks one. Theme <name> and ThemeFile are in the themes chapter (→ Themes).

plan9port

Without a mount, plan9port’s 9p reads and writes a session:

9p -a "unix!$PARDES_9P" read index

acme habits carry over: pardes FILE is acme’s B, pardes --wait its E, the files have acme’s names, and a program holding a pane’s event takes its clicks, as win does.