1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
# slosh
A terminal multiplexer — panes, tabs, sessions you can detach from — written in
C on top of [libghostty-vt](https://github.com/ghostty-org/ghostty).
```
╭────────── nvim ─────────── ▬ □ ✕ ╮ ╭─────── npm run dev ─────── ▬ □ ✕ ╮
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ ╰──────────────────────────────────╯
│ │
│ │ ╭────────── shell ────────── ▬ □ ✕ ╮
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
╰──────────────────────────────────╯ ╰──────────────────────────────────╯
```
## Install
With [Homebrew](https://brew.sh) (macOS or Linux):
```bash
brew tap sl0p/slosh https://git.sl0p.foo/homebrew-slosh.git
brew install slosh
```
From source it needs [zig](https://ziglang.org) 0.16 and nothing else. The
result is one static binary.
```bash
make vendor # the vendored terminal core, once
make # about a second
sudo make install # optional: /usr/local/bin/slosh
# make install PREFIX=$HOME/.local # ...or somewhere you own
```
## Run
```bash
slosh # attach to session "main", creating it if needed
slosh -s work # a named session
slosh ls # what is running
```
Sessions survive detaching, and your ssh connection dying. Then `C-a \` to
split, `C-a ?` for the keys, `C-a p` for every command by name.
## Docs
**[docs/](docs/index.md)** — [keys](docs/keys.md) ·
[panes](docs/panes.md) · [configuration](docs/config.md) ·
[shaders](docs/shaders.md) · [chrome](docs/chrome.md) ·
[layouts](docs/layouts.md) · [scripting](docs/scripting.md) ·
[how it works](docs/design.md)
`make docs` renders the same pages as a static site into `build/docs` — no
dependencies, one file of Python and one stylesheet.
## What is different about it
- **The mouse works properly.** Click the middle of a border to split toward it,
drag a gap to move a boundary, drag a pane by its title to swap it. Everything
drawn registers what it is as it is drawn, so a click and a preview cannot
disagree — which is also how the split target can be *part* of an edge without
the highlight and the hit ever drifting apart.
- **The layout is recomputed, never stored.** Small terminal? The tab becomes a
list of headers, and comes back to exactly the arrangement you had.
- **A pane told to run something keeps its output when that thing exits**, with
`[re-run]` and `[close]` in its frame.
- **Configuration is one KDL file** that reloads on save, can be built from
`include`d pieces, and refuses a broken file instead of half-applying it.
- **Colour passes over cells** — dim, tint, rulers, spotlights, and a border that
can flash when a pane rings, with strengths written as expressions.
- **Scriptable to the same depth it is usable**: one JSON object per line over
the session's socket, and a pane can draw its own status bar and buttons with
an escape sequence.
Design notes and the twenty-one decisions behind it: [DESIGN.md](DESIGN.md).
|