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
|
Pardes control filesystem
=========================
README this guide
index one line per pane: serial, kind (text|term|pdf|image), dirty flag, name (+New if unnamed)
status pid, version and pane count
look write a line: a right click on it at the active pane; read: the serials it touched
exec write a line: a middle click, an editor command word or a shell line; read the same
log events: new/del/rename/save <serial> <name>, msg <serial|-> <text>, err <serial|-> <why>
screen rendered screen as JSON, frozen from open to close
listeners the session's dial addresses
focus the serial of the pane with the keyboard; write a serial to give it the keyboard
ctl settings, one a line as a write takes them; or Newcol, Dump, Exit (quits), Kill (stops cmds)
commands every builtin: its word, arg if it takes one, and root or pane: which ctl takes it
pane/new open it to make a pane (named +New); the read answers that pane's serial
pane/<n>/ name body tag ctl addr dot limit data xdata sel dirty mark scroll errors (write-only:
appended to its directory's +Errors pane) event look exec, pty/ on terminals; rmdir closes
os/, src/ the host filesystem; the editor's own sources (-Dembed-sources=true builds only)
Below, $m is the mount (/mnt/9p/pardes/<pid> via 9ns --mntgen; PARDES_MOUNT in a Tty9p shell):
cat $m/index which panes exist
n=$(cat $m/pane/new) make a pane, take its serial
echo /etc/hosts:3 > $m/look; cat $m/look open a file, see the pane it went to
printf 'text\n' >> $m/pane/$n/body append to a pane (> replaces it all)
echo notes.txt > $m/pane/$n/name; echo Save > $m/pane/$n/ctl rename, then save it
echo 'Msg hello' > $m/exec show text in the editor
echo '/^fn/' > $m/pane/$n/addr; printf NEW > $m/pane/$n/data replace what addr matched
cp $m/pane/$n/addr $m/pane/$n/dot; cat $m/pane/$n/sel select the range, read it
exec 3<>$m/log; echo follow >&3; cat <&3 what happened lately, then wait for more
cat $m/pane/$n/event hold it open to own that pane's clicks
echo Tty > $m/pane/$n/ctl; cat $m/index a terminal in that pane's directory
exec 3<>$m/pane/$n/pty/run; echo make >&3; cat <&3 exit N then its output; or busy, or error
printf 'ls\r' > $m/pane/$n/pty/data type into a terminal; pty/status: cols rows busy
echo 'sig INT' > $m/pane/$n/pty/ctl interrupt it; also winsize C R, and exec to restart
Pitfalls, one each:
Each open of pane/new makes another pane (ls, stat, find never do); rmdir closes even a dirty one.
addr takes #n,#m or sam-style /regexp/ (^ $ per line); a failed one makes data refuse until reset.
data: > replaces the addr range, : > deletes it, a 2nd > inserts (addr moved); body: > empties all.
tag reads the path, then the tag's own text; writes append to that text; truncating clears it.
A terminal's body is a history snapshot frozen per open; pty/data is the live stream.
exec: a word no builtin knows is typed into a terminal in the pane's directory, and not an error.
A refused write reads as EINVAL through a mount: the log's err record says why.
lock/unlock on a pane's ctl need a held fd (exec 3>ctl); a lock someone holds fails: retry.
Closing a column's last pane leaves a +New in its place; Delcol closes the column.
|