summaryrefslogtreecommitdiff
path: root/docs/typ/guide.typ
diff options
context:
space:
mode:
Diffstat (limited to 'docs/typ/guide.typ')
-rw-r--r--docs/typ/guide.typ378
1 files changed, 119 insertions, 259 deletions
diff --git a/docs/typ/guide.typ b/docs/typ/guide.typ
index 077484dc..087291a8 100644
--- a/docs/typ/guide.typ
+++ b/docs/typ/guide.typ
@@ -1,6 +1,6 @@
-// The guide: pardes day to day, read once in about ten minutes. The
-// cheatsheet is the index of keys and words; the reference has every
-// 9P file; scripting has the recipes.
+// The guide: pardes day to day, the path a newcomer reads once. Edge cases
+// live in the reference, the pager and the language servers in setup, the
+// keys on the cheatsheet.
#import "style.typ": key, keys, btn, chord, word, tag, addr, file, cmd, doc, pairs
pardes is a screen of columns. Each column holds panes, and each pane is a
@@ -9,326 +9,194 @@ Above the columns runs the workspace tag, and each column has a tag of its
own. Any text anywhere can be clicked: #btn("B2") runs it, #btn("B3") looks
at it. The keys are helix's, in modes.
+= Words you'll see <words>
+
+#pairs(
+ [tag], [the line of words over a pane, a column or the screen; every word in it can be clicked],
+ [the pane with the keyboard], [where your keys go; one pane at a time],
+ [active column], [where the next new pane goes (below)],
+ [command pane], [a terminal that runs one command line and shows its output],
+ [scratch], [a pane of text with no file yet, `+New`],
+ [listing], [a pane of places to visit: `+Search`, Recent, Jumplist, Themes],
+ [message row], [the line where pardes says what happened],
+ [grip], [the box left of a pane's tag: drag it, and it marks unsaved text],
+)
+
= Modes <modes>
-Each pane has its own mode and keeps it while you are elsewhere: leave a
-terminal at its `$` and it is still `$` when you come back. The box at the
-left of a pane's tag shows the mode.
+Each pane has its own mode and keeps it while you are elsewhere. The box
+at the left of a pane's tag shows it.
#pairs(
- [normal (box blank)], [keys move and select; an edit acts on the selection. File and PDF panes start here, and so does a terminal from #key("Alt-n").],
+ [normal (blank)], [keys move and select; an edit acts on the selection. File and PDF panes start here, and so does a terminal from #key("Alt-n").],
[insert (`^`)], [keys type. #keys("i", "a", "o") and the rest enter it.],
[raw (`$`), terminals only], [keys go to the program. A terminal from #word("Tty"), the shell a bare `pardes` starts with, and a command pane start here.],
)
#key("Ctrl-b") switches a terminal between raw and normal; in normal mode
-the shell's prompts are hidden and its text is a page to move over and
-copy from. #word("Mode") in the tag steps raw, normal, insert. Esc and
-Shift-Esc depend on the mode:
+its prompts are hidden and its text is a page to move over and copy from.
+#word("Mode") in the tag steps raw, normal, insert.
#pairs(
[normal], [#key("Esc"): back to the previous pane (#word("Last")). #key("Shift-Esc"): the same.],
[insert], [#key("Esc"): back to normal. #key("Shift-Esc"): out of insert and back to the previous pane.],
- [raw `$`], [#key("Esc"): to the program, except at a shell prompt with nothing typed on it, where it goes back to the previous pane. #key("Shift-Esc"): always back to the previous pane. Either way the terminal stays `$`.],
+ [raw `$`], [#key("Esc"): to the program, except at a shell prompt with nothing typed on it, where it goes back to the previous pane. #key("Shift-Esc"): always back. Either way the terminal stays `$`.],
[a PDF], [#key("Esc"): clears the selection and the search highlights. #key("Shift-Esc"): back to the previous pane.],
)
-In short, #key("Shift-Esc") is the Esc nothing swallows: in every mode and pane it goes back to the previous pane, as Esc does from normal, and a raw program never sees it. #key("Ctrl-b") alone switches a terminal between raw and normal. "A shell prompt with nothing
-typed on it" is one pardes knows from the prompt marks it injects into bash
-and fish (and, for other shells, from no program holding the terminal).
-"The previous pane" is the last other pane on the jump list; with none, the
-next pane down its column (wrapping), else any other pane. In raw mode
-every key but #key("Ctrl-b"), Esc and the paste chords goes to the
-program, so #key("Ctrl-w") and #key("Alt-n") need you out of raw mode
-first (and #key("Ctrl-w") out of insert mode, where it deletes a word).
+"The previous pane" is the last other pane on the jump list, else the next
+pane down its column. In raw mode every key but #key("Ctrl-b"), Esc and the
+paste chords goes to the program, so #key("Ctrl-w") and #key("Alt-n") need
+you out of raw mode first.
= The mouse <mouse>
#pairs(
- btn("B1"), [select; a plain click puts the cursor there and gives the pane the keyboard. In a tag it starts typing at the click, in insert mode. A double click selects the word, the line (at a line's start or end), or up to the matching bracket or quote.],
+ btn("B1"), [select; a click puts the cursor there and gives the pane the keyboard. In a tag it starts typing, in insert mode. A double click selects the word, the line, or up to the matching bracket or quote.],
btn("B2"), [execute: a builtin word runs, anything else is a shell line.],
- btn("B3"), [look: open the file, address, directory or URL, or else find the word's next place.],
+ btn("B3"), [look: open the file, address, directory or URL, else find the word's next place.],
)
-A #btn("B2") or #btn("B3") click with no drag takes the word under it,
-where a word is the run of letters, digits, non-ASCII and `. - + / : @ _ ~`
-around the click; a trailing `:` is dropped. So #btn("B3") anywhere on
-`src/bar.c:12:5:` in a compiler's `src/bar.c:12:5: error` opens
-`src/bar.c` at line 12, byte column 5, while a click on `error` finds
-`error`. Drag instead to say exactly what you mean. #key("Enter") and
-#key("Tab") in normal mode look and execute the selection, or the word
-under the cursor. The chords are on the cheatsheet.
+A #btn("B2") or #btn("B3") click with no drag takes the word under it: the
+run of letters, digits and `. - + / : @ _ ~`, a trailing `:` dropped. So
+#btn("B3") on `src/bar.c:12:5:` in a compiler's error opens `src/bar.c` at
+line 12, column 5. Drag to say exactly what you mean. #key("Enter") and
+#key("Tab") in normal mode look and execute. The chords are on the
+cheatsheet.
= Tags <tags>
-There are three kinds, and which directory a command runs in depends on
-which one you click:
-
#tag("Newcol Joincol Find Grep Help Changelog Tutor Dump Themes Config Debug Exit")
#tag("New Tty Find Grep Joincol Delcol")
#tag("Save Tty Collapse Del", path: "/home/me/notes.txt")
-- The workspace tag and the column tags run commands in the session's
- directory (where pardes started). A column's own words (#word("New"),
- #word("Tty"), #word("Delcol")) act on that column; a pane word
- (#word("Save"), #word("Del")) acts on the column's pane with the
- keyboard, or its first; from the workspace tag, on the pane with the
- keyboard.
-- A pane's tag runs commands in the pane's directory: a file's directory, a
- terminal's current directory.
-
A tag is text with undo: type a word into it and click it, or delete the
-defaults. #key(":") moves the keyboard between a body and its tag. A pane
-tag may wrap onto several lines; column and workspace tags are one line.
-The path at the start of a pane's tag is computed: typing into it, or
-clicking it, drafts a new name, #key("Enter") confirms and the next
-#word("Save") writes there; #key("Esc") cancels. #word("Collapse") folds a
-pane to its tag. Unsaved text shows on the grip, the box left of the tag.
-Drag the grip up or down to resize, or onto another column to move the
-pane there.
+defaults. #key(":") moves the keyboard between a body and its tag. The path
+at the start of a pane's tag is computed: typing into it drafts a new name,
+#key("Enter") confirms and the next #word("Save") writes there.
+#word("Collapse") folds a pane to its tag. Drag the grip up or down to
+resize, or onto another column to move the pane.
+
+= Where commands run and panes go <command-panes>
-= The active column and the keyboard <active-column>
+#btn("B2") on a line that is no builtin (`make`, `git log`) runs it with
+the #word("Shell") setting's `-c`. Where depends on where you clicked:
-Two things are easy to confuse:
+#pairs(
+ [a terminal's text or tag, at a prompt with nothing typed], [typed into that shell, in its current directory],
+ [any other pane's text or tag], [a command pane in that pane's directory, in the last column],
+ [a column's tag], [a command pane in the session's directory, in that column],
+ [the workspace tag], [a command pane in the session's directory, in the last column],
+)
-- *The pane with the keyboard* is where your keys go.
-- *The active column* is where new panes go. It is the column you last
- typed in, #btn("B1")-clicked in, dropped a pane into or gave the keyboard
- to its tag, or the one that got the last new pane. A look does not move
- it.
+The keyboard stays where it was. A command pane's tag says `running`, then
+`exit N`:
-They usually agree. Here is how they split. You are typing in column 1, so
-column 1 is active. You click #word("New") in column 2's tag: a scratch
-pane opens in column 2 and takes the keyboard, and column 2 is now
-active. In it you #btn("B3") `x.txt`, which is already open in column 1:
-the keyboard jumps to that pane in column 1, but the active column stays
-2, so the next pane a look opens lands in column 2, away from where you
-are. Type or click in column 1 and it is active again.
+#tag("Kill Save Collapse Del", path: "/home/me/src (make) exit 0")
-== Where new panes go <new-panes>
+The next command for that directory reuses a finished command pane.
+#word("Kill") stops what pardes started (`Kill make`: those whose line
+starts with `make`); #word("Exit") quits pardes. A pane word from a column
+tag (#word("Save"), #word("Del")) acts on that column's pane with the
+keyboard, or its first.
-#word("Placement") picks the rules: `acme` (the default) or `pardes`.
-Under `acme`, a new pane goes into the column whose tag asked, else the
-active column, never into a new column. An empty column it takes whole;
-#word("New") and 9P's #file("pane/new") take the bottom half of the
-column's last pane; a pane opened from a pane's text (a look, #word("Tty"),
-#key("Alt-n")) goes under the pane with the most blank rows, or halves the
-biggest; a command pane goes to the last column. #word("New") in a pane's
-tag opens a `+New` scratch named in that pane's directory, in that pane's
-column; from a column tag, in that column and the session's directory.
-Every new pane takes the keyboard, except a command pane and a listing
-(`+Search`, #word("Recent"), #word("Jumplist"), #word("Themes"), `Fonts`),
-which opens below the pane that asked and leaves it the keyboard, so
-#keys("n", "N") walk the listing and #key("Tab") runs a row. No pane is made
-shorter than its tag and two rows; where there is no room the pane is
-refused. `Placement pardes` instead fills an empty column whose tag asked
-or has the keyboard, puts a scratch or a shell under the pane that asked,
-a document beside the last one read (or in a column of its own on a wide
-screen), and a command pane at the foot of the last column.
+Every other new pane goes into the *active column*: the column you last
+typed or #btn("B1")-clicked in, or the one that got the last new pane. It
+takes the keyboard, except a listing, which opens below the pane that
+asked and leaves it the keyboard, so #keys("n", "N") walk the listing. A
+look moves the keyboard but not the active column: #btn("B3") on a file
+already open in another column jumps there, and the next new pane still
+lands in the old column until you type or click. #word("Placement")
+`pardes` picks other rules (#doc("reference", section: "placement")).
-A column can be empty, as in acme: closing its last pane leaves it, its
-tag over blank space. #word("Delcol") and #word("Joincol") take columns
-away. Closing the session's last pane quits pardes.
+A column can be empty: closing its last pane leaves it. #word("Delcol")
+and #word("Joincol") take columns away. Closing the session's last pane
+quits pardes.
= Looking <looking>
#btn("B3") (or #key("Enter")) on a path opens it, or goes to the pane that
-already shows it; `file:12` goes to line 12. The address forms are on the
-cheatsheet. A directory types `ls` into a terminal idle there, else opens
-a terminal there. A URL opens in the browser. #word("Find") `name` lists the files
-below the pane's directory whose names hold it; #word("Grep") `text` lists
-the lines that contain that text, literally (ASCII case aside, no regular
-expression), in files under every pane's directory. Both land in `+Search`,
-a place per row for #btn("B3"). Grep reads at most 256 KiB of a file and
-stops at 512 hits, Find at 512 names; the walk stops at 20000 files or
-100000 entries, 16 deep, and passes over `.git`, `.jj`, `target`,
-`node_modules`, `.venv`, `__pycache__`, `.zig-cache` and `zig-out`. A cap
-hit, or a directory it could not open, is said at the end (`cut at 512
-hits`, `N files read only in part (first 256 KiB)`, `walk cut at N
-entries`, `N directories skipped: permission denied`). A search that finds
-nothing and skipped nothing fails, `Grep: text not found`, and leaves
-the `+Search` as it was.
-
-A relative path is looked for where the click was, then where you have
-been: first in the looking pane's own directory, then in the directory of
-each pane on the jump list, most recent first. The first that names a
-file, or a pane open on that path, wins. `./x` and `../x` look only in the
-pane's own directory.
-
-= Command panes <command-panes>
-
-#btn("B2") on a line that is no builtin (`make`, `git log`) runs it with
-the #word("Shell") setting's `-c`, in the directory of the tag or pane it
-came from. In a terminal at a shell prompt with nothing typed on it, a line from that
-terminal's own text is typed into its shell. Anywhere else it runs in a
-command pane, a terminal of its own:
-
-#tag("Kill Save Collapse Del", path: "/home/me/src (make) exit 0")
+already shows it; `file:12` goes to line 12, and the other address forms
+are on the cheatsheet. A directory types `ls` into a terminal idle there,
+else opens one there. A URL opens in the browser. A relative path is
+looked for in the looking pane's directory, then in the directory of each
+pane on the jump list, most recent first.
-Its tag says `running`, then `exit N`. Its directory is the one it
-started in, and relative looks in it resolve there, whatever the command
-did with `cd`. The next command for the same
-directory reuses a command pane that has finished (from a column tag, only
-one in that column), below what it showed; a pane still running, or one a
-background job still prints to, is never reused, so a second command
-meanwhile gets a pane of its own. #word("Kill") stops what pardes started
-(`Kill make`: those whose line starts with `make`); #word("Exit") quits
-pardes.
+#word("Find") `name` lists the files below the pane's directory whose
+names hold it; #word("Grep") `text` lists the lines that hold the text,
+literally (no regular expression), under every pane's directory. Both land
+in a `+Search` listing; their limits are in the reference.
= Unsaved panes <unsaved-panes>
-A pane whose text is unsaved is marked on its grip. #word("Del") on it
-refuses once: a notice says `1 unsaved pane — Del again to discard` and the
-pane is listed in `+Unsaved`. The same #word("Del") again, with nothing
-edited since, discards it. #word("Exit") and #word("Restore") refuse once
-over unsaved panes the same way; #word("Delcol") refuses once too, but
-lists them only in its notice and the log, opening no `+Unsaved`. A `+New`
-scratch under 100 bytes and a command's output never hold anything up.
-
-From the keyboard (#key("SPC d")), #word("Del") on a pane with panes above
-and below it also asks which neighbour takes its rows: #key("k") above,
-#key("j") below, any other key keeps the pane. A click never asks, and
-gives the rows to the pane above.
+A pane with unsaved text is marked on its grip. #word("Del") on it refuses
+once: the message row says `1 unsaved pane — Del again to discard` and the
+pane is listed in `+Unsaved`. The same #word("Del") again discards it.
+#word("Exit"), #word("Restore") and #word("Delcol") refuse once the same
+way. From the keyboard (#key("SPC d")), #word("Del") between two panes
+also asks which takes its rows: #key("k") above, #key("j") below.
= Terminals <terminals>
-A terminal is a pane like any other.
-
#tag("Tty+bash Save Mode Filter Collapse Del", path: "/home/me/src")
-- `Tty+bash` opens another terminal on that shell; a bare #word("Tty")
- runs the #word("Shell") setting, `$SHELL` when it is executable, else
- `/bin/sh`.
-- #word("Save") asks for a path on the pane's notice band and writes the
- terminal's scrollback there as text; `Save path` writes it at once.
+- `Tty+bash` opens another terminal on that shell; bare #word("Tty") runs
+ the #word("Shell") setting.
+- #word("Save") writes the scrollback to a path it asks for.
- #word("Filter") maps the program's colours through the theme.
-- A terminal showing kitty graphics (yazi's previews) shows `petscii:on` or
- `petscii:off` in its tag. #word("Petscii") toggles it: on draws the
- program's images as glyph art instead of host pixels, off goes back to
- pixels. A terminal with no images shows the word only while it is on.
-- The `+New` scratch a bare `pardes` starts under its shell runs its
- commands in that terminal's current directory, following its `cd`.
-- A paging command in a terminal (`git log`, `man`) opens its text in a
- `+Pager` pane: a terminal's `PAGER` and `GIT_PAGER` are `pardes -` unless
- your environment sets them. `Pager off` keeps your own pager, for
- terminals started after it. A diff paged into `+Pager` (`git diff`,
- `git show`, `git log -p`) is drawn and looked at as a diff.
-- In raw mode Ctrl-V types what you yanked into the program (with nothing
- yanked, the program gets the key), and Ctrl-Shift-V the desktop
- clipboard.
-- A program that tracks the mouse (htop, vim with `mouse=a`) gets
- #btn("B1")'s clicks and drags and the wheel over its grid; #btn("B2") and
- #btn("B3") stay pardes's. Hold Shift to swap: #btn("B1", shift: true)
- selects and Shift-wheel scrolls pardes's scrollback, while
- #btn("B2", shift: true) and #btn("B3", shift: true) go to the program as
- its buttons 2 and 3. A full-screen program that does not track the mouse
- gets the wheel as arrow keys. Tags, grips and gutters stay pardes's.
-- `Repl python` in a terminal's tag makes #btn("B2") on a `.py` pane send
- the text to that REPL instead of running it.
+- #word("Petscii") draws a program's images as glyph art instead of pixels.
+- In raw mode Ctrl-V types what you yanked, Ctrl-Shift-V the clipboard.
+- A program that tracks the mouse gets #btn("B1") and the wheel;
+ #btn("B2") and #btn("B3") stay pardes's. Hold Shift to swap.
+- `Repl python` in its tag makes #btn("B2") on a `.py` pane send the text
+ to that REPL.
+- Paged output (`git log`, `man`) opens in a `+Pager` pane (#doc("setup", section: "pager")).
= Reviewing diffs <reviewing-diffs>
-Open a `.diff` or `.patch`, or run `git diff` (or `git show`, `diff -u`) as
-a command: once it has finished, output that starts as a diff is shown as
-one, each hunk coloured in its file's language and its added and removed
-rows tinted. Then #btn("B3") to jump, with the usual look resolution:
-
-- a `diff --git`, `---` or `+++` line opens the file (the new one, or the
- old one on a `---` line unless the `+++` under it names another);
-- a `@@ -a,b +c,d @@` line goes to line `c` of the new file;
-- the `+`, `-` or space in a hunk line's first column goes to that line in
- the new file (for a removed line, the line now standing where it was);
-- the code after it is ordinary words.
-
-git's `a/` and `b/` prefixes are dropped (and `c/ i/ w/ o/` with
-`diff.mnemonicPrefix`); a `--no-prefix` diff's paths are kept as written.
+Open a `.diff` or `.patch`, or run `git diff` as a command: the output is
+drawn as a diff, each hunk coloured in its file's language. #btn("B3") on a
+`diff --git`, `---` or `+++` line opens the file; on `@@` the hunk's first
+new line; on a hunk line's `+`, `-` or space, that line in the new file.
= `pardes FILE` and `--wait` <editor>
In a pane's shell, `pardes FILE` opens FILE in this session and returns at
-once, as acme's `B` does. A FILE not there yet opens an empty pane named
-for it; #word("Save") creates it, making its directories first. Something
-the session refuses (a bad name; a name under a directory you may not
-search or write, `permission denied`) is printed and the command exits 1.
-`--` ends the options: `pardes -- -name` opens a file named `-name`.
-
-`pardes --wait FILE` (`-w`) returns when the pane showing FILE is closed
-(exit 0) or the session goes away (exit 1), as acme's `E` does. With
-`$PARDES_9P` set but no pane of its own (an agent's `EDITOR`) it opens FILE
-in that session and waits there. Set
-`EDITOR='pardes --wait'` (`GIT_EDITOR` follows it), and `git commit`,
-`crontab -e` and fish's Alt-E open in a pane and read the file once you
-close it. Bare `pardes` inside a pane refuses and names `--nested`, which
-starts a separate session whose shells do not forward to it.
+once, as acme's `B` does; a FILE not there yet opens an empty pane that
+#word("Save") creates. `pardes --wait FILE` returns when that pane is
+closed, as acme's `E` does, which makes it an `EDITOR`
+(#doc("setup", section: "editor-setup")). Refusals and `--nested` are in
+the reference.
= Keys <keys>
Motions select what they cross, and an edit acts on the selection: #key("w")
-then #key("d") deletes a word. #key("x") selects lines, #key("v") extends
-characters, #key(";") collapses to the cursor. #key("s") makes a cursor
-per regex match inside the selection, and every edit then acts at each.
-#key("/") is a case-insensitive substring search, one hit a line; the
-regexes are on #key("s") and #key("S"). #keys("n", "N") step through
-everything a look would open, across panes. Line end is #key("g l"), and
-#key("$") is helix's keep-pipe. #key("SPC") starts the leader,
-#key("SPC ?") lists every path, and #word("Help") lists every key and
-builtin. #word("Tutor") (#key("SPC h t")) practises them.
-
-The language servers run as child processes, one per language when it is
-on `PATH`: `zls`, `rust-analyzer`, `clangd`, `gopls`,
-`typescript-language-server` and `pyright-langserver`
-(`PARDES_LSP_ZIG`, `_RS`, `_C`, `_GO`, `_TS`, `_PY` name another, empty
-turns one off):
-
-#pairs(
- [#keys("g d", "g D", "g y", "g i", "g r")], [definition, declaration, type, implementation, references; Ctrl-#btn("B1") is a definition too],
- [#keys("SPC l k", "SPC l r", "SPC l a", "SPC l h")], [hover, rename, code action, select the references],
- [#keys("SPC l s", "SPC l S", "SPC l d", "SPC l D")], [symbols and diagnostics, of the file and the workspace],
- [#keys("SPC l c", "SPC l C", "SPC l t", "SPC l T")], [incoming and outgoing calls, supertypes and subtypes],
- [#keys("] d", "[ d")], [next and previous diagnostic],
- [#key("=")], [format],
- [#keys("SPC l i", "SPC l w")], [#word("Lspinfo"): the servers' state; #word("Lspwhy"): why the last query found what it did],
-)
-
-One answer jumps; several open a list where #key("Enter") on a row goes
-there. In insert mode #key("Tab") after a `.` lists the candidate
-declarations and inserts nothing. A format or a rename within the file is
-one undo step. A rename that reaches other files applies nothing: it opens
-a `+Search` preview of the edits. So does one the server answers in this
-file alone while another open file of its language still holds the old
-name, with a row per such file (zls does this renaming at a declaration;
-from a use it reaches every file). A server is `not started yet`
-until its first query.
+then #key("d") deletes a word. #key("x") selects lines, #key("v") extends,
+#key(";") collapses to the cursor. #key("s") makes a cursor per regex match
+and every edit acts at each. #key("/") is a substring search; the regexes
+are on #key("s") and #key("S"). #keys("n", "N") step through everything a
+look would open, across panes. Line end is #key("g l"). #key("SPC") starts
+the leader, #key("SPC ?") lists every path, #word("Help") every key and
+builtin, and #word("Tutor") (#key("SPC h t")) practises them. The language
+keys (#keys("g d", "g r"), `SPC l`) work once a server is installed
+(#doc("setup", section: "language-servers")).
= Sessions <sessions>
```
pardes --detach=work & a session with no screen of its own
pardes --attach=work show it here
-pardes-gui --attach=work the SDL window can attach too
```
The session owns the panes, shells and files; frontends come and go.
-#word("Attach") `work` (#key("SPC s a")) switches this window to that
-session, and #word("Detach") (#key("SPC s D")) leaves it running, shells
-and all. Bare `--detach` names the session after its pid; bare `--attach`
-needs exactly one session; a second `--detach=NAME` while NAME runs says so
-and exits 1. Every attached frontend sees the same screen,
-at the smallest common size. With none attached, `size C R` on the root
-ctl sets the screen and messages clear by the clock, and a pane's pty
-reports its size in pixels at the last frontend's cell size (8×16 before
-any frontend attached), so programs like yazi still size their images;
-CSI 14, 16 and 18 t answer the same. A detached session
-ends when its last pane closes, as any session does.
+#word("Attach") `work` (#key("SPC s a")) switches this window to it, and
+#word("Detach") (#key("SPC s D")) leaves it running. Every attached frontend
+sees the same screen.
= Config <config>
#word("Config") (#key("SPC f c")) opens the startup file,
-`~/.config/pardes/init` (`$XDG_CONFIG_HOME/pardes/init` when that is
-absolute; on macOS `~/Library/Application Support/pardes/init`). Each line
-is one builtin, run at start as if executed; `#` starts a comment, and a
-line that fails is skipped silently. Text that is no builtin does not run
-as a shell command.
+`~/.config/pardes/init`: one builtin a line, run at start, `#` a comment.
```
Theme atelier
@@ -336,15 +204,7 @@ Shell zsh
Placement pardes
```
-#word("DumpConfig") opens every live setting as the line that sets it, so
-it pastes back into `init` as is. The settings are listed with the root
-ctl in the reference (#doc("fs", section: "settings")). Keys are
-compile-time, in `src/config.zig`.
-
-#word("Dump") writes the workspace to `pardes-<date>-<time>.zon` in
-#word("DumpDir"), and `Restore path` (or `pardes -l dump.zon`) brings it
-back: panes, columns, tags, selections, theme and changed settings; a
-terminal returns with its last MiB of output and a new shell in its old
-directory. Undo history and REPL bindings are not kept. A crash appends
-two lines (build, time, platform, pid; the panic message) to `crashes`
-beside `init`.
+#word("DumpConfig") opens every live setting as the line that sets it.
+#word("Dump") saves the workspace and #word("Restore") brings it back; what
+a dump keeps is in the reference. Keys are compile-time, in
+`src/config.zig`.