aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoruser <user@clank>2026-09-02 15:17:01 +0200
committeruser <user@clank>2026-09-02 15:17:01 +0200
commitbce260f8f2b63c4e99d416ba483ff7d14b4bb1de (patch)
tree50382904dcc8fb318f3852bc2ee1b3130118a816
parentweb: no em dashes on the landing page (diff)
downloadslosh-bce260f8f2b63c4e99d416ba483ff7d14b4bb1de.tar.gz
slosh-bce260f8f2b63c4e99d416ba483ff7d14b4bb1de.tar.xz
slosh-bce260f8f2b63c4e99d416ba483ff7d14b4bb1de.zip
docs: sweep the em dashes
Parentheses for the asides, colons for the explanations, commas and semicolons for the joins, (none) for the empty table cells. Same treatment the landing page got, across README, docs/, and both manpages (\(em included).
-rw-r--r--README.md2
-rw-r--r--docs/actions.md14
-rw-r--r--docs/slosh.137
-rw-r--r--docs/slosh.544
-rw-r--r--docs/windows.md32
5 files changed, 64 insertions, 65 deletions
diff --git a/README.md b/README.md
index 8bd0c5c..6dde9f8 100644
--- a/README.md
+++ b/README.md
@@ -57,7 +57,7 @@ and `pacman -Sy slosh`. Details, and the PKGBUILD for building it yourself:
Windows 10/11, x86-64 and ARM64, as one `slosh.exe` with no runtime
dependency beyond the OS. Panes are ConPTYs and sessions are AF_UNIX sockets,
-so everything below works there too — see [docs/windows.md](docs/windows.md).
+so everything below works there too; see [docs/windows.md](docs/windows.md).
Cross-compiled from a mac or a Linux box, then copied across:
diff --git a/docs/actions.md b/docs/actions.md
index 85f11a2..2b82c3e 100644
--- a/docs/actions.md
+++ b/docs/actions.md
@@ -23,8 +23,8 @@ it one.
| `float` | `f` | [float](panes.md#floating-a-pane) it, and back |
| `new-float` | `F` | a new floating shell, the throwaway terminal |
| `set-purpose` | `P` | tag it with a [purpose](layouts.md#purposes) |
-| `rename-pane` | — | rename this pane (double-click does it too) |
-| `clear-shaders` | — | clear whatever the program painted on it |
+| `rename-pane` | (none) | rename this pane (double-click does it too) |
+| `clear-shaders` | (none) | clear whatever the program painted on it |
| `pane-to-next-tab` | `>` | push it to the tab after |
| `pane-to-prev-tab` | `<` | push it to the tab before |
| `pane-to-new-tab` | `b` | break it out into a tab of its own |
@@ -58,7 +58,7 @@ it one.
| action | key | does |
| ------------------------------- | ----------- | --------------- |
| `new-tab` | `c` | new tab |
-| `rename-tab` | — | rename this tab |
+| `rename-tab` | (none) | rename this tab |
| `close-tab` | `X` | close this tab |
| `next-tab` | `Tab` | next tab |
| `prev-tab` | `shift+Tab` | previous tab |
@@ -68,8 +68,8 @@ it one.
| action | key | does |
| ------------------ | ------ | ------------------- |
-| `scroll-up` | — | up a line |
-| `scroll-down` | — | down a line |
+| `scroll-up` | (none) | up a line |
+| `scroll-down` | (none) | down a line |
| `scroll-page-up` | `PgUp` | up a page |
| `scroll-page-down` | `PgDn` | down a page |
| `scroll-top` | `Home` | to the oldest line |
@@ -95,8 +95,8 @@ it one.
## Notes
-`scroll-up` and `scroll-down` have no default key — the mouse wheel does that
-job — which is exactly the case the palette exists for. So does `clear-shaders`,
+`scroll-up` and `scroll-down` have no default key (the mouse wheel does that
+job), which is exactly the case the palette exists for. So does `clear-shaders`,
which undoes whatever the program in a pane painted on it
([shaders](shaders.md#prototyping-in-a-pane)); bind it if you leave
`in_band_shaders` on. `rename-pane` and `rename-tab` are unbound too, because a
diff --git a/docs/slosh.1 b/docs/slosh.1
index 3fb3ff1..9543b59 100644
--- a/docs/slosh.1
+++ b/docs/slosh.1
@@ -60,7 +60,7 @@ leaves the other clients attached. Both halves are configurable:
.B multi_attach
restores the old displacing attach, and
.B size_follows
-picks whose size rules \(em see
+picks whose size rules; see
.BR slosh (5).
.PP
A trailing
@@ -98,7 +98,7 @@ By default a running session re-reads it when it changes on disk, and a
file that no longer parses is reported and otherwise ignored.
.TP
.BI \-\-check\ [file]
-Read a configuration \(em or, if the file looks like one, a layout \(em
+Read a configuration (or, if the file looks like one, a layout)
the way a session would, and print everything it could not honour, one
problem per line as
.IR file:line:\ what .
@@ -129,7 +129,7 @@ Useful for seeing what a program draws without attaching anything.
.TP
.B \-\-script
The headless driver: the same compositor reading control commands from
-standard input, one per line, and answering on standard output \(em the
+standard input, one per line, and answering on standard output: the
same vocabulary the control socket speaks, without a server or a socket.
This is what the test suite drives.
.TP
@@ -160,7 +160,7 @@ or
(a socket whose server no longer answers).
.TP
.BI cmd\ line
-Send one control command \(em a JSON object \(em to the session named by
+Send one control command (a JSON object) to the session named by
.B \-s
and print the reply.
A detached session answers exactly as an attached one does.
@@ -176,9 +176,8 @@ slosh \-s work cmd '{"cmd":"panes"}'
.SH KEYS
Everything is the
.B prefix
-\(em
-.B ctrl+a
-by default \(em and then one key.
+.RB ( ctrl+a
+by default), then one key.
Pressing the prefix twice sends a literal
.B ctrl+a
to the program in the pane.
@@ -218,7 +217,7 @@ Minimise it into the strip along the bottom.
.BR f ,\ F
Float this pane above the layout, and back; a
.I new
-floating shell \(em the throwaway terminal.
+floating shell: the throwaway terminal.
.TP
.B =\ (+),\ \-
Grow / shrink a focused float about its centre
@@ -267,16 +266,16 @@ Detach, leaving the session running.
.B q
Quit the session.
.PP
-Rebinding is one line of configuration \(em
+Rebinding is one line of configuration:
.B keys { prefix "ctrl+b" }
-\(em and a
+and a
.B keys
block adds to the defaults rather than replacing them; binding a key to
.B none
takes it away.
.SH MOUSE
Clicking focuses.
-Dragging with the left button selects, and releasing copies \(em the
+Dragging with the left button selects, and releasing copies: the
selection is the copy, sent to your terminal as an OSC\ 52 clipboard
write.
A drag held past a pane's top or bottom edge scrolls the viewport under
@@ -288,7 +287,7 @@ The middle button pastes the last selection.
The wheel scrolls a pane's scrollback, or becomes arrow keys for a
full-screen program without scrollback of its own.
.PP
-A program that asks for the mouse gets it \(em clicks, wheel and all \(em
+A program that asks for the mouse gets it (clicks, wheel and all),
and holding
.B shift
selects over it, the escape hatch every terminal shares.
@@ -300,8 +299,8 @@ Every button on the frame says what it does when the pointer rests on
it.
.SH SHADERS
A pane can wear
-.I shaders
-\(em colour passes over its cells, each a pure function from (cell,
+.IR shaders :
+colour passes over its cells, each a pure function from (cell,
position, strength) to that cell's colours.
Text is never touched, only colour, so selection and copy read what was
really there.
@@ -311,8 +310,8 @@ block in the configuration runs a chain over every pane
.RB ( where=\(dqchrome\(dq
runs a pass over the frame instead), a
.B states { }
-block tints panes by what is true of them \(em dead, suspended,
-scrolled, unfocused, ringing a bell \(em and the strength of any pass
+block tints panes by what is true of them (dead, suspended,
+scrolled, unfocused, ringing a bell), and the strength of any pass
can be an arithmetic expression over the cell's position, the cursor,
focus and the clock, which is how scanlines, margins, spotlights and
breathing frames are written in a config file without compiling
@@ -338,7 +337,7 @@ A running session re-reads the file when it changes (see
.BR \-\-no\-reload ),
keeping the working configuration when the new file is broken, and
.B include
-composes files \(em a theme, a shared base \(em with the includer
+composes files (a theme, a shared base) with the includer
winning.
The format, every setting, and the layout files a session can be built
from are
@@ -352,10 +351,10 @@ Set in every pane:
.TP
.B SLOSH
.B 1
-\(em you are inside a pane.
+: you are inside a pane.
.TP
.B SLOSH_SESSION
-The name of the session this pane belongs to \(em which one of possibly
+The name of the session this pane belongs to: which one of possibly
several, the part a program cannot work out for itself.
Unset under
.BR \-\-script ,
diff --git a/docs/slosh.5 b/docs/slosh.5
index f0932af..8e282f3 100644
--- a/docs/slosh.5
+++ b/docs/slosh.5
@@ -20,7 +20,7 @@ reads two kinds of document, sharing one syntax: a
.I configuration
(settings, colours, keys, shaders) and a
.I layout
-(tabs, splits, commands \(em a session as a file).
+(tabs, splits, commands: a session as a file).
Which schema a document is held to is decided by what is in it, not by
which flag read it: a file with
.B layout
@@ -36,8 +36,8 @@ prints them all, as a file you could have written, and
reads yours back and reports every line it could not honour.
A running session re-reads the configuration when it changes on disk: a
file that no longer parses is refused whole (the running configuration
-stays), while anything smaller \(em an unknown setting, a binding that
-does not parse \(em skips that line, applies the rest, and says so.
+stays), while anything smaller (an unknown setting, a binding that
+does not parse) skips that line, applies the rest, and says so.
Three settings are read at pane creation rather than reload, because of
when they are needed:
.BR shell ,
@@ -92,7 +92,7 @@ Every included file is watched for reload.
.TP
.BR gap\ \fIn\fR ,\ gap_aspect\ \fIn\fR
Space between panes, in rows, and how many columns a row is worth
-(default 2, because a cell is about twice as tall as it is wide) \(em so
+(default 2, because a cell is about twice as tall as it is wide), so
gaps and padding come out looking square.
.TP
.BI padding\ n\ ...
@@ -144,7 +144,7 @@ The glyphs themselves, each one string.
.SH BEHAVIOUR
.TP
.BI focus_follows_mouse\ bool
-Hovering focuses \(em never at the cost of what you were doing: not
+Hovering focuses, never at the cost of what you were doing: not
during a prefix, a drag, or a modal.
.TP
.BI multi_attach\ bool
@@ -179,7 +179,7 @@ to that shell, standing in for the EOF the tty would deliver on POSIX.
On by default on Windows, which has no VEOF and so ignores the key
entirely; off elsewhere, where the line discipline already does it.
Only with the shell itself in the foreground, on the primary screen,
-and on an empty line \(em in an editor or a pager Ctrl-D is half a page
+and on an empty line; in an editor or a pager Ctrl-D is half a page
down, and a line with something on it is not an EOF.
.TP
.BI scroll_lines\ n
@@ -187,7 +187,7 @@ Rows per wheel notch.
.TP
.BR scrollback\ \fIn\fR ,\ scrollback_bytes\ \fIn\fR
Lines of history a pane keeps, and the per-pane byte ceiling that count
-runs into \(em whichever bites first wins, and 0 disables that limit.
+runs into: whichever bites first wins, and 0 disables that limit.
Applied to the next pane you open: shrinking history retroactively
would throw away output somebody is reading.
.TP
@@ -205,7 +205,7 @@ so the hand is the throttle and this is the metronome.
.TP
.BR double_click_ms\ \fIn\fR ,\ word_separators\ \fIstring\fR
How close two clicks must be to be a double, and what the word a
-double-click selects stops at \(em listed as separators, so CJK,
+double-click selects stops at, listed as separators, so CJK,
accents and emoji need no table.
Whitespace always separates.
.TP
@@ -214,13 +214,13 @@ The frame clock while a shader animates.
.TP
.BR modal_scrim\ \fIn\fR ,\ dim_unfocused\ \fIn\fR ,\ float_shadow\ \fIn\fR
How far everything behind a modal is pushed back, how far the panes you
-are not in are, and the shade a floating pane casts \(em each 0..255,
+are not in are, and the shade a floating pane casts: each 0..255,
0 for off.
.TP
.BI keep_dead\ word
Which finished panes stay on screen offering [re-run] and [close]:
.B commands
-(panes that ran a real command \(em the default),
+(panes that ran a real command, the default),
.BR all ,
or
.B none
@@ -250,8 +250,8 @@ A layout applied to projects that do not carry their own
.IR slosh.layout .
.SH THEME
.B theme { }
-names every colour the compositor draws \(em frames, titles, tabs,
-buttons, modals, toasts \(em each its own entry, 48 of them, so one can
+names every colour the compositor draws (frames, titles, tabs,
+buttons, modals, toasts), each its own entry, 48 of them, so one can
change without dragging thirty others along.
.PP
.EX
@@ -265,7 +265,7 @@ ship under
.IR PREFIX/share/slosh/themes/ .
.SH SHADERS
A shader is a colour pass over a pane's cells: foreground, background,
-attributes \(em never the text, because rewriting text would desync
+attributes, never the text, because rewriting text would desync
selection and copy.
A
.B shaders { }
@@ -292,7 +292,7 @@ the frame) and
.PP
.B amount
may be an arithmetic expression instead of a number, evaluated per
-cell \(em how effects nobody built in are written without building
+cell: how effects nobody built in are written without building
anything:
.PP
.EX
@@ -316,7 +316,7 @@ and
.BR sin / cos
taking degrees
.RB ( PI
-is 180 \(em an angle, which is what it is here).
+is 180, an angle, which is what it is here).
No loops, no recursion: a configuration cannot spin.
An expression that does not compile drops that one pass with a warning,
never the file.
@@ -324,7 +324,7 @@ never the file.
.B states { }
tints panes by what is
.I true
-of them \(em the part you cannot discover by looking:
+of them, the part you cannot discover by looking:
.PP
.EX
states {
@@ -334,7 +334,7 @@ states {
}
.EE
.PP
-The states, most urgent first \(em exactly one wins:
+The states, most urgent first (exactly one wins):
.BR dragging ,\ drop_hover ,\ drop_target ,\ dead ,\ suspended ,\ bell ,\ scrolled ,\ floating ,\ unfocused .
Naming a state replaces its default outright, including with nothing,
which is how one is turned off.
@@ -354,7 +354,7 @@ keys {
A
.B keys
block adds to the defaults rather than replacing them.
-Actions are named words \(em the same names the command palette shows,
+Actions are named words: the same names the command palette shows,
where any of them can be run without being bound at all.
Bindings in a
.B direct
@@ -363,7 +363,7 @@ program in every pane; the cheatsheet lists them apart, so its
.I prefix then:
caption stays true.
.SH LAYOUT FILES
-A session as a document \(em what
+A session as a document: what
.B slosh \-\-layout
builds,
.B dump\-layout
@@ -413,8 +413,8 @@ resolves against the file's own directory, so a checked-in layout means
the same thing from any working directory.
.TP
.B suspended=true
-Laid out but running nothing until touched, showing what it would run
-\(em so twelve checked-out projects are not twelve running dev servers.
+Laid out but running nothing until touched, showing what it would run,
+so twelve checked-out projects are not twelve running dev servers.
.TP
.BR focus=true ,\ floating=true
The pane you start in, within its tab; a pane that starts floating,
@@ -435,7 +435,7 @@ for the full search order).
.TP
.I PREFIX/share/slosh/
The annotated default configuration and an example layout, plus the
-shipped themes, chrome presets and shader presets \(em each a file to
+shipped themes, chrome presets and shader presets, each a file to
copy or
.BR include .
.SH SEE ALSO
diff --git a/docs/windows.md b/docs/windows.md
index 2f076da..f43c9c9 100644
--- a/docs/windows.md
+++ b/docs/windows.md
@@ -18,8 +18,8 @@ The binary appears at `build/win-<arch>/slosh.exe`; copy that to the Windows
machine.
For a release, `make -f Makefile.windows ARCH=<arch> dist` stages the same
-build as `dist/slosh-<version>-windows-<arch>.zip` — the binary plus the same
-licensing paperwork the linux tarballs carry — and `make release` builds both
+build as `dist/slosh-<version>-windows-<arch>.zip` (the binary plus the same
+licensing paperwork the linux tarballs carry), and `make release` builds both
architectures alongside the linux and macOS artifacts, covered by the same
`SHA256SUMS`.
@@ -27,7 +27,7 @@ architectures alongside the linux and macOS artifacts, covered by the same
Everything the POSIX build does: panes, splits, tabs, detachable sessions, the
config file and its live reload, the control socket, the mouse. Panes run
-`cmd.exe` by default — `%ComSpec%` if you have pointed it elsewhere, and
+`cmd.exe` by default; `%ComSpec%` if you have pointed it elsewhere, and
`shell` in the config file wins over both. `slosh ls`, `slosh -s NAME cmd ...`
and `slosh --script` behave as documented.
@@ -49,8 +49,8 @@ Three decisions carry most of it.
inotify descriptor and a unix socket are all file descriptors, so one `poll()`
covers them. Windows has no such union: a ConPTY hands back pipe `HANDLE`s and
`WSAPoll` waits on `SOCKET`s and nothing else. Rather than rewrite the loop
-around `WaitForMultipleObjects` — which caps at 64 objects and cannot express
-`POLLOUT` — each non-socket source gets a pump thread that copies it into one
+around `WaitForMultipleObjects` (which caps at 64 objects and cannot express
+`POLLOUT`), each non-socket source gets a pump thread that copies it into one
end of a loopback socketpair. `server.c`'s loop is then byte-for-byte the
POSIX one, and only what sits behind the descriptor differs. The config watcher
(`ReadDirectoryChangesW`) and the client's console input reach the loop the
@@ -64,7 +64,7 @@ untagged descriptor escaping into the loop is the one failure mode this scheme
has, and it is worth closing completely.
**A pane is a ConPTY.** `src/pty_win.c` implements the same three functions as
-`src/pty.c` — spawn, resize, close — on `CreatePseudoConsole`, with the pty's
+`src/pty.c` (spawn, resize, close) on `CreatePseudoConsole`, with the pty's
`fd` being the pollable end of its pump pair and its `pid` a real Windows
process id, so the existing kill and wait paths work unchanged.
@@ -74,8 +74,8 @@ Two details are worth knowing, because both are invisible until they bite.
attached to one is *supposed* to take its stdio from that console, but
`CreateProcess` copies the parent's standard handles into the child when
`STARTF_USESTDHANDLES` is absent, and those win. With slosh's own stdout
-redirected — a pipe under ssh, a file under `--script`, a log under the daemon
-— the shell wrote its banner into slosh's output instead of into the pane. The
+redirected (a pipe under ssh, a file under `--script`, a log under the
+daemon), the shell wrote its banner into slosh's output instead of into the pane. The
symptom was a pane with a correct *title* and an empty *body*, because ConPTY
emits the title itself. `pty_win.c` clears the three standard handles for the
duration of the `CreateProcess` call, leaving the child nothing to inherit.
@@ -87,19 +87,19 @@ learns its program is gone. A ConPTY gives no such signal: the output pipe
belongs to the *pseudoconsole*, not to the child, so it stays open after the
child exits and the read never ends. A pane whose shell had been told `exit`
sat there looking alive forever. So the exit is waited for explicitly, on the
-process handle, and `ClosePseudoConsole` is what then produces the EOF — the
+process handle, and `ClosePseudoConsole` is what then produces the EOF: the
console flushes what the child left behind and closes its end, and the output
pump sees the end of the stream exactly as it would on a pty.
**There are two quoting conventions, and cmd.exe uses the other one.** Windows
passes a command *string*, not a vector, so the quoting rules belong to whoever
-parses it at the far end — and there are two sets. Ordinary programs are parsed
+parses it at the far end, and there are two sets. Ordinary programs are parsed
by `CommandLineToArgvW`, where a literal quote is written `\"`. `cmd.exe` is
not: it has its own rules, in which `\"` is a backslash followed by the end of
a quoted section. Applying the first set to the second turned
`cmd /c notepad "C:\...\config.kdl"` into an editor being handed
`\"C:\...\config.kdl\"`, backslashes and all. So `cmd /c` is given the rest of
-the line verbatim — the caller composed a complete command with its own
+the line verbatim: the caller composed a complete command with its own
quoting, exactly as it composes one for `sh -c`, and cmd.exe is the thing that
should parse it. Everything else is still quoted for `CommandLineToArgvW`.
@@ -108,7 +108,7 @@ throughout, because that is what it splits and compares on. The environment
supplies `\`, so the moment a literal is joined to a variable the result is
mixed: `$HOME` is `C:\Users\you`, and the config lands at
`C:\Users\you/.config/slosh/config.kdl`. The CRT opens that without complaint,
-which is why `--check` reported it as fine — but a GUI file dialog rejects it
+which is why `--check` reported it as fine, but a GUI file dialog rejects it
outright, and `C-a e` produced a notepad saying "Not a valid file name" about a
path that unambiguously existed. Anything handed to another program now goes
through `sl_path_native()` first, which canonicalises it and settles the
@@ -116,7 +116,7 @@ separators; the internal representation is left alone.
The reference counting is also why the per-pty state is not simply freed by
`pty_close`: two pumps, a exit watcher and the caller all reach
-it, and a pump blocked on a dead pipe must not be waited for — that would hang
+it, and a pump blocked on a dead pipe must not be waited for: that would hang
the session on the one program that misbehaves. Whoever finishes last frees.
## What is different
@@ -128,7 +128,7 @@ the session on the one program that misbehaves. Whoever finishes last frees.
reconstructs its arguments on the command line (`--server`), rather than as a
copy of the process that asked for it.
- **No process groups on a pty**, so "what is this pane running" is answered
- with the most recently started descendant of the pane's shell — the process
+ with the most recently started descendant of the pane's shell: the process
`tcgetpgrp()` would have named. Windows offers the image name rather than a
full argv without reading another process's memory, so pane titles are
correspondingly shorter.
@@ -136,7 +136,7 @@ the session on the one program that misbehaves. Whoever finishes last frees.
no EOF character: `^D` reaches cmd.exe and PowerShell as an ordinary
keystroke and they ignore it, so the key that closes a pane on every other
platform does nothing at all. `ctrl_d_exits` (on by default here, off
- elsewhere) sends the shell the word `exit` instead — which is what you would
+ elsewhere) sends the shell the word `exit` instead, which is what you would
have typed, and what makes the pane end through the shell's own cleanup and
exit status rather than by being closed from outside. It stays out of the
way unless all three hold: the shell itself in the foreground, the primary
@@ -144,7 +144,7 @@ the session on the one program that misbehaves. Whoever finishes last frees.
itself; in an editor or a pager `^D` is half a page down; and a line with
something on it is not an EOF anywhere.
- **No editor is guaranteed.** `C-a e` prefers whichever console editor is
- actually installed — `nvim`, `vim`, `vi`, `nano`, `micro`, `hx`, `edit` —
+ actually installed (`nvim`, `vim`, `vi`, `nano`, `micro`, `hx`, `edit`),
because `notepad` is a GUI program: a pane running it draws nothing and looks
broken. Microsoft Edit (`edit`) ships from Windows 11 24H2 and fills a pane
like any other editor; it comes last because it arrives on its own, and so