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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
# The transient message row: the LAST row of a pane, left-aligned at the text
# area's origin, saying what just happened to that pane and when. An OVERLAY,
# not geometry — nothing shrinks to make room, so a pane with nothing to say is
# not touched at all, which is why the other 71 goldens only moved where a
# prompt or a message actually appears.
#
# The clock reads `--:--:--` here and only here: $PARDES_NOTIME (set by
# snapshot.zig, the same flag that hides the language backend's durations)
# blanks the DIGITS rather than the row, because a message that disappeared
# under the harness could not be pinned at all.
#
# The row has exactly two possible occupants and they are not the same kind of
# thing. A MESSAGE is a report of something that already happened, and the next
# key or mouse event wipes it. An armed PROMPT is what that keystroke is being
# typed INTO, it lives until Enter or Esc, and it WINS.
lines a.txt 6
start 15 70 a.txt
wait 8000 Newcol Joincol
wait 8000 a.txt
stable 700 20000
snap opened
# Save (SPC f s) writes the file; the SHELL is where the write and the clock
# both are, so the shell is what posts the message once the bytes are down.
key space f s
stable 700 15000
snap saved
# A REPAINT is not input. A resize redraws every cell in the window from
# scratch and the message is still there on the other side of it — the row is
# state, not one frame's flash. (Different rows, or the kernel sends no
# SIGWINCH and nothing repaints.)
resize 17 70
stable 700 15000
snap repainted
# ...but the next KEY takes it away. `j` is a plain cursor motion and changes
# nothing else on screen, so the vanishing message is the whole diff.
key j
stable 700 15000
snap keycleared
# Again, and this time a bare mouse MOTION — no button, nothing clicked —
# clears it: any mouse event counts, the rule is "you are back", not "you did
# something".
key space f s
stable 700 15000
snap saved-again
motion 20 6
stable 700 15000
snap mousecleared
# The other message: an external write lands in the pane (filewatch.snap owns
# that contract) and the row says which of the two things happened. `run` is a
# child of the RUNNER, so the app receives no keystroke here and nothing but
# the watch could have posted this.
run printf 'EXTERNAL\n' > a.txt
wait 10000 EXTERNAL
stable 700 15000
snap reloaded
# `/` still types into the tag tail — same buffer, same offsets, same one-line
# editor, same Enter and Esc — but it is DRAWN here now, so the tagline keeps
# its builtins instead of losing them to a long pattern. Note the tag row above
# ends at `Del`: the marker and the pattern are no longer on it at all. (The
# `/` keystroke also cleared the reload message, which is the rule above.)
key /
text EXT
stable 700 15000
snap prompt
# ...and a message arriving UNDER an armed prompt does not disturb it: a second
# external write reloads the pane and posts one, the row stays the prompt's.
run printf 'AGAIN\n' > a.txt
wait 10000 AGAIN
stable 700 15000
snap prompt-wins
# Esc abandons the input, and the very key that abandoned it is also the key
# that clears the message queued underneath — so the row goes empty rather than
# handing back a report from before you started typing.
key esc
settle 100
stable 700 15000
snap esc
# Every other writer of this row is something going WRONG, which is a poor way
# to look at a row: `Msg <text>` is the word that writes it on purpose. An
# ordinary builtin, so it runs the ordinary way — write it in the buffer,
# select the line, execute it — and what lands is the text, verbatim, with the
# same stamped-looking left edge as the reports above. (The clock belongs to
# the SHELL, which is why this one has none: the core has no clock.)
key o
text Msg hand-written report
key esc
settle 100
key x
key tab
stable 700 15000
snap msgbuiltin
# A message wider than the pane keeps its TAIL, not its head: the end of a
# message is the part that says something -- a path's file name, an error's
# reason -- so the head is what a narrow pane goes without.
key j
key o
text Msg 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 THE-END
key esc
settle 100
key x
key tab
stable 700 15000
snap msgtail
|