diff options
Diffstat (limited to 'docs/typ/guide.typ')
| -rw-r--r-- | docs/typ/guide.typ | 293 |
1 files changed, 175 insertions, 118 deletions
diff --git a/docs/typ/guide.typ b/docs/typ/guide.typ index d07ab6cd..578e7ea8 100644 --- a/docs/typ/guide.typ +++ b/docs/typ/guide.typ @@ -1,19 +1,21 @@ // 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, glossary +#import "style.typ": key, keys, btn, chord, word, tag, addr, file, cmd, doc, pairs, glossary, annotated, clip, mode-box -pardes reads the text on its screen as things to do, with two builtins. -#word("Look") (right-click): open the `file:line`, address or URL the text -names, or else find the text. #word("Exec") (middle-click): run the builtin -the text names, or else run it as a shell line. Everything else is where -that happens: columns of panes, each a tag (a line of words) over a body -that is a file you edit, a terminal, a PDF or an image, with a tag for each -column and the workspace above. The keys are helix's, in modes, and every -session is also a virtual filesystem, served over 9P, for scripts. +#word("Look") (right-click) opens `src/bar.c:12`; #word("Exec") (middle-click) runs `make`. + +#annotated("/docs/site/media/themes/orchard.png", (640, 513), + alt: "a pardes window: workspace tag, column tag, a file pane, a terminal and a diff", + ([the workspace tag: words for the whole session], -22, 11), + ([a column's tag], 400, 34), + ([a pane's tag: its path, then its words], 560, 58), + ([the box: the pane's mode, and the handle to drag it], 8, 58), + ([the body: here a file, below it a terminal], 200, 104), + ([the scrollbar: how much of the body is in view], 8, 160), +) #glossary("Words you'll see", <words>, - [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], [the session's directory], [where pardes started, or the directory `pardes DIR` named; workspace and column tags run there], [active column], [where the next new pane goes (below)], @@ -21,40 +23,43 @@ session is also a virtual filesystem, served over 9P, for scripts. [`+` names], [panes pardes makes, named in their directory: `+New` a scratch (text with no file yet), `+Search` a listing of places, `+Pager` paged text, `+Errors` output, `+Unsaved` the panes holding unsaved text], [serial], [a pane's number, never reused: the `3` in `@p3:12` and in 9P paths], [message row], [the line where pardes says what happened, and asks: answer a prompt (a search, #word("Save")'s path) with #key("Enter"), cancel it with #key("Esc")], - [the box], [left of a pane's tag: drag it to move or resize the pane; it shows the mode, and marks unsaved text (`*`, or filled in the window)], ) = Modes <modes> -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. +Each pane keeps its own mode. The box left of its tag shows it. #pairs( - [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.], + [#mode-box(" ") normal], [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").], + [#mode-box("^") insert], [keys type. #keys("i", "a", "o") and the rest enter it.], + [#mode-box("$") 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 -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. +#key("Ctrl-b") switches a terminal between raw and normal. In normal, +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. Either way the terminal stays `$`.], + [#mode-box(" ") normal], [#key("Esc"): back to the previous pane (#word("Last")), unlike helix. #key("Shift-Esc"): the same.], + [#mode-box("^") insert], [#key("Esc"): back to normal. #key("Shift-Esc"): out of insert and back to the previous pane.], + [#mode-box("$") 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 raw.], [a PDF], [#key("Esc"): clears the selection and the search highlights. #key("Shift-Esc"): back to the previous pane.], ) -Unlike helix, #key("Esc") in normal mode leaves the pane: it is how you go -back. #key("Shift-Esc") needs the kitty keyboard protocol or the GUI; -elsewhere it is a plain Esc. "The previous pane" is the last other pane on -the jump list, else the next pane down its column. #key("Ctrl-w") then -#keys("h", "j", "k", "l") moves the keyboard to the pane left, below, -above or right; #keys("Ctrl-o", "Ctrl-i") walk back and forward through the -places you have jumped to, the jump list. 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. +In acme, Esc selects the text typed since the last click; here it leaves +insert mode, or goes back a pane. + +#key("Shift-Esc") needs the kitty keyboard protocol or the GUI. Elsewhere +it is a plain Esc. The previous pane is the last one you jumped from, else +the next pane down the column. + +#pairs( + [#key("Ctrl-w") #key("h")], [the keyboard to the pane on the left; #key("j") below, #key("k") above, #key("l") right], + [#keys("Ctrl-o", "Ctrl-i")], [back and forward through the places you jumped to (the jump list), this file's first: another file's only once it has none left that way (#word("JumpScope") `all`: every place in order). #key("Ctrl-i") needs the kitty keyboard protocol or the GUI, being #key("Tab") elsewhere: there use #key("SPC j i") and #key("SPC j o"), or the mouse's side buttons], +) + +Raw mode sends almost every key to the program. Leave it (#key("Ctrl-b")) +before #key("Ctrl-w") or #key("Alt-n"). = The mouse <mouse> @@ -62,21 +67,28 @@ you out of raw mode first. 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; at a line's start or end, the line; just inside a bracket or quote, up to its match.], btn("B2"), [#word("Exec"): a builtin word runs, anything else is a shell line.], btn("B3"), [#word("Look"): open the file, address, directory or URL, else find the word's next place.], + chord("B1", "B2"), [cut the selection], + chord("B1", "B3"), [paste over it], + chord("B1", "B2", "B3"), [copy], + [Alt-click (Option)], [#btn("B2"), sweeps too, for one button or a trackpad; in a terminal too], + [Super-click (Cmd)], [#btn("B3"); not in a terminal, which never passes Super], + [Ctrl-click], [the language server's definition], ) +#clip("chords") -With one button, as on a trackpad, Alt-click (Option on a Mac) is #btn("B2") and Super-click (Cmd) is #btn("B3"), sweeps included; Ctrl-click stays the language server's definition, a program that takes the mouse gets the plain click, and in a terminal only Alt-click works, since Super never reaches pardes there. +A program that takes the mouse gets the plain click. -A middle- or right-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 are #word("Look") and #word("Exec"). +line 12, column 5. A click takes the word under it: letters, digits and +`. - + / : @ _ ~`, less a trailing `:`. Drag to take exactly what you +swept. In normal mode #key("Enter") is #word("Look") and #key("Tab") is +#word("Exec"). + +A builtin's argument: sweep `Find conf` with #btn("B2"), or select `conf`, +then #chord("B2", "B1") on `Find`. -Hold the left button and click the middle one to cut the selection, the -right one to paste over it, both one after the other to copy. #key("y") yanks and -#key("p") pastes after (a line yanked with #key("x") #key("y") goes in as a -new line below), through registers every pane shares; #key("SPC y") and -#key("SPC p") use the system clipboard. +#key("x") #key("y") then #key("p") copies a line below. Every pane shares +the registers. #key("SPC y") and #key("SPC p") use the system clipboard. = Tags <tags> @@ -84,19 +96,23 @@ new line below), through registers every pane shares; #key("SPC y") and #tag("New Tty Find Grep Joincol Delcol") #tag("Save Tty Collapse Del", path: "/home/me/notes.txt") -A tag is text with undo: type a word into it and click it, or delete the -defaults. #key(":") moves the keyboard to the tag, onto its #word("Save") -the first time, in normal mode (#key("Tab") runs it), and back. Any word -runs from any tag: #word("Exit") in a pane's tag quits too. 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. +A tag is text with undo. Type `make` into one and #word("Exec") it, or +delete the words you never use. Any word runs from any tag: #word("Exit") +in a pane's tag quits too. + +#pairs( + [#key(":")], [the keyboard to the tag, on #word("Save") the first time; #key("Tab") runs it, #key(":") comes back], + [edit the path, #key("Enter")], [renames: the next #word("Save") writes there; the typed path survives #key("Esc"), pending, and a second #key("Esc") drops it], + [#word("Collapse")], [folds the pane to its tag], + [drag the box], [up or down resizes; onto another column moves the pane], +) = Where commands run and panes go <command-panes> -#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: +#btn("B2") on `make` runs it with the #word("Shell") setting's `-c`. +Where it runs depends on where you clicked: + +#clip("where-commands-run") #pairs( [a terminal's text or tag, at a prompt with nothing typed], [typed into that shell, in its current directory], @@ -105,58 +121,66 @@ the #word("Shell") setting's `-c`. Where depends on where you clicked: [the workspace tag], [a command pane in the session's directory, in the last column], ) -The keyboard stays where it was. A file's tag runs in the file's directory, -so run project commands (`make`) from a column or the workspace tag, or a -shell. A command pane's tag says `running`, then `exit N`: +A file's text and tag run in its directory: `make` from `README` at the +project root is right, from `src/main.c` it is not. The keyboard stays +where it was. The command pane's tag ends in `running`, then `exit N`: #tag("Kill Save Collapse Del", path: "/home/me/src (make) exit 0") -The next command for that directory reuses a finished command pane. -#word("Kill") stops what pardes started (#word("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. +Click into the command pane: #key("n") selects the next `file:line`, +#key("Enter") opens it, and #key("n") from there goes on to the next error. +A finished command pane is in normal mode, so #key("x") #key("y") copy from +it at once. The next command for that directory reuses it. +#word("Kill") `make` stops the commands pardes started with `make`. +#word("Save") or #word("Del") in a column tag acts on that column's pane +with the keyboard, else its first. -Every other new pane goes into the *active column*: the column you last -typed or left-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. -#word("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")). +Every other new pane goes into the *active column*: where you last typed +or left-clicked, or where the last new pane went. The new pane takes the +keyboard. A listing is the exception: it opens below the pane that asked, +which keeps the keyboard, so #keys("n", "N") walk the listing. #btn("B3") +on a file open in another column jumps there, but the next new pane still +lands in the old column. #word("Placement") `pardes` picks other rules +(#doc("reference", section: "placement")). -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. +To open beside: #word("Newcol"), then #word("Look") a file name typed in +its tag opens it there; #key("Alt-c") moves a pane into a new column. +#clip("columns", wide: true) + +Closing a column's last pane leaves it empty; #word("Delcol") and +#word("Joincol") take columns away. Closing the session's last pane quits +pardes. = Look <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, `file:/re/` to the next -match of `re`, and the other address forms are on the cheatsheet. -#key("/"), text and #key("Enter") list the lines holding it in a `+Search` -and go to the first; #keys("n", "N") step through the rest. A directory types `ls` into a terminal idle there, -else opens one there. A URL opens in the browser. A relative path is -found in the directory of the pane the #word("Look") came from, then of each -pane on the jump list, most recent first. +#pairs( + addr("notes.txt"), [opens it, or goes to the pane already showing it], + addr("notes.txt:12"), [line 12], + addr("notes.txt:/TODO/"), [the next match of `TODO`], + addr("src/"), [a pane listing it, as acme's directory window: a #word("Look") at an entry opens it, `..` goes up, `Get` reads it again (#word("DirLook") `terminal`: `ls` in a terminal there)], + addr("https://ziglang.org"), [the browser, through `xdg-open` (`open` on macOS); there is no plumber], +) + +#key("Enter") does the same from the keyboard; the other address forms are +on the cheatsheet. A relative path is found in the directory of the pane +the #word("Look") came from, then of each pane on the jump list, most +recent first. -#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. +#pairs( + [#key("/") `TODO` #key("Enter")], [a `+Search` of the lines holding `TODO`; #key("n") moves the keyboard into it and walks its rows (#key("N") back), and #key("Enter") on a row takes the searched pane there], + [#word("Find") `conf`], [a `+Search` of the files below the pane's directory with `conf` in their names], + [#word("Grep") `TODO`], [a `+Search` of the lines holding `TODO`, literally, under every pane's directory], +) +#clip("search") = Unsaved panes <unsaved-panes> -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. A pane with nothing unsaved closes at once. From the keyboard -(#key("SPC d")), #word("Del") between two panes also asks which takes its -rows: #key("k") above, #key("j") below. To quit, press #key("SPC q") or -middle-click #word("Exit") in the workspace tag; it refuses once -over unsaved panes too. +#word("Del") on a pane with unsaved text, its box filled +(#mode-box(" ", unsaved: true); a `*` in a terminal), refuses once, saying `1 unsaved pane — Del again to discard`, and lists the pane +in `+Unsaved`; #word("Del") again discards it. +#word("Exit") (or #key("SPC q")), #word("Restore") and #word("Delcol") +refuse once the same way. #key("SPC d") between two panes also asks which +takes the rows: #key("k") above, #key("j") below. = Terminals <terminals> @@ -170,40 +194,57 @@ over unsaved panes too. - #word("Filter") maps the program's colours through the theme. - #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. +- In normal mode, editing a terminal's text edits a copy, and the first + edit says so: #key("Tab") or #btn("B2") runs it, and the program's next + drawing replaces it. - A program that tracks the mouse gets #btn("B1") and the wheel; #btn("B2") and #btn("B3") stay pardes's. Hold Shift to swap. - #word("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")). +- `git log` and `man` open in a `+Pager` pane (#doc("setup", section: "pager")). = Reviewing diffs <reviewing-diffs> -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. +`git diff` run as a command, or a `.diff` or `.patch` opened, is drawn as +a diff, each hunk in its file's language. #btn("B3") on: + +#pairs( + [`diff --git`, `---`, `+++`], [the file], + [`@@ -3,7 +3,8 @@`], [the hunk's first new line], + [a 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 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. +In a pane's shell: + +``` +pardes notes.txt open it here and return at once (acme's B) +pardes --wait notes.txt return when that pane closes (acme's E) +``` + +A file not there yet opens empty, and #word("Save") creates it. +`--wait` makes pardes 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, -#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 -#word("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")). +#pairs( + [#key("w") #key("d")], [select a word, delete it: motions select, edits act on the selection], + [#key("x"), #key("v"), #key(";")], [select the line; extend; collapse to the cursor], + [#key("s")], [a cursor per regex match; every edit acts at each], + [#key("/"), #keys("n", "N")], [substring search; step through everything #word("Look") would open, across panes], + [#key("g l")], [line end], + [`12G`], [line 12; a bare #key("G") does nothing], + [#key("SPC ?")], [#word("Help"): every builtin, with its leader path and keys; `SPC w ?` only the paths under `SPC w`; #word("Tutor") (#key("SPC h t")) practises them], + [#keys("g d", "g r"), `SPC l`], [the language keys, once a server is installed (#doc("setup", section: "language-servers"))], +) + +The keys are helix's, and helix's +#link("https://docs.helix-editor.com/keymap.html")[keymap] is their full +reference. Where pardes differs (#key("Esc") leaving the pane, the +#key("SPC") paths, #key("Ctrl-w"), #key("Ctrl-b")), this guide and the +cheatsheet (#doc("cheatsheet")) say so. = Sessions <sessions> @@ -212,10 +253,10 @@ pardes --detach=work & a session with no screen of its own pardes --attach=work show it here ``` -The session owns the panes, shells and files; frontends come and go. -#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. +The session owns the panes, shells and files; frontends come and go, and +all of them see the same screen. #word("Attach") `work` (#key("SPC s a")) +switches this window to it; #word("Detach") (#key("SPC s D")) leaves it +running. = Config <config> @@ -229,6 +270,22 @@ Shell zsh ``` #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 +#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`. + += Questions <questions> + +/ Why not helix and tmux, or acme?: helix and tmux edit and run shells + well, but their text is inert. acme makes text the interface and is + modeless by design, with win for shells and page and the plumber for + documents. pardes keeps acme's text as the interface and trades the rest + for helix's modal keys, a VT terminal and PDFs in a pane. What changes + for acme users and scripts is in #doc("reference", section: "from-acme"). +/ Does it run inside tmux?: Yes, as in any terminal. Where tmux does not + pass kitty's protocols, #key("Shift-Esc") is a plain Esc and images draw + as glyph art. +/ Does my helix config carry over?: No. The keys are compiled in + (`src/config.zig`); `~/.config/helix` is not read. +/ How do I quit?: #key("SPC q"), or #word("Exit") in any tag. +/ What does "pardes" mean?: The name of the four levels of reading a text in rabbinical exegesis (#link("https://en.wikipedia.org/wiki/Pardes_(exegesis)")[Wikipedia]). |
