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/pardespardes 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-guiThe checksums are also in SHA256SUMS.
Or build it from source:
git clone https://git.sr.ht/~gbrls/pardes && cd pardesWith 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 ~/.localThen 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. Run pardes inside one, and everything it starts sees the session’s virtual filesystem as files:
name>
9ns --mntgen -- pardes-guiA 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=falseOr 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
endbash, in ~/.bashrc:
if [[ $- == *i* && -z $NINE_MOUNT && -e /dev/fuse ]] && command -v 9ns >/dev/null; then
exec 9ns --mntgen -- bash
fipardes 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' # fishexport VISUAL='pardes --wait' EDITOR='pardes --wait' # bash, zshgit 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 keptWith 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 already opens a pane there. Without a file manager, right-click on a path does the same.
--wait'
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:
.zig | zls (PARDES_LSP_ZIG) |
.rs | rust-analyzer (PARDES_LSP_RS) |
.c .h .cc .cpp .hpp .cxx .hxx | clangd (PARDES_LSP_C) |
.go | gopls (PARDES_LSP_GO) |
.ts .tsx .js .jsx .mjs .cjs | typescript-language-server --stdio (PARDES_LSP_TS) |
.py | pyright-langserver --stdio (PARDES_LSP_PY) |
PARDES_LSP_ZIG=$HOME/src/zls/zig-out/bin/zls pardes # another zls
PARDES_LSP_PY= pardes # none for .pyLspinfo (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 indexacme 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.