summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/snapshots/lspcomplete.golden2
-rw-r--r--test/snapshots/lspcomplete.snap49
-rw-r--r--test/snapshots/lspcompletemoved.golden36
-rw-r--r--test/snapshots/lspcompletemoved.snap33
-rw-r--r--test/snapshots/nested-optout.golden93
-rw-r--r--test/snapshots/nested-optout.snap52
-rw-r--r--test/snapshots/tagalign2col.golden93
-rw-r--r--test/snapshots/tagalign2col.snap45
-rw-r--r--test/snapshots/tagbottom.golden93
-rw-r--r--test/snapshots/tagbottom.snap14
-rw-r--r--test/snapshots/tagbottomimage.golden155
-rw-r--r--test/snapshots/tagbottomimage.snap52
12 files changed, 574 insertions, 143 deletions
diff --git a/test/snapshots/lspcomplete.golden b/test/snapshots/lspcomplete.golden
index 5c92b71a..51c11c66 100644
--- a/test/snapshots/lspcomplete.golden
+++ b/test/snapshots/lspcomplete.golden
@@ -203,7 +203,7 @@
| /tmp/pardes-snap/lspcomplete/cwd/+Search New Del
| 1 /tmp/pardes-snap/lspcomplete/cwd/a.zig:2:5-13 verdigris,
| 2 /tmp/pardes-snap/lspcomplete/cwd/a.zig:3:5-12 cinnabar,
-== snap twentytabs grid=120x40 cursor=16,9
+== snap refill grid=120x40 cursor=16,9
|New Newcol Find Grep Help Tutor Dump NextColor Debug Kill
|^ /tmp/pardes-snap/lspcomplete/cwd/a.zig Save New Del
| 1 const Shade = enum {
diff --git a/test/snapshots/lspcomplete.snap b/test/snapshots/lspcomplete.snap
index 7393b209..8b7854cd 100644
--- a/test/snapshots/lspcomplete.snap
+++ b/test/snapshots/lspcomplete.snap
@@ -66,52 +66,21 @@ key tab
wait 15000 a.zig:2:
stable 700 15000
snap completion
-# Nineteen more Tabs. Every one of them answers, and every answer REFILLS the
-# one `+Search` rather than opening its twin: before that fix six presses left
-# six byte-identical panes, twenty left fifteen with the file crushed to a
-# single visible line, and from the sixteenth on freeSlot returned null and the
-# keystroke was eaten for the rest of the session with nothing said. The golden
-# below is the assertion — one file pane, one results pane, same as after the
-# first press.
-key tab
-settle 150
-key tab
-settle 150
-key tab
-settle 150
-key tab
-settle 150
-key tab
-settle 150
-key tab
-settle 150
-key tab
-settle 150
-key tab
-settle 150
-key tab
-settle 150
-key tab
-settle 150
-key tab
-settle 150
-key tab
-settle 150
-key tab
-settle 150
-key tab
-settle 150
-key tab
-settle 150
-key tab
-settle 150
+# Two more Tabs. Every one of them answers, and every answer REFILLS the one
+# `+Search` rather than opening its twin. The SECOND press is already the whole
+# assertion: without the refill it leaves a second byte-identical `+Search` and
+# this golden diverges. What TWENTY do is only worse in degree — fifteen
+# stacked panes, the file crushed to one visible line, and from the sixteenth
+# on freeSlot returns null and the keystroke is eaten for the rest of the
+# session — and that story lives in docs/lsp.md rather than in three seconds of
+# every suite run. One file pane, one results pane, same as after the first.
key tab
settle 150
key tab
settle 150
key tab
stable 700 20000
-snap twentytabs
+snap refill
# The pane is still in insert mode, which is right — the query answered beside
# the cursor and typing goes on — so walking the answer means leaving it first,
# the same as for any other results buffer.
diff --git a/test/snapshots/lspcompletemoved.golden b/test/snapshots/lspcompletemoved.golden
new file mode 100644
index 00000000..bd23bfcd
--- /dev/null
+++ b/test/snapshots/lspcompletemoved.golden
@@ -0,0 +1,36 @@
+== snap typedthrough grid=120x20 cursor=16,13
+|New Newcol Find Grep Help Tutor Dump NextColor Debug Kill
+|^ /tmp/pardes-snap/lspcompletemoved/cwd/a.zig Save New Del
+| 1 const Shade = enum {
+| 2 verdigris,
+| 3 cinnabar,
+| 4 };
+| 5
+| 6 fn pick(s: Shade) u8 {
+| 7 return switch (s) {
+| 8
+| 9 };
+| 10 }
+| 11
+| 12 // note.x see below
+| 13
+|
+|
+|
+|
+|
+== file buffer
+const Shade = enum {
+ verdigris,
+ cinnabar,
+};
+
+fn pick(s: Shade) u8 {
+ return switch (s) {
+
+ };
+}
+
+// note.x see below
+
+== end file
diff --git a/test/snapshots/lspcompletemoved.snap b/test/snapshots/lspcompletemoved.snap
new file mode 100644
index 00000000..5f20b806
--- /dev/null
+++ b/test/snapshots/lspcompletemoved.snap
@@ -0,0 +1,33 @@
+# The guard that makes "an empty answer indents" safe to have at all.
+#
+# lspcomplete.snap pins the indent itself: Tab after a dot the backend cannot
+# answer diverts, the answer comes back empty, and four spaces go in LATE so
+# the keystroke is not eaten. That late write is the dangerous half — it lands
+# a few hundred milliseconds after the key, by which time the hands have moved
+# on — so lspResponse only performs it if nothing has: same pane, still insert,
+# one cursor, cursor still on the cell the Tab was pressed at. Nothing covered
+# the condition, only its happy side.
+#
+# Same file and same click as lspcomplete's `commentindent` arm — line 12 is a
+# comment, so no candidate can exist and the answer is certainly empty — but
+# here an `x` is typed straight after the Tab, in the same write, long before a
+# ZLS analysis can finish. The buffer below is the assertion: `// note.x`, with
+# neither `// note. x` (the indent landing under the typing) nor
+# `// note.x ` (the indent landing on top of it).
+file a.zig const Shade = enum {\n verdigris,\n cinnabar,\n};\n\nfn pick(s: Shade) u8 {\n return switch (s) {\n \n };\n}\n\n// note. see below\n
+start 20 120 a.zig
+wait 8000 verdigris
+stable 700 20000
+press left 16 14
+release left 16 14
+stable 400 5000
+key i
+key tab
+text x
+stable 700 20000
+snap typedthrough
+key esc
+settle 100
+key space f s
+stable 700 15000
+snapfile buffer /tmp/pardes-snap/lspcompletemoved/cwd/a.zig
diff --git a/test/snapshots/nested-optout.golden b/test/snapshots/nested-optout.golden
new file mode 100644
index 00000000..7fc443df
--- /dev/null
+++ b/test/snapshots/nested-optout.golden
@@ -0,0 +1,93 @@
+== snap optout-file grid=100x30 cursor=9,4
+|New Newcol Find Grep Help Tutor Dump NextColor Debug Kill
+|$ /tmp/pardes-snap/nested-optout/cwd New Del
+| New Newcol Find Grep Help Tutor Dump NextColor Debug Kill
+| /tmp/pardes-snap/nested-optout/cwd/nested.txt Save New Del
+| 1 optout-marker
+| 2 second-optout-line
+| 3
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+== snap inner-shell grid=100x30 cursor=6,4
+|New Newcol Find Grep Help Tutor Dump NextColor Debug Kill
+|$ /tmp/pardes-snap/nested-optout/cwd New Del
+| New Newcol Find Grep Help Tutor Dump NextColor Debug Kill
+| $ /tmp/pardes-snap/nested-optout/cwd/innerdir New Del
+| $
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+== snap inner-launch grid=100x30 cursor=11,6
+|New Newcol Find Grep Help Tutor Dump NextColor Debug Kill
+|$ /tmp/pardes-snap/nested-optout/cwd New Del
+| New Newcol Find Grep Help Tutor Dump NextColor Debug Kill
+| $ /tmp/pardes-snap/nested-optout/cwd/innerdir New Del
+| New Newcol Find Grep Help Tutor Dump NextColor Debug Kill
+| /tmp/pardes-snap/nested-optout/cwd/innerdir/deeper.txt Save New Del
+| 1 deepest-marker
+| 2
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
diff --git a/test/snapshots/nested-optout.snap b/test/snapshots/nested-optout.snap
new file mode 100644
index 00000000..27e1ba3d
--- /dev/null
+++ b/test/snapshots/nested-optout.snap
@@ -0,0 +1,52 @@
+# `--nested` is the documented escape hatch out of the hand-the-file-outward
+# mechanism, and nested.snap covers only the mechanism. The flag says two
+# things at once and both are asserted here: an instance carrying it keeps its
+# own argument instead of forwarding it, AND it is not an outer instance for
+# anything launched inside IT (tty.zig binds no socket when opts.nested).
+#
+# The same trick nested.snap uses to get a genuine descendant: a pane shell's
+# parent IS the app under test, so `$(readlink /proc/$PPID/exe)` in a pane is
+# this exact binary. What discriminates is the GRID — a second topbar drawn
+# INSIDE the pane, with the outer instance still one shell wide.
+#
+# Long waits on purpose: each arm forks and execs whole further pardes.
+file nested.txt optout-marker\nsecond-optout-line\n
+dirmk innerdir
+file innerdir/deeper.txt deepest-marker\n
+# --- a file argument, WITH the flag: the inner keeps it ---
+# Without --nested this is nested.snap's first arm and the outer grows a
+# file pane beside the shell. Here the outer's layout never changes: one
+# shell, and a whole second pardes drawn inside it holding nested.txt.
+start 30 100
+wait 8000 $
+stable 700 20000
+text $(readlink /proc/$PPID/exe) --nested nested.txt
+key enter
+wait 20000 optout-marker
+stable 700 20000
+snap optout-file
+# --- ...and it is not an outer instance either ---
+# The subshell is what makes the wait unambiguous: the inner boots in
+# `innerdir` while the outer pane's own shell stays in cwd, so `cwd/innerdir`
+# on the grid can only be the inner instance's tagline. --nested with no
+# argument is still a bare launch, so the inner comes up in tty mode and
+# keystrokes travel through both layers to its shell.
+start 30 100
+wait 8000 $
+stable 700 20000
+text (cd innerdir && $(readlink /proc/$PPID/exe) --nested)
+key enter
+wait 20000 cwd/innerdir
+stable 700 20000
+snap inner-shell
+# A third pardes, launched from inside the inner one. Its nearest pardes
+# ancestor is the INNER instance, which bound no socket, so the send fails and
+# it opens its own session where it stands — three topbars. The assertion is
+# the row it did NOT appear on: the outer instance is still one shell pane, and
+# a walk that had skipped past the opted-out instance would have put
+# deeper.txt up there beside it.
+text $(readlink /proc/$PPID/exe) deeper.txt
+key enter
+wait 20000 deepest-marker
+stable 700 20000
+snap inner-launch
diff --git a/test/snapshots/tagalign2col.golden b/test/snapshots/tagalign2col.golden
new file mode 100644
index 00000000..d5d22935
--- /dev/null
+++ b/test/snapshots/tagalign2col.golden
@@ -0,0 +1,93 @@
+== snap onecol grid=160x30 cursor=7,2
+|New Newcol Find Grep Help Tutor Dump NextColor Debug Kill
+| /tmp/pardes-snap/tagalign2col/cwd/deep/proj/document.txt Save New Del /tmp/pardes-snap/tagalign2col/cwd New Del
+| 1 alpha
+| 2 beta deep
+| 3 gamma
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+== snap aligned grid=160x30 cursor=4,19
+|New Newcol Find Grep Help Tutor Dump NextColor Debug Kill
+| /tmp/pardes-snap/tagalign2col/cwd/deep/proj/document.txt Save New Del /tmp/pardes-snap/tagalign2col/cwd New Del
+| 1 alpha
+| 2 beta deep
+| 3 gamma
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+| /tmp/pardes-snap/tagalign2col/cwd New Del
+|
+| deep
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+== snap widened grid=160x30 cursor=4,19
+|New Newcol Find Grep Help Tutor Dump NextColor Debug Kill
+| /tmp/pardes-snap/tagalign2col/cwd/deep/proj/document.txt Save New Del ╎ /tmp/pardes-snap/tagalign2col/cwd New Del
+| 1 alpha ╎
+| 2 beta ╎ deep
+| 3 gamma ╎
+| ╎
+| ╎
+| ╎
+| ╎
+| ╎
+| ╎
+| ╎
+| ╎
+| ╎
+| ╎
+| ╎
+| /tmp/pardes-snap/tagalign2col/cwd New Del ╎
+| ╎
+| deep ╎
+| ╎
+| ╎
+| ╎
+| ╎
+| ╎
+| ╎
+| ╎
+| ╎
+| ╎
+| ╎
+| ╎
diff --git a/test/snapshots/tagalign2col.snap b/test/snapshots/tagalign2col.snap
new file mode 100644
index 00000000..02add6fd
--- /dev/null
+++ b/test/snapshots/tagalign2col.snap
@@ -0,0 +1,45 @@
+# The shared tail-end is scoped to a LAYOUT COLUMN. tagalign.snap proves the
+# sharing but only ever has one column, so nothing there would notice a vote
+# that leaked sideways: every pane in the window would still line up, and the
+# feature would look like it worked right up until you opened a second column.
+#
+# Here the long path is in the LEFT column (that is which side it lands on:
+# `SPC c n` puts the NEW column on the right, so the boot file keeps the left)
+# and the right column is a plain shell. Both columns are 80 wide, so both
+# would end their words at tag_right_pad — 58 columns in — if nothing pushed.
+dirmk deep
+dirmk deep/proj
+file deep/proj/document.txt alpha\nbeta\ngamma
+start 30 160 deep/proj/document.txt
+wait 8000 New Newcol
+wait 8000 document.txt
+stable 700 20000
+# `SPC c n`: a shell in a column of its own on the right. Two columns, one pane
+# each. The file's own tag is 69 columns and so pushes past its column's pad;
+# the shell on the right sits AT its pad, 58 in. Read the two ends off this
+# snap — they are what the next one must not disturb.
+key space c n
+stable 700 15000
+key space w h
+stable 400 5000
+snap onecol
+# Alt-n: a second pane in the LEFT column. It is 41 columns of tag and would
+# right-align at 58 on its own; the file above it drags it out to 69 instead.
+# THE ASSERTION: the right column's `New Del` has not moved a cell — same
+# absolute column as in `onecol`, still at its own pad — while the left
+# column's two rows now agree with each other at 69.
+key a-n
+stable 700 15000
+snap aligned
+# ...and the ends are computed per column, not once for the window. Drag the
+# vertical border 20 columns right: the left column grows to 100 (tw-pad 78 is
+# now past the file's 69, so its pad binds again and both left rows move OUT to
+# 78) and the right column shrinks to 60 (tw-pad 38 is now short of the shell's
+# own 41, so its words fall back hard against the path at 41). Two different
+# rules firing in the same frame, one per column — a single window-wide end
+# could not produce this grid at all.
+press left 80 10
+drag left 100 10
+release left 100 10
+stable 700 15000
+snap widened
diff --git a/test/snapshots/tagbottom.golden b/test/snapshots/tagbottom.golden
index cc402fd1..27c6d42a 100644
--- a/test/snapshots/tagbottom.golden
+++ b/test/snapshots/tagbottom.golden
@@ -246,68 +246,6 @@
|
|
| /tmp/pardes-snap/tagbottom/cwd/bottom.txt Save New Del
-== snap wheel-body grid=100x30 cursor=9,1
-|New Newcol Find Grep Help Tutor Dump NextColor Debug Kill
-| 5 eee
-| 6 fff
-| 7 ggg
-| 8 hhh
-| 9 iii
-| 10 jjj
-| 11 kkk
-| 12 lll
-| 13 mmm
-| /tmp/pardes-snap/tagbottom/cwd/top.txt bottom.txt Save New Del
-| 1 ZZONE
-| 2 ZZTWO
-|
-|
-|
-|
-|
-|
-|
-|
-|
-|
-|
-|
-|
-|
-|
-|
-| /tmp/pardes-snap/tagbottom/cwd/bottom.txt Save New Del
-== snap wheel-gutter grid=100x30 cursor=9,2
-|New Newcol Find Grep Help Tutor Dump NextColor Debug Kill
-| 4 ddd
-| 5 eee
-| 6 fff
-| 7 ggg
-| 8 hhh
-| 9 iii
-| 10 jjj
-| 11 kkk
-| 12 lll
-| /tmp/pardes-snap/tagbottom/cwd/top.txt bottom.txt Save New Del
-| 1 ZZONE
-| 2 ZZTWO
-|
-|
-|
-|
-|
-|
-|
-|
-|
-|
-|
-|
-|
-|
-|
-|
-| /tmp/pardes-snap/tagbottom/cwd/bottom.txt Save New Del
== snap gutter-click grid=100x30 cursor=9,4
|New Newcol Find Grep Help Tutor Dump NextColor Debug Kill
| 2 bbb
@@ -401,37 +339,6 @@
|
|
| /tmp/pardes-snap/tagbottom/cwd/bottom.txt Save New Del
-== style sweep-down
-|0: 0-56 #949494,#121212, 57-99 d,#121212,
-|1: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-9 #bdbdbd,#080808, 10-99 d,#080808,
-|2: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-9 #bdbdbd,#080808, 10-99 d,#080808,
-|3: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-7 #080808,#9399f9, 8-9 #bdbdbd,#080808, 10-99 d,#080808,
-|4: 0-0 d,#121212, 1-1 d,#080808, 2-6 #949494,#121212, 7-7 #080808,#9399f9, 8-9 #bdbdbd,#080808, 10-99 d,#080808,
-|5: 0-0 d,#121212, 1-1 d,#080808, 2-6 #626262,#080808, 7-7 #080808,#9399f9, 8-9 #bdbdbd,#080808, 10-99 d,#080808,
-|6: 0-0 d,#121212, 1-1 d,#080808, 2-6 #626262,#080808, 7-7 #080808,#9399f9, 8-9 #bdbdbd,#080808, 10-99 d,#080808,
-|7: 0-0 d,#121212, 1-1 d,#080808, 2-6 #626262,#080808, 7-7 #080808,#9399f9, 8-9 #bdbdbd,#080808, 10-99 d,#080808,
-|8: 0-0 d,#121212, 1-1 d,#080808, 2-6 #626262,#080808, 7-7 #080808,#9399f9, 8-9 #bdbdbd,#080808, 10-99 d,#080808,
-|9: 0-0 d,#121212, 1-1 d,#080808, 2-6 #626262,#080808, 7-7 #080808,#9399f9, 8-9 #bdbdbd,#080808, 10-99 d,#080808,
-|10: 0-1 #ffffff,#626262, 2-90 #949494,#121212, 91-99 d,#121212,
-|11: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-11 #bdbdbd,#080808, 12-99 d,#080808,
-|12: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-11 #bdbdbd,#080808, 12-99 d,#080808,
-|13: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
-|14: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
-|15: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
-|16: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
-|17: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
-|18: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
-|19: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
-|20: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
-|21: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
-|22: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
-|23: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
-|24: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
-|25: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
-|26: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
-|27: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
-|28: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
-|29: 0-1 #ffffff,#262626, 2-79 #949494,#121212, 80-99 d,#121212,
== snap cut-down grid=100x30 cursor=7,4
|New Newcol Find Grep Help Tutor Dump NextColor Debug Kill
| 1 aaa
diff --git a/test/snapshots/tagbottom.snap b/test/snapshots/tagbottom.snap
index 801df1a8..389e0c36 100644
--- a/test/snapshots/tagbottom.snap
+++ b/test/snapshots/tagbottom.snap
@@ -76,20 +76,17 @@ release left 40 12
motion 40 25
stable 500 8000
snap seam-dragged
-# the wheel over the BODY of the upper pane (nine body rows now): four rows
-# down, so the view starts at line 5 and the pinned cursor rides up to the
-# pane's first row
+# Scroll the upper pane's body down four rows and back up one, so the gutter
+# click below has a scrolled view to count from. Not captured: the wheel arm of
+# handleMouse is `hovered` plus scrollBy and contains no tag_bottom at all, and
+# the body rendering under it is already pinned by `boot`, `on` and
+# `body-cursor`. View ends at line 4.
wheel down 40 4
wheel down 40 4
wheel down 40 4
wheel down 40 4
-stable 400 8000
-snap wheel-body
-# ...and one row back up with the wheel over the GUTTER: the same pane, found
-# through its gutter column. View at line 4.
wheel up 1 4
stable 400 8000
-snap wheel-gutter
# a left click in the gutter scrolls UP to the clicked row, and the row it
# counts from is the BODY's first, not r.y + BOX_H. Row 4 is grid row 3, the
# third body row: two rows up, to line 2. Counted from the wrong end it would
@@ -129,7 +126,6 @@ stable 400 5000
press left 8 4
drag left 8 11
stable 400 5000
-snapstyle sweep-down
# ...and the proof is the BUFFER, not the highlight: 1-2 Cut the sweep, save,
# and read the file back. aaa/bbb/ccc survive and kkk..zzz survive; unclamped
# this file lost bbb/ccc/ddd instead and kept eee onward.
diff --git a/test/snapshots/tagbottomimage.golden b/test/snapshots/tagbottomimage.golden
new file mode 100644
index 00000000..5508d01a
--- /dev/null
+++ b/test/snapshots/tagbottomimage.golden
@@ -0,0 +1,155 @@
+== snap img-top grid=150x30 cursor=11,7
+|New Newcol Find Grep Help Tutor Dump NextColor Debug Kill
+| img /tmp/pardes-snap/tagbottomimage/cwd/pic.ppm New Del /tmp/pardes-snap/tagbottomimage/cwd New Del
+| (f🬱]0V7R*%m🬶🬁G🬬tN#XR9q🬢tC#f/🬜_GR(🬞🬙tCRp$o*7^+[#H7s🬢YDZ🬝▟
+| iU)dSotT[r27T"\*Fh▐🬅g,🬰p🬛▙🬲&*3/9xy🬛▀0kCg▛🬱C,>C}PC06m🬝▟█ pic.ppm
+| "S▄;$gs,Xa▟T🬔s▖┼W▘?by🬋🬭uCR3/A3🬶lO▖▞🬃🬘╳🬟#=🬺🬕yoaJ@>4🬝🬵
+| ─m!fAAD🬒jW>7JkR▄▜🬫🬞🬢FWx╲▟2ZT🬥/▖jteR?q🬶^🬅▀_@N─u4🬹🬝🬹
+| E72z🬧🬒oy🬧e▌ijY╲&🬅mbh╲h$🬘🬴PS9y▙0H🬳╲🬂&🬣╲,🬃,R;█AZ🬝▟
+| <JBpn-S┼zq^🬄677grnk🬛bMd2|VB▙┼'🬎f/{X7🬮jO^]Y─🬄🬎🬻█ pic.ppm
+| 🬊3🬶🬛As0╲─Wd$╳🬤vRnfXIVH&)C+frE2FJZ🬃e🬊W🬔@▜@s🬝🬻█
+| ▛▛aRawF│▌o<╲🬪dGk/gJ🬴🬍🬧mYbR▀LZx🬒%t'sUX:p🬌🬝🬹
+| ─"n_&mht┼A0j]p┼🬲/B%c$1Ln;🬗s*▟j!🬥q2U#🬙&#~
+| 🬖🬈p"│vctj'&^X─C*🬍🬆@&F,7{h`🬷mg▜b╱e%@V🬝🬹█
+| J5▝$8),x&🬩i🬰~D🬚v(>kz5zXa92Q▖` i6Ax🬝🬵
+| z[I🬮╲🬸&j;▟▛eY🬉L&u?🬫gc▝🬍5🬉Q🬪s2V🬗🬡🬝🬹█
+| XUq🬨[╱🬒Zb<"#.$1Zby╳Fk:y🬠🬷z\txn🬝▟
+| r🬗│G"🬵8🬘j=F🬐Z🬫@u▛╲r🬖$🬥%┼6f&>🬝🬹█
+| ~{🬫$blt🬘=dxu",🬣t🬣=y🬌H3>\🬎A🬝🬻
+| k🬴5L🬹🬢u>-!🬊Ga▟╱🬈D🬉╳wEZ'g🬎▄
+| y'5K%p?:╳🬤▘/fZ╳>jwbv0M🬝▟
+| %C🬢▄🬍▗I🬬G▄🬡w~Hp!#"Q▝▛▄█
+| 🬯[▜?To5@q🬗gmJ.w🬉~R🬝▟█
+| y🬗🬞+*X7eJ🬮`X}ZO🬟🬝▟█
+| ╱^🬷pc[a]juQ[🬷$🬝🬻
+| g6▗>🬌7O▞3🬤b─🬝▟
+| YVQ8Q╳NF🬝▐🬝🬹█
+| 🬯│@/]4%^🬆~█
+| eP🬗<┼A🬝🬹█
+| ▀(u🬬🬝▟
+| fc🬎🬹█
+| 🬝🬹
+== snap img-bottom grid=150x30 cursor=11,7
+|New Newcol Find Grep Help Tutor Dump NextColor Debug Kill
+| (f🬱]0V7R*%m🬶🬁G🬬tN#XR9q🬢tC#f/🬜_GR(🬞🬙tCRp$o*7^+[#H7s🬢YDZ🬝▟
+| iU)dSotT[r27T"\*Fh▐🬅g,🬰p🬛▙🬲&*3/9xy🬛▀0kCg▛🬱C,>C}PC06m🬝▟█ pic.ppm
+| "S▄;$gs,Xa▟T🬔s▖┼W▘?by🬋🬭uCR3/A3🬶lO▖▞🬃🬘╳🬟#=🬺🬕yoaJ@>4🬝🬵
+| ─m!fAAD🬒jW>7JkR▄▜🬫🬞🬢FWx╲▟2ZT🬥/▖jteR?q🬶^🬅▀_@N─u4🬹🬝🬹
+| E72z🬧🬒oy🬧e▌ijY╲&🬅mbh╲h$🬘🬴PS9y▙0H🬳╲🬂&🬣╲,🬃,R;█AZ🬝▟
+| <JBpn-S┼zq^🬄677grnk🬛bMd2|VB▙┼'🬎f/{X7🬮jO^]Y─🬄🬎🬻█ pic.ppm
+| 🬊3🬶🬛As0╲─Wd$╳🬤vRnfXIVH&)C+frE2FJZ🬃e🬊W🬔@▜@s🬝🬻█
+| ▛▛aRawF│▌o<╲🬪dGk/gJ🬴🬍🬧mYbR▀LZx🬒%t'sUX:p🬌🬝🬹
+| ─"n_&mht┼A0j]p┼🬲/B%c$1Ln;🬗s*▟j!🬥q2U#🬙&#~
+| 🬖🬈p"│vctj'&^X─C*🬍🬆@&F,7{h`🬷mg▜b╱e%@V🬝🬹█
+| J5▝$8),x&🬩i🬰~D🬚v(>kz5zXa92Q▖` i6Ax🬝🬵
+| z[I🬮╲🬸&j;▟▛eY🬉L&u?🬫gc▝🬍5🬉Q🬪s2V🬗🬡🬝🬹█
+| XUq🬨[╱🬒Zb<"#.$1Zby╳Fk:y🬠🬷z\txn🬝▟
+| r🬗│G"🬵8🬘j=F🬐Z🬫@u▛╲r🬖$🬥%┼6f&>🬝🬹█
+| ~{🬫$blt🬘=dxu",🬣t🬣=y🬌H3>\🬎A🬝🬻
+| k🬴5L🬹🬢u>-!🬊Ga▟╱🬈D🬉╳wEZ'g🬎▄
+| y'5K%p?:╳🬤▘/fZ╳>jwbv0M🬝▟
+| %C🬢▄🬍▗I🬬G▄🬡w~Hp!#"Q▝▛▄█
+| 🬯[▜?To5@q🬗gmJ.w🬉~R🬝▟█
+| y🬗🬞+*X7eJ🬮`X}ZO🬟🬝▟█
+| ╱^🬷pc[a]juQ[🬷$🬝🬻
+| g6▗>🬌7O▞3🬤b─🬝▟
+| YVQ8Q╳NF🬝▐🬝🬹█
+| 🬯│@/]4%^🬆~█
+| eP🬗<┼A🬝🬹█
+| ▀(u🬬🬝▟
+| fc🬎🬹█
+| 🬝🬹
+| img /tmp/pardes-snap/tagbottomimage/cwd/pic.ppm New Del /tmp/pardes-snap/tagbottomimage/cwd New Del
+== style img-bottom
+|0: 0-56 #949494,#121212, 57-149 d,#121212,
+|1: 0-0 d,#121212, 1-9 d,#080808, 10-10 #959595,#6c6c6c, 11-11 #6c6c6c,#959595, 12-12 #959595,#6c6c6c, 13-13 #6c6c6c,#959595, 14-24 #959595,#6c6c6c, 25-27 #6c6c6c,#959595, 28-28 #959595,#6c6c6c, 29-30 #6c6c6c,#959595, 31-32 #959595,#6c6c6c, 33-34 #6c6c6c,#959595, 35-35 #959595,#6c6c6c, 36-37 #6c6c6c,#959595, 38-39 #959595,#6c6c6c, 40-40 #6c6c6c,#959595, 41-41 #959595,#6c6c6c, 42-42 #6c6c6c,#959595, 43-44 #959595,#6c6c6c, 45-47 #6c6c6c,#959595, 48-50 #959595,#6c6c6c, 51-51 #6c6c6c,#959595, 52-52 #959595,#6c6c6c, 53-53 #6c6c6c,#959595, 54-63 #959595,#6c6c6c, 64-64 #959595,#352879, 65-65 #352879,#6c6c6c, 66-74 d,#080808, 75-75 d,#444444, 76-76 d,#080808, 77-149 #bdbdbd,#080808,
+|2: 0-0 d,#121212, 1-9 d,#080808, 10-10 #959595,#6c6c6c, 11-12 #6c6c6c,#959595, 13-13 #959595,#6c6c6c, 14-15 #6c6c6c,#959595, 16-18 #959595,#6c6c6c, 19-19 #6c6c6c,#959595, 20-20 #959595,#6c6c6c, 21-21 #6c6c6c,#959595, 22-32 #959595,#6c6c6c, 33-33 #6c6c6c,#959595, 34-37 #959595,#6c6c6c, 38-39 #6c6c6c,#959595, 40-44 #959595,#6c6c6c, 45-45 #6c6c6c,#959595, 46-47 #959595,#6c6c6c, 48-48 #6c6c6c,#959595, 49-52 #959595,#6c6c6c, 53-53 #444444,#959595, 54-54 #959595,#6c6c6c, 55-55 #6c6c6c,#959595, 56-58 #959595,#6c6c6c, 59-59 #6c6c6c,#959595, 60-60 #959595,#6c6c6c, 61-61 #6c6c6c,#959595, 62-62 #959595,#352879, 63-63 #352879,#959595, 64-64 #352879,#6c5eb5, 65-65 #352879,#352879, 66-74 d,#080808, 75-75 d,#444444, 76-76 d,#080808, 77-149 #bdbdbd,#080808,
+|3: 0-0 d,#121212, 1-9 d,#080808, 10-10 #6c6c6c,#959595, 11-13 #959595,#6c6c6c, 14-16 #6c6c6c,#959595, 17-17 #444444,#959595, 18-22 #959595,#6c6c6c, 23-23 #6c6c6c,#959595, 24-26 #959595,#6c6c6c, 27-27 #6c6c6c,#959595, 28-28 #959595,#6c6c6c, 29-30 #6c6c6c,#959595, 31-32 #959595,#6c6c6c, 33-33 #6c6c6c,#959595, 34-35 #959595,#6c6c6c, 36-36 #6c6c6c,#959595, 37-37 #444444,#959595, 38-38 #959595,#6c6c6c, 39-39 #6c6c6c,#959595, 40-43 #959595,#6c6c6c, 44-44 #6c6c6c,#959595, 45-48 #959595,#6c6c6c, 49-51 #6c6c6c,#959595, 52-52 #959595,#6c6c6c, 53-53 #6c6c6c,#959595, 54-55 #959595,#6c6c6c, 56-58 #6c6c6c,#959595, 59-59 #959595,#6c6c6c, 60-60 #6c6c6c,#352879, 61-61 #352879,#6c5eb5, 62-65 #352879,#352879, 66-74 d,#080808, 75-75 d,#444444, 76-76 d,#080808, 77-149 #bdbdbd,#080808,
+|4: 0-0 d,#121212, 1-9 d,#080808, 10-10 #959595,#6c6c6c, 11-11 #6c6c6c,#959595, 12-17 #959595,#6c6c6c, 18-18 #6c6c6c,#959595, 19-19 #959595,#6c6c6c, 20-22 #6c6c6c,#959595, 23-26 #959595,#6c6c6c, 27-27 #6c6c6c,#959595, 28-29 #959595,#6c6c6c, 30-33 #6c6c6c,#959595, 34-35 #959595,#6c6c6c, 36-37 #6c6c6c,#959595, 38-40 #959595,#6c6c6c, 41-41 #6c6c6c,#959595, 42-42 #959595,#6c6c6c, 43-43 #6c6c6c,#959595, 44-44 #959595,#6c6c6c, 45-46 #6c6c6c,#959595, 47-47 #959595,#6c6c6c, 48-48 #6c6c6c,#959595, 49-49 #959595,#6c6c6c, 50-50 #6c6c6c,#959595, 51-51 #444444,#959595, 52-56 #959595,#6c6c6c, 57-57 #6c6c6c,#959595, 58-58 #959595,#352879, 59-59 #352879,#959595, 60-65 #352879,#352879, 66-74 d,#080808, 75-75 d,#444444, 76-76 d,#080808, 77-149 #bdbdbd,#080808,
+|5: 0-0 d,#121212, 1-9 d,#080808, 10-11 #959595,#6c6c6c, 12-13 #6c6c6c,#959595, 14-16 #959595,#6c6c6c, 17-17 #6c6c6c,#959595, 18-19 #959595,#6c6c6c, 20-20 #6c6c6c,#959595, 21-21 #959595,#6c6c6c, 22-22 #6c6c6c,#959595, 23-24 #959595,#6c6c6c, 25-25 #6c6c6c,#959595, 26-27 #959595,#6c6c6c, 28-32 #6c6c6c,#959595, 33-40 #959595,#6c6c6c, 41-41 #6c6c6c,#959595, 42-53 #959595,#6c6c6c, 54-54 #6c6c6c,#959595, 55-55 #959595,#6c6c6c, 56-56 #959595,#352879, 57-57 #352879,#6c6c6c, 58-65 #352879,#352879, 66-74 d,#080808, 75-75 d,#444444, 76-76 d,#080808, 77-149 #bdbdbd,#080808,
+|6: 0-0 d,#121212, 1-9 d,#080808, 10-13 #6c6c6c,#959595, 14-15 #959595,#6c6c6c, 16-16 #6c6c6c,#959595, 17-18 #959595,#6c6c6c, 19-19 #6c6c6c,#959595, 20-23 #959595,#6c6c6c, 24-24 #6c6c6c,#959595, 25-26 #959595,#6c6c6c, 27-28 #6c6c6c,#959595, 29-30 #959595,#6c6c6c, 31-31 #6c6c6c,#959595, 32-35 #959595,#6c6c6c, 36-38 #6c6c6c,#959595, 39-40 #959595,#6c6c6c, 41-41 #6c6c6c,#959595, 42-42 #959595,#6c6c6c, 43-43 #6c6c6c,#959595, 44-48 #959595,#6c6c6c, 49-49 #444444,#959595, 50-50 #959595,#6c6c6c, 51-51 #6c6c6c,#959595, 52-53 #959595,#6c6c6c, 54-54 #959595,#352879, 55-55 #352879,#444444, 56-56 #352879,#6c5eb5, 57-65 #352879,#352879, 66-74 d,#080808, 75-75 d,#444444, 76-76 d,#080808, 77-85 #bdbdbd,#080808, 86-149 d,#080808,
+|7: 0-0 d,#121212, 1-9 d,#080808, 10-15 #959595,#6c6c6c, 16-21 #6c6c6c,#959595, 22-25 #959595,#6c6c6c, 26-26 #6c6c6c,#959595, 27-29 #959595,#6c6c6c, 30-30 #6c6c6c,#959595, 31-31 #959595,#6c6c6c, 32-34 #6c6c6c,#959595, 35-38 #959595,#6c6c6c, 39-39 #6c6c6c,#959595, 40-45 #959595,#6c6c6c, 46-48 #6c6c6c,#959595, 49-49 #959595,#6c6c6c, 50-51 #6c6c6c,#959595, 52-52 #6c6c6c,#352879, 53-53 #352879,#6c6c6c, 54-54 #352879,#6c5eb5, 55-65 #352879,#352879, 66-74 d,#080808, 75-75 d,#444444, 76-76 d,#080808, 77-149 #bdbdbd,#080808,
+|8: 0-0 d,#121212, 1-9 d,#080808, 10-10 #959595,#6c6c6c, 11-11 #6c6c6c,#959595, 12-13 #959595,#6c6c6c, 14-14 #6c6c6c,#959595, 15-15 #959595,#6c6c6c, 16-16 #6c6c6c,#959595, 17-17 #959595,#6c6c6c, 18-20 #6c6c6c,#959595, 21-24 #959595,#6c6c6c, 25-25 #6c6c6c,#959595, 26-26 #959595,#6c6c6c, 27-27 #6c6c6c,#959595, 28-28 #959595,#6c6c6c, 29-29 #6c6c6c,#959595, 30-34 #959595,#6c6c6c, 35-35 #6c6c6c,#959595, 36-36 #959595,#6c6c6c, 37-37 #6c6c6c,#959595, 38-40 #959595,#6c6c6c, 41-41 #6c6c6c,#959595, 42-42 #959595,#6c6c6c, 43-43 #444444,#959595, 44-44 #959595,#6c6c6c, 45-45 #6c6c6c,#959595, 46-46 #959595,#6c6c6c, 47-47 #444444,#959595, 48-48 #6c6c6c,#959595, 49-49 #959595,#6c6c6c, 50-50 #6c6c6c,#352879, 51-51 #352879,#6c5eb5, 52-65 #352879,#352879, 66-74 d,#080808, 75-75 d,#444444, 76-76 d,#080808, 77-149 #bdbdbd,#080808,
+|9: 0-0 d,#121212, 1-9 d,#080808, 10-10 #6c6c6c,#959595, 11-13 #959595,#6c6c6c, 14-14 #6c6c6c,#959595, 15-15 #959595,#6c6c6c, 16-16 #6c6c6c,#959595, 17-18 #959595,#6c6c6c, 19-19 #6c6c6c,#959595, 20-20 #444444,#959595, 21-24 #959595,#6c6c6c, 25-25 #6c6c6c,#959595, 26-26 #959595,#6c6c6c, 27-30 #6c6c6c,#959595, 31-35 #959595,#6c6c6c, 36-37 #6c6c6c,#959595, 38-38 #959595,#6c6c6c, 39-40 #6c6c6c,#959595, 41-44 #959595,#6c6c6c, 45-45 #6c6c6c,#959595, 46-47 #959595,#6c6c6c, 48-49 #959595,#352879, 50-65 #352879,#352879, 66-74 d,#080808, 75-75 d,#444444, 76-76 d,#080808, 77-149 #bdbdbd,#080808,
+|10: 0-0 d,#121212, 1-9 d,#080808, 10-13 #959595,#6c6c6c, 14-14 #6c6c6c,#959595, 15-17 #959595,#6c6c6c, 18-18 #6c6c6c,#959595, 19-20 #959595,#6c6c6c, 21-21 #6c6c6c,#959595, 22-23 #959595,#6c6c6c, 24-24 #6c6c6c,#959595, 25-30 #959595,#6c6c6c, 31-34 #6c6c6c,#959595, 35-36 #959595,#6c6c6c, 37-37 #6c6c6c,#959595, 38-38 #959595,#6c6c6c, 39-40 #6c6c6c,#959595, 41-41 #444444,#959595, 42-42 #959595,#6c6c6c, 43-45 #6c6c6c,#959595, 46-46 #6c6c6c,#352879, 47-47 #352879,#6c6c6c, 48-48 #352879,#6c5eb5, 49-65 #352879,#352879, 66-74 d,#080808, 75-75 d,#444444, 76-76 d,#080808, 77-149 #bdbdbd,#080808,
+|11: 0-0 d,#121212, 1-9 d,#080808, 10-11 #6c6c6c,#959595, 12-13 #959595,#6c6c6c, 14-15 #6c6c6c,#959595, 16-16 #959595,#6c6c6c, 17-20 #6c6c6c,#959595, 21-21 #959595,#6c6c6c, 22-22 #6c6c6c,#959595, 23-23 #959595,#6c6c6c, 24-24 #6c6c6c,#959595, 25-25 #959595,#6c6c6c, 26-26 #6c6c6c,#959595, 27-28 #959595,#6c6c6c, 29-29 #6c6c6c,#959595, 30-31 #959595,#6c6c6c, 32-33 #6c6c6c,#959595, 34-35 #959595,#6c6c6c, 36-36 #6c6c6c,#959595, 37-38 #959595,#6c6c6c, 39-39 #444444,#6c6c6c, 40-40 #6c6c6c,#959595, 41-41 #959595,#6c6c6c, 42-42 #6c6c6c,#959595, 43-43 #959595,#6c6c6c, 44-44 #959595,#352879, 45-45 #352879,#6c5eb5, 46-65 #352879,#352879, 66-74 d,#080808, 75-75 d,#444444, 76-76 d,#080808, 77-149 #bdbdbd,#080808,
+|12: 0-0 d,#121212, 1-9 d,#080808, 10-10 #6c6c6c,#959595, 11-13 #959595,#6c6c6c, 14-14 #444444,#6c6c6c, 15-24 #959595,#6c6c6c, 25-25 #6c6c6c,#959595, 26-31 #959595,#6c6c6c, 32-39 #6c6c6c,#959595, 40-41 #959595,#6c6c6c, 42-42 #6c6c6c,#352879, 43-43 #352879,#959595, 44-44 #352879,#6c5eb5, 45-65 #352879,#352879, 66-74 d,#080808, 75-75 d,#444444, 76-76 d,#080808, 77-149 #bdbdbd,#080808,
+|13: 0-0 d,#121212, 1-9 d,#080808, 10-10 #959595,#6c6c6c, 11-11 #6c6c6c,#959595, 12-16 #959595,#6c6c6c, 17-17 #6c6c6c,#959595, 18-20 #959595,#6c6c6c, 21-21 #6c6c6c,#959595, 22-23 #959595,#6c6c6c, 24-27 #6c6c6c,#959595, 28-29 #959595,#6c6c6c, 30-30 #6c6c6c,#959595, 31-31 #959595,#6c6c6c, 32-32 #6c6c6c,#959595, 33-35 #959595,#6c6c6c, 36-38 #6c6c6c,#959595, 39-39 #959595,#6c6c6c, 40-40 #6c6c6c,#352879, 41-41 #352879,#6c6c6c, 42-65 #352879,#352879, 66-74 d,#080808, 75-75 d,#444444, 76-76 d,#080808, 77-149 #bdbdbd,#080808,
+|14: 0-0 d,#121212, 1-9 d,#080808, 10-10 #6c6c6c,#959595, 11-15 #959595,#6c6c6c, 16-16 #6c6c6c,#959595, 17-21 #959595,#6c6c6c, 22-22 #6c6c6c,#959595, 23-23 #959595,#6c6c6c, 24-25 #6c6c6c,#959595, 26-26 #959595,#6c6c6c, 27-27 #444444,#959595, 28-29 #6c6c6c,#959595, 30-32 #959595,#6c6c6c, 33-33 #6c6c6c,#959595, 34-34 #959595,#6c6c6c, 35-35 #6c6c6c,#959595, 36-36 #959595,#6c6c6c, 37-37 #6c6c6c,#959595, 38-38 #6c6c6c,#352879, 39-39 #352879,#959595, 40-40 #352879,#6c5eb5, 41-65 #352879,#352879, 66-74 d,#080808, 75-75 d,#444444, 76-76 d,#080808, 77-149 #bdbdbd,#080808,
+|15: 0-0 d,#121212, 1-9 d,#080808, 10-10 #6c6c6c,#959595, 11-13 #959595,#6c6c6c, 14-14 #6c6c6c,#959595, 15-20 #959595,#6c6c6c, 21-21 #6c6c6c,#959595, 22-24 #959595,#6c6c6c, 25-25 #6c6c6c,#959595, 26-27 #959595,#6c6c6c, 28-29 #6c6c6c,#959595, 30-31 #959595,#6c6c6c, 32-32 #6c6c6c,#959595, 33-33 #959595,#6c6c6c, 34-34 #6c6c6c,#959595, 35-35 #959595,#6c6c6c, 36-36 #6c6c6c,#352879, 37-37 #352879,#959595, 38-65 #352879,#352879, 66-74 d,#080808, 75-75 d,#444444, 76-76 d,#080808, 77-149 #bdbdbd,#080808,
+|16: 0-0 d,#121212, 1-9 d,#080808, 10-11 #959595,#6c6c6c, 12-12 #6c6c6c,#959595, 13-15 #959595,#6c6c6c, 16-16 #6c6c6c,#959595, 17-17 #959595,#6c6c6c, 18-19 #6c6c6c,#959595, 20-21 #959595,#6c6c6c, 22-22 #6c6c6c,#959595, 23-29 #959595,#6c6c6c, 30-31 #6c6c6c,#959595, 32-32 #959595,#6c6c6c, 33-33 #6c6c6c,#959595, 34-34 #959595,#352879, 35-35 #352879,#6c5eb5, 36-65 #352879,#352879, 66-74 d,#080808, 75-75 d,#444444, 76-76 d,#080808, 77-149 #bdbdbd,#080808,
+|17: 0-0 d,#121212, 1-9 d,#080808, 10-12 #959595,#6c6c6c, 13-15 #6c6c6c,#959595, 16-16 #959595,#6c6c6c, 17-17 #444444,#959595, 18-20 #959595,#6c6c6c, 21-21 #6c6c6c,#959595, 22-22 #959595,#6c6c6c, 23-23 #6c6c6c,#959595, 24-27 #959595,#6c6c6c, 28-28 #6c6c6c,#959595, 29-31 #959595,#6c6c6c, 32-32 #6c6c6c,#352879, 33-33 #352879,#6c6c6c, 34-65 #352879,#352879, 66-74 d,#080808, 75-75 d,#444444, 76-76 d,#080808, 77-149 #bdbdbd,#080808,
+|18: 0-0 d,#121212, 1-9 d,#080808, 10-16 #959595,#6c6c6c, 17-17 #6c6c6c,#959595, 18-18 #959595,#6c6c6c, 19-19 #6c6c6c,#959595, 20-20 #959595,#6c6c6c, 21-21 #6c6c6c,#959595, 22-23 #959595,#6c6c6c, 24-26 #6c6c6c,#959595, 27-27 #959595,#6c6c6c, 28-28 #6c6c6c,#959595, 29-29 #959595,#6c6c6c, 30-30 #959595,#352879, 31-32 #352879,#6c5eb5, 33-65 #352879,#352879, 66-74 d,#080808, 75-75 d,#444444, 76-76 d,#080808, 77-149 #bdbdbd,#080808,
+|19: 0-0 d,#121212, 1-9 d,#080808, 10-11 #959595,#6c6c6c, 12-12 #6c6c6c,#959595, 13-15 #959595,#6c6c6c, 16-17 #6c6c6c,#959595, 18-19 #959595,#6c6c6c, 20-21 #6c6c6c,#959595, 22-22 #959595,#6c6c6c, 23-24 #6c6c6c,#959595, 25-26 #959595,#6c6c6c, 27-27 #6c6c6c,#959595, 28-28 #6c6c6c,#352879, 29-29 #352879,#6c6c6c, 30-30 #352879,#6c5eb5, 31-65 #352879,#352879, 66-74 d,#080808, 75-75 d,#444444, 76-76 d,#080808, 77-149 #bdbdbd,#080808,
+|20: 0-0 d,#121212, 1-9 d,#080808, 10-14 #959595,#6c6c6c, 15-15 #6c6c6c,#959595, 16-17 #959595,#6c6c6c, 18-18 #6c6c6c,#959595, 19-19 #959595,#6c6c6c, 20-20 #6c6c6c,#959595, 21-21 #959595,#6c6c6c, 22-22 #6c6c6c,#959595, 23-25 #959595,#6c6c6c, 26-26 #6c6c6c,#352879, 27-27 #352879,#6c6c6c, 28-28 #352879,#6c5eb5, 29-65 #352879,#352879, 66-74 d,#080808, 75-75 d,#444444, 76-76 d,#080808, 77-149 #bdbdbd,#080808,
+|21: 0-0 d,#121212, 1-9 d,#080808, 10-12 #6c6c6c,#959595, 13-14 #959595,#6c6c6c, 15-16 #6c6c6c,#959595, 17-20 #959595,#6c6c6c, 21-21 #6c6c6c,#959595, 22-22 #959595,#6c6c6c, 23-23 #6c6c6c,#959595, 24-24 #6c6c6c,#352879, 25-25 #352879,#959595, 26-65 #352879,#352879, 66-74 d,#080808, 75-75 d,#444444, 76-76 d,#080808, 77-149 #bdbdbd,#080808,
+|22: 0-0 d,#121212, 1-9 d,#080808, 10-10 #959595,#6c6c6c, 11-11 #6c6c6c,#959595, 12-21 #959595,#6c6c6c, 22-22 #6c6c6c,#352879, 23-23 #352879,#6c6c6c, 24-65 #352879,#352879, 66-74 d,#080808, 75-75 d,#444444, 76-76 d,#080808, 77-149 #bdbdbd,#080808,
+|23: 0-0 d,#121212, 1-9 d,#080808, 10-11 #6c6c6c,#959595, 12-13 #959595,#6c6c6c, 14-14 #6c6c6c,#959595, 15-15 #959595,#6c6c6c, 16-17 #6c6c6c,#959595, 18-19 #959595,#6c6c6c, 20-20 #6c6c6c,#352879, 21-21 #352879,#959595, 22-22 #352879,#6c5eb5, 23-65 #352879,#352879, 66-74 d,#080808, 75-75 d,#444444, 76-76 d,#080808, 77-149 #bdbdbd,#080808,
+|24: 0-0 d,#121212, 1-9 d,#080808, 10-11 #959595,#6c6c6c, 12-13 #6c6c6c,#959595, 14-16 #959595,#6c6c6c, 17-17 #6c6c6c,#959595, 18-19 #959595,#352879, 20-20 #352879,#6c5eb5, 21-65 #352879,#352879, 66-74 d,#080808, 75-75 d,#444444, 76-76 d,#080808, 77-149 #bdbdbd,#080808,
+|25: 0-0 d,#121212, 1-9 d,#080808, 10-11 #6c6c6c,#959595, 12-15 #959595,#6c6c6c, 16-16 #959595,#352879, 17-17 #352879,#6c6c6c, 18-18 #352879,#6c5eb5, 19-65 #352879,#352879, 66-74 d,#080808, 75-75 d,#444444, 76-76 d,#080808, 77-149 #bdbdbd,#080808,
+|26: 0-0 d,#121212, 1-9 d,#080808, 10-10 #6c6c6c,#959595, 11-12 #959595,#6c6c6c, 13-13 #959595,#444444, 14-14 #6c6c6c,#352879, 15-15 #352879,#959595, 16-65 #352879,#352879, 66-74 d,#080808, 75-75 d,#444444, 76-76 d,#080808, 77-149 #bdbdbd,#080808,
+|27: 0-0 d,#121212, 1-9 d,#080808, 10-11 #6c6c6c,#959595, 12-12 #6c6c6c,#352879, 13-13 #352879,#6c6c6c, 14-14 #352879,#6c5eb5, 15-65 #352879,#352879, 66-74 d,#080808, 75-75 d,#444444, 76-76 d,#080808, 77-149 #bdbdbd,#080808,
+|28: 0-0 d,#121212, 1-9 d,#080808, 10-10 #6c6c6c,#352879, 11-11 #352879,#6c6c6c, 12-65 #352879,#352879, 66-74 d,#080808, 75-75 d,#444444, 76-76 d,#080808, 77-149 #bdbdbd,#080808,
+|29: 0-1 #ffffff,#626262, 2-56 #949494,#121212, 57-74 d,#121212, 75-76 #ffffff,#262626, 77-129 #949494,#121212, 130-149 d,#121212,
+== snap search-prompt grid=150x30 cursor=6,1
+|New Newcol Find Grep Help Tutor Dump NextColor Debug Kill
+| /ZZ
+| iU)dSotT[r27T"\*Fh▐🬅g,🬰p🬛▙🬲&*3/9xy🬛▀0kCg▛🬱C,>C}PC06m🬝▟█ pic.ppm
+| "S▄;$gs,Xa▟T🬔s▖┼W▘?by🬋🬭uCR3/A3🬶lO▖▞🬃🬘╳🬟#=🬺🬕yoaJ@>4🬝🬵
+| ─m!fAAD🬒jW>7JkR▄▜🬫🬞🬢FWx╲▟2ZT🬥/▖jteR?q🬶^🬅▀_@N─u4🬹🬝🬹
+| E72z🬧🬒oy🬧e▌ijY╲&🬅mbh╲h$🬘🬴PS9y▙0H🬳╲🬂&🬣╲,🬃,R;█AZ🬝▟
+| <JBpn-S┼zq^🬄677grnk🬛bMd2|VB▙┼'🬎f/{X7🬮jO^]Y─🬄🬎🬻█ pic.ppm
+| 🬊3🬶🬛As0╲─Wd$╳🬤vRnfXIVH&)C+frE2FJZ🬃e🬊W🬔@▜@s🬝🬻█
+| ▛▛aRawF│▌o<╲🬪dGk/gJ🬴🬍🬧mYbR▀LZx🬒%t'sUX:p🬌🬝🬹
+| ─"n_&mht┼A0j]p┼🬲/B%c$1Ln;🬗s*▟j!🬥q2U#🬙&#~
+| 🬖🬈p"│vctj'&^X─C*🬍🬆@&F,7{h`🬷mg▜b╱e%@V🬝🬹█
+| J5▝$8),x&🬩i🬰~D🬚v(>kz5zXa92Q▖` i6Ax🬝🬵
+| z[I🬮╲🬸&j;▟▛eY🬉L&u?🬫gc▝🬍5🬉Q🬪s2V🬗🬡🬝🬹█
+| XUq🬨[╱🬒Zb<"#.$1Zby╳Fk:y🬠🬷z\txn🬝▟
+| r🬗│G"🬵8🬘j=F🬐Z🬫@u▛╲r🬖$🬥%┼6f&>🬝🬹█
+| ~{🬫$blt🬘=dxu",🬣t🬣=y🬌H3>\🬎A🬝🬻
+| k🬴5L🬹🬢u>-!🬊Ga▟╱🬈D🬉╳wEZ'g🬎▄
+| y'5K%p?:╳🬤▘/fZ╳>jwbv0M🬝▟
+| %C🬢▄🬍▗I🬬G▄🬡w~Hp!#"Q▝▛▄█
+| 🬯[▜?To5@q🬗gmJ.w🬉~R🬝▟█
+| y🬗🬞+*X7eJ🬮`X}ZO🬟🬝▟█
+| ╱^🬷pc[a]juQ[🬷$🬝🬻
+| g6▗>🬌7O▞3🬤b─🬝▟
+| YVQ8Q╳NF🬝▐🬝🬹█
+| 🬯│@/]4%^🬆~█
+| eP🬗<┼A🬝🬹█
+| ▀(u🬬🬝▟
+| fc🬎🬹█
+| 🬝🬹
+| img /tmp/pardes-snap/tagbottomimage/cwd/pic.ppm New Del /tmp/pardes-snap/tagbottomimage/cwd New Del
+== snap del-image grid=150x30 cursor=5,6
+|New Newcol Find Grep Help Tutor Dump NextColor Debug Kill
+|
+| pic.ppm
+|
+|
+|
+| pic.ppm
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+| /tmp/pardes-snap/tagbottomimage/cwd New Del
diff --git a/test/snapshots/tagbottomimage.snap b/test/snapshots/tagbottomimage.snap
new file mode 100644
index 00000000..e46e19ba
--- /dev/null
+++ b/test/snapshots/tagbottomimage.snap
@@ -0,0 +1,52 @@
+# Tagbottom against the one pane kind whose renderPane RETURNS EARLY. An image
+# draws no body rows and no tagline of its own — the tag comes from the outer
+# loop and so does the transient message row — so it is exactly the pane where
+# "the tag moved" and "the message row moved with it" can come apart. Nothing
+# in tagbottom.snap touches one.
+ppmdiag pic.ppm
+start 30 150 -n 1
+wait 8000 New Newcol
+stable 700 20000
+# open it the way images.snap does: type the name into the shell pane's own
+# text and right-click it. The image lands in a column of its own on the left.
+press left 5 8
+release left 5 8
+stable 400 5000
+key i
+text pic.ppm
+key esc
+settle 100
+press right 6 8
+release right 6 8
+wait 10000 img
+stable 700 20000
+snap img-top
+# SPC t b: the tag leaves row 1 for row 29 and the glyph art slides up into the
+# row it left. The style capture is the half a text grid cannot see — the
+# tagline's chrome colours have to travel with it, and a tag row drawn in the
+# palette of the cell art under it would read as part of the picture.
+key space t b
+stable 700 15000
+snap img-bottom
+snapstyle img-bottom
+# `/` on an image pane. There is no text to search, and that is the point: the
+# prompt is drawn by the message-row pass, which runs OUTSIDE renderPane
+# precisely so an early-returning pane still gets one. With Tagbottom it lands
+# on the pane's FIRST row (grid 1), the end away from the tag — over the top
+# row of the art, not over the tagline that is now beneath it.
+key /
+send ZZ
+stable 600 8000
+stable 400 5000
+snap search-prompt
+key esc
+settle 100
+stable 400 5000
+# ...and EXECUTE `Del` on that bottom tagline, which is the assertion the
+# pixels cannot make: the middle click has to map row 29 to the image pane's
+# TAG row rather than to a body row it has no body for. The image pane goes
+# away entirely and the shell takes the whole window back.
+press middle 56 30
+release middle 56 30
+stable 700 15000
+snap del-image