summaryrefslogtreecommitdiff
path: root/test/snapshots
diff options
context:
space:
mode:
authorGabriel Schneider <[email protected]>2026-07-31 05:04:26 -0300
committerGabriel Schneider <[email protected]>2026-08-01 15:02:08 -0300
commit5bf8d6dd077517270377e5d8551108ecf252374f (patch)
treec7783fa9fc133980d3d6fff0129e8de5a1b43601 /test/snapshots
parenteefac04995ffad847a4098f16d2e82ccab16438b (diff)
downloadpardes-5bf8d6dd077517270377e5d8551108ecf252374f.tar.gz
pardes-5bf8d6dd077517270377e5d8551108ecf252374f.zip
multiple cursors, regex selection, and Ctrl-c comments
The primary cursor stays exactly where it was — cur_row/cur_col plus vsel — and sels[] holds helix's OTHER ranges. That split is why nothing moved at one cursor: with nsel == 0 not one line of the existing motion, operator, render or mouse code takes a different branch, which is what protects 800 differential cases and 67 goldens. paneRanges/setPaneRanges are the whole list; setPaneRanges IS helix's Selection::new (min width 1, sorted, overlaps merged, primary follows its range through a merge). An ordinary key runs the single-selection handler once per range, visited last-first so an edit never disturbs a range still waiting, and each finished pass is remembered as a distance from the END of the text, which an earlier edit cannot move — helix's change mapping without a change map. pushUndo fires once per keystroke, yanks accumulate, and a builtin acts from the primary and stops the replay, which also closes the use-after-free window if it frees the pane. s and S reuse the / prompt wholesale rather than growing a second one: the pattern is typed into the tag tail, and every keystroke re-runs the match from the selection the prompt opened on, so the preview is live and Esc is just the empty pattern. mvzr does runtime patterns — a bytecode VM in a fixed-size struct with no allocator — with 64 ops and 8 char classes per pattern, no case-insensitive flag (helix's smart case is done by folding a scratch copy), no captures, no multi-line anchors. The last two are the two waivers. Ctrl-c is a whole-list key and not a per-cursor replay, because helix decides comment-vs-uncomment ONCE for the whole selection; replaying it would take that decision n times. Comment tokens are a table in config.zig keyed on the same extension syntax.zig picks grammars by. Found and fixed a pre-existing single-cursor bug on the way: la<bs><esc> left the cursor one cell before where the append began. helix's restore_cursor can never walk past the origin; ours backed up unconditionally. hxdiff was green before AND after — the old one-selection contract could not see it. hxdiff 360 -> 481 cases, hxparity 440 -> 561, all goldens from real helix; the harness contract now reports every range and its primary, omitted when there is one, so 359 of the 360 old goldens are byte-identical. The one that moved is o-count: helix's 2o really does leave two cursors and could not say so before.
Diffstat (limited to 'test/snapshots')
-rw-r--r--test/snapshots/lspdebug.golden14
-rw-r--r--test/snapshots/multicursor.golden217
-rw-r--r--test/snapshots/multicursor.snap46
-rw-r--r--test/snapshots/selregex.golden275
-rw-r--r--test/snapshots/selregex.snap56
5 files changed, 601 insertions, 7 deletions
diff --git a/test/snapshots/lspdebug.golden b/test/snapshots/lspdebug.golden
index 2bce4aa6..bb0fee41 100644
--- a/test/snapshots/lspdebug.golden
+++ b/test/snapshots/lspdebug.golden
@@ -203,16 +203,16 @@
| 3 zig lib dir: /usr/lib/zig [OK]
| 4 offsets: utf-8 walk caps: 512 files, 2000 rows
| 5
-| 6 dependency imports gd can follow (6):
+| 6 dependency imports gd can follow (7):
| 7 zls /home/goblin/00-projects/0x4200.cafe
| 8 tree-sitter /home/goblin/00-projects/0x4200.cafe
| 9 zstbi /home/goblin/00-projects/0x4200.cafe
-| 10 ghostty-vt /home/goblin/00-projects/0x4200.cafe
-| 11 vaxis /home/goblin/00-projects/0x4200.cafe
-| 12 uucode /home/goblin/00-projects/0x4200.cafe
-| 13 asked from: /tmp/pardes-snap/lspdebug/cwd/z.zig
-| 14
-| 15 answers: definition, declaration, type_definition, im
+| 10 mvzr /home/goblin/00-projects/0x4200.cafe
+| 11 ghostty-vt /home/goblin/00-projects/0x4200.cafe
+| 12 vaxis /home/goblin/00-projects/0x4200.cafe
+| 13 uucode /home/goblin/00-projects/0x4200.cafe
+| 14 asked from: /tmp/pardes-snap/lspdebug/cwd/z.zig
+| 15
| NOR /tmp/pardes-snap/lspdebug/cwd/+Lsp Del
| 1 lsp explain — the definition query at byte 29 of z.zi
| 2
diff --git a/test/snapshots/multicursor.golden b/test/snapshots/multicursor.golden
new file mode 100644
index 00000000..2be37dc2
--- /dev/null
+++ b/test/snapshots/multicursor.golden
@@ -0,0 +1,217 @@
+== snap three-cursors grid=150x30 cursor=7,4
+|Kill Newcol Tutor Debug NextColor Dump Find Grep Help
+| NOR /tmp/pardes-snap/multicursor/cwd/f.txt Save NOR /tmp/pardes-snap/multicursor/cwd Del NOR /tmp/pardes-snap/multicursor/cwd Del
+| 1 line 1
+| 2 line 2 f.txt f.txt
+| 3 line 3
+| 4 line 4
+| 5 line 5
+| 6 line 6 f.txt
+| 7 line 7
+| 8 line 8
+| 9 line 9
+| 10 line 10
+| 11 line 11
+| 12 line 12
+| 13
+|
+| NOR /tmp/pardes-snap/multicursor/cwd Del
+|
+| f.txt
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+== style three-cursors
+|0: 0-52 #949494,#121212, 53-149 d,#121212,
+|1: 0-1 d,#626262, 2-49 #949494,#121212, 50-51 d,#262626, 52-91 #949494,#121212, 92-99 d,#121212, 100-101 d,#262626, 102-141 #949494,#121212, 142-149 d,#121212,
+|2: 0-1 d,#444444, 2-6 #626262,#080808, 7-7 #4a3a1e,#d8c8a8, 8-12 #bdbdbd,#080808, 13-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|3: 0-1 d,#444444, 2-6 #626262,#080808, 7-7 #4a3a1e,#d8c8a8, 8-12 #bdbdbd,#080808, 13-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|4: 0-1 d,#444444, 2-6 #949494,#121212, 7-12 #bdbdbd,#080808, 13-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|5: 0-1 d,#444444, 2-6 #626262,#080808, 7-12 #bdbdbd,#080808, 13-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|6: 0-1 d,#444444, 2-6 #626262,#080808, 7-12 #bdbdbd,#080808, 13-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|7: 0-1 d,#444444, 2-6 #626262,#080808, 7-12 #bdbdbd,#080808, 13-49 d,#080808, 50-51 d,#444444, 52-58 #bdbdbd,#080808, 59-99 d,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|8: 0-1 d,#444444, 2-6 #626262,#080808, 7-12 #bdbdbd,#080808, 13-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|9: 0-1 d,#444444, 2-6 #626262,#080808, 7-12 #bdbdbd,#080808, 13-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|10: 0-1 d,#444444, 2-6 #626262,#080808, 7-12 #bdbdbd,#080808, 13-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|11: 0-1 d,#444444, 2-6 #626262,#080808, 7-13 #bdbdbd,#080808, 14-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|12: 0-1 d,#444444, 2-6 #626262,#080808, 7-13 #bdbdbd,#080808, 14-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|13: 0-1 d,#444444, 2-6 #626262,#080808, 7-13 #bdbdbd,#080808, 14-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|14: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|15: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|16: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#262626, 52-91 #949494,#121212, 92-99 d,#121212, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|17: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|18: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|19: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|20: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|21: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|22: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|23: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|24: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|25: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|26: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|27: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|28: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|29: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+== snap edited-at-three grid=150x30 cursor=9,4
+|Kill Newcol Tutor Debug NextColor Dump Find Grep Help
+| NOR /tmp/pardes-snap/multicursor/cwd/f.txt Save NOR /tmp/pardes-snap/multicursor/cwd Del NOR /tmp/pardes-snap/multicursor/cwd Del
+| 1 >>line 1
+| 2 >>line 2 f.txt f.txt
+| 3 >>line 3
+| 4 line 4
+| 5 line 5
+| 6 line 6 f.txt
+| 7 line 7
+| 8 line 8
+| 9 line 9
+| 10 line 10
+| 11 line 11
+| 12 line 12
+| 13
+|
+| NOR /tmp/pardes-snap/multicursor/cwd Del
+|
+| f.txt
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+== snap three-selections grid=150x30 cursor=8,4
+|Kill Newcol Tutor Debug NextColor Dump Find Grep Help
+| NOR /tmp/pardes-snap/multicursor/cwd/f.txt Save NOR /tmp/pardes-snap/multicursor/cwd Del NOR /tmp/pardes-snap/multicursor/cwd Del
+| 1 >>line 1
+| 2 >>line 2 f.txt f.txt
+| 3 >>line 3
+| 4 line 4
+| 5 line 5
+| 6 line 6 f.txt
+| 7 line 7
+| 8 line 8
+| 9 line 9
+| 10 line 10
+| 11 line 11
+| 12 line 12
+| 13
+|
+| NOR /tmp/pardes-snap/multicursor/cwd Del
+|
+| f.txt
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+== style three-selections
+|0: 0-52 #949494,#121212, 53-149 d,#121212,
+|1: 0-1 d,#626262, 2-49 #949494,#121212, 50-51 d,#262626, 52-91 #949494,#121212, 92-99 d,#121212, 100-101 d,#262626, 102-141 #949494,#121212, 142-149 d,#121212,
+|2: 0-1 d,#444444, 2-6 #626262,#080808, 7-7 #a89c84,#2e2616, 8-8 #4a3a1e,#d8c8a8, 9-14 #bdbdbd,#080808, 15-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|3: 0-1 d,#444444, 2-6 #626262,#080808, 7-7 #a89c84,#2e2616, 8-8 #4a3a1e,#d8c8a8, 9-14 #bdbdbd,#080808, 15-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|4: 0-1 d,#444444, 2-6 #949494,#121212, 7-8 #d8c8a8,#4a3a1e, 9-14 #bdbdbd,#080808, 15-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|5: 0-1 d,#444444, 2-6 #626262,#080808, 7-12 #bdbdbd,#080808, 13-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|6: 0-1 d,#444444, 2-6 #626262,#080808, 7-12 #bdbdbd,#080808, 13-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|7: 0-1 d,#444444, 2-6 #626262,#080808, 7-12 #bdbdbd,#080808, 13-49 d,#080808, 50-51 d,#444444, 52-58 #bdbdbd,#080808, 59-99 d,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|8: 0-1 d,#444444, 2-6 #626262,#080808, 7-12 #bdbdbd,#080808, 13-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|9: 0-1 d,#444444, 2-6 #626262,#080808, 7-12 #bdbdbd,#080808, 13-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|10: 0-1 d,#444444, 2-6 #626262,#080808, 7-12 #bdbdbd,#080808, 13-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|11: 0-1 d,#444444, 2-6 #626262,#080808, 7-13 #bdbdbd,#080808, 14-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|12: 0-1 d,#444444, 2-6 #626262,#080808, 7-13 #bdbdbd,#080808, 14-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|13: 0-1 d,#444444, 2-6 #626262,#080808, 7-13 #bdbdbd,#080808, 14-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|14: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|15: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|16: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#262626, 52-91 #949494,#121212, 92-99 d,#121212, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|17: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|18: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|19: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|20: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|21: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|22: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|23: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|24: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|25: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|26: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|27: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|28: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|29: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+== snap keep-primary grid=150x30 cursor=8,4
+|Kill Newcol Tutor Debug NextColor Dump Find Grep Help
+| NOR /tmp/pardes-snap/multicursor/cwd/f.txt Save NOR /tmp/pardes-snap/multicursor/cwd Del NOR /tmp/pardes-snap/multicursor/cwd Del
+| 1 >>line 1
+| 2 >>line 2 f.txt f.txt
+| 3 >>line 3
+| 4 line 4
+| 5 line 5
+| 6 line 6 f.txt
+| 7 line 7
+| 8 line 8
+| 9 line 9
+| 10 line 10
+| 11 line 11
+| 12 line 12
+| 13
+|
+| NOR /tmp/pardes-snap/multicursor/cwd Del
+|
+| f.txt
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+== style keep-primary
+|0: 0-52 #949494,#121212, 53-149 d,#121212,
+|1: 0-1 d,#626262, 2-49 #949494,#121212, 50-51 d,#262626, 52-91 #949494,#121212, 92-99 d,#121212, 100-101 d,#262626, 102-141 #949494,#121212, 142-149 d,#121212,
+|2: 0-1 d,#444444, 2-6 #626262,#080808, 7-14 #bdbdbd,#080808, 15-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|3: 0-1 d,#444444, 2-6 #626262,#080808, 7-14 #bdbdbd,#080808, 15-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|4: 0-1 d,#444444, 2-6 #949494,#121212, 7-8 #d8c8a8,#4a3a1e, 9-14 #bdbdbd,#080808, 15-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|5: 0-1 d,#444444, 2-6 #626262,#080808, 7-12 #bdbdbd,#080808, 13-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|6: 0-1 d,#444444, 2-6 #626262,#080808, 7-12 #bdbdbd,#080808, 13-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|7: 0-1 d,#444444, 2-6 #626262,#080808, 7-12 #bdbdbd,#080808, 13-49 d,#080808, 50-51 d,#444444, 52-58 #bdbdbd,#080808, 59-99 d,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|8: 0-1 d,#444444, 2-6 #626262,#080808, 7-12 #bdbdbd,#080808, 13-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|9: 0-1 d,#444444, 2-6 #626262,#080808, 7-12 #bdbdbd,#080808, 13-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|10: 0-1 d,#444444, 2-6 #626262,#080808, 7-12 #bdbdbd,#080808, 13-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|11: 0-1 d,#444444, 2-6 #626262,#080808, 7-13 #bdbdbd,#080808, 14-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|12: 0-1 d,#444444, 2-6 #626262,#080808, 7-13 #bdbdbd,#080808, 14-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|13: 0-1 d,#444444, 2-6 #626262,#080808, 7-13 #bdbdbd,#080808, 14-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|14: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|15: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|16: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#262626, 52-91 #949494,#121212, 92-99 d,#121212, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|17: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|18: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|19: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|20: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|21: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|22: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|23: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|24: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|25: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|26: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|27: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|28: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
+|29: 0-1 d,#444444, 2-6 #626262,#080808, 7-49 d,#080808, 50-51 d,#444444, 52-99 #bdbdbd,#080808, 100-101 d,#444444, 102-149 #bdbdbd,#080808,
diff --git a/test/snapshots/multicursor.snap b/test/snapshots/multicursor.snap
new file mode 100644
index 00000000..2bfccb93
--- /dev/null
+++ b/test/snapshots/multicursor.snap
@@ -0,0 +1,46 @@
+# MULTIPLE CURSORS on a real file pane. The differential suite (hxdiff) proves
+# the model against a real helix but is headless, so this is the part it cannot
+# see: that every range is actually on screen, that the primary reads
+# differently from the others, and that ONE keystroke edits at all of them.
+lines f.txt 12
+start 30 150 -n 3
+wait 8000 f.txt
+stable 700 20000
+# open f.txt in the left pane (type its name, right-click to Look)
+press left 5 8
+release left 5 8
+stable 400 5000
+key i
+text f.txt
+key esc
+settle 100
+press right 6 8
+release right 6 8
+wait 10000 line 3
+stable 700 15000
+# top of the file, then C C: three cursors, one per line, primary on line 3
+key g g
+stable 400 5000
+key C C
+stable 400 5000
+snap three-cursors
+# the colours ARE the feature here: the primary's cell against the two dimmer
+# ones, each with its own bright cursor cell
+snapstyle three-cursors
+# one keystroke, three edits
+key i
+text >>
+key esc
+settle 100
+stable 400 5000
+snap edited-at-three
+# a selection per cursor: e selects to the end of the first word at each
+key g h w
+stable 400 5000
+snap three-selections
+snapstyle three-selections
+# `,` drops back to the primary alone; the two dim highlights must vanish
+key ,
+stable 400 5000
+snap keep-primary
+snapstyle keep-primary
diff --git a/test/snapshots/selregex.golden b/test/snapshots/selregex.golden
new file mode 100644
index 00000000..9a1d58d6
--- /dev/null
+++ b/test/snapshots/selregex.golden
@@ -0,0 +1,275 @@
+== snap prompt-armed grid=160x24 cursor=59,1
+|Kill Newcol Tutor Debug NextColor Dump Find Grep Help
+| INS /tmp/pardes-snap/selregex/cwd/m.zig Save Del Select / NOR /tmp/pardes-snap/selregex/cwd Del
+| 1 const one = 1;
+| 2 const two = 2; m.zig
+| 3 const three = 3;
+| 4
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+== snap preview grid=160x24 cursor=64,1
+|Kill Newcol Tutor Debug NextColor Dump Find Grep Help
+| INS /tmp/pardes-snap/selregex/cwd/m.zig Save Del Select /const NOR /tmp/pardes-snap/selregex/cwd Del
+| 1 const one = 1;
+| 2 const two = 2; m.zig
+| 3 const three = 3;
+| 4
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+== style preview
+|0: 0-52 #949494,#121212, 53-159 d,#121212,
+|1: 0-1 d,#626262, 2-63 #949494,#121212, 64-79 d,#121212, 80-81 d,#262626, 82-118 #949494,#121212, 119-159 d,#121212,
+|2: 0-1 d,#444444, 2-6 #626262,#080808, 7-10 #d8c8a8,#4a3a1e, 11-11 #4a3a1e,#d8c8a8, 12-18 #bdbdbd,#080808, 19-19 #e3c78a,#080808, 20-20 #bdbdbd,#080808, 21-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|3: 0-1 d,#444444, 2-6 #626262,#080808, 7-10 #a89c84,#2e2616, 11-11 #4a3a1e,#d8c8a8, 12-18 #bdbdbd,#080808, 19-19 #e3c78a,#080808, 20-20 #bdbdbd,#080808, 21-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|4: 0-1 d,#444444, 2-6 #626262,#080808, 7-10 #a89c84,#2e2616, 11-11 #4a3a1e,#d8c8a8, 12-20 #bdbdbd,#080808, 21-21 #e3c78a,#080808, 22-22 #bdbdbd,#080808, 23-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|5: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|6: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|7: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|8: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|9: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|10: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|11: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|12: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|13: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|14: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|15: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|16: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|17: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|18: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|19: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|20: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|21: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|22: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|23: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+== snap three-selected grid=160x24 cursor=11,2
+|Kill Newcol Tutor Debug NextColor Dump Find Grep Help
+| NOR /tmp/pardes-snap/selregex/cwd/m.zig Save Del NOR /tmp/pardes-snap/selregex/cwd Del
+| 1 const one = 1;
+| 2 const two = 2; m.zig
+| 3 const three = 3;
+| 4
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+== style three-selected
+|0: 0-52 #949494,#121212, 53-159 d,#121212,
+|1: 0-1 d,#626262, 2-49 #949494,#121212, 50-79 d,#121212, 80-81 d,#262626, 82-118 #949494,#121212, 119-159 d,#121212,
+|2: 0-1 d,#444444, 2-6 #949494,#121212, 7-11 #d8c8a8,#4a3a1e, 12-18 #bdbdbd,#080808, 19-19 #e3c78a,#080808, 20-20 #bdbdbd,#080808, 21-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|3: 0-1 d,#444444, 2-6 #626262,#080808, 7-10 #a89c84,#2e2616, 11-11 #4a3a1e,#d8c8a8, 12-18 #bdbdbd,#080808, 19-19 #e3c78a,#080808, 20-20 #bdbdbd,#080808, 21-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|4: 0-1 d,#444444, 2-6 #626262,#080808, 7-10 #a89c84,#2e2616, 11-11 #4a3a1e,#d8c8a8, 12-20 #bdbdbd,#080808, 21-21 #e3c78a,#080808, 22-22 #bdbdbd,#080808, 23-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|5: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|6: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|7: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|8: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|9: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|10: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|11: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|12: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|13: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|14: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|15: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|16: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|17: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|18: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|19: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|20: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|21: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|22: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|23: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+== snap narrowed grid=160x24 cursor=60,1
+|Kill Newcol Tutor Debug NextColor Dump Find Grep Help
+| INS /tmp/pardes-snap/selregex/cwd/m.zig Save Del Select /t NOR /tmp/pardes-snap/selregex/cwd Del
+| 1 const one = 1;
+| 2 const two = 2; m.zig
+| 3 const three = 3;
+| 4
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+== style narrowed
+|0: 0-52 #949494,#121212, 53-159 d,#121212,
+|1: 0-1 d,#626262, 2-59 #949494,#121212, 60-79 d,#121212, 80-81 d,#262626, 82-118 #949494,#121212, 119-159 d,#121212,
+|2: 0-1 d,#444444, 2-6 #626262,#080808, 7-10 #bdbdbd,#080808, 11-11 #4a3a1e,#d8c8a8, 12-18 #bdbdbd,#080808, 19-19 #e3c78a,#080808, 20-20 #bdbdbd,#080808, 21-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|3: 0-1 d,#444444, 2-6 #626262,#080808, 7-10 #bdbdbd,#080808, 11-11 #4a3a1e,#d8c8a8, 12-18 #bdbdbd,#080808, 19-19 #e3c78a,#080808, 20-20 #bdbdbd,#080808, 21-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|4: 0-1 d,#444444, 2-6 #626262,#080808, 7-10 #bdbdbd,#080808, 11-11 #4a3a1e,#d8c8a8, 12-20 #bdbdbd,#080808, 21-21 #e3c78a,#080808, 22-22 #bdbdbd,#080808, 23-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|5: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|6: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|7: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|8: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|9: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|10: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|11: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|12: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|13: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|14: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|15: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|16: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|17: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|18: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|19: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|20: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|21: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|22: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|23: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+== snap esc-restores grid=160x24 cursor=11,2
+|Kill Newcol Tutor Debug NextColor Dump Find Grep Help
+| NOR /tmp/pardes-snap/selregex/cwd/m.zig Save Del NOR /tmp/pardes-snap/selregex/cwd Del
+| 1 const one = 1;
+| 2 const two = 2; m.zig
+| 3 const three = 3;
+| 4
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+== style esc-restores
+|0: 0-52 #949494,#121212, 53-159 d,#121212,
+|1: 0-1 d,#626262, 2-49 #949494,#121212, 50-79 d,#121212, 80-81 d,#262626, 82-118 #949494,#121212, 119-159 d,#121212,
+|2: 0-1 d,#444444, 2-6 #949494,#121212, 7-11 #d8c8a8,#4a3a1e, 12-18 #bdbdbd,#080808, 19-19 #e3c78a,#080808, 20-20 #bdbdbd,#080808, 21-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|3: 0-1 d,#444444, 2-6 #626262,#080808, 7-10 #a89c84,#2e2616, 11-11 #4a3a1e,#d8c8a8, 12-18 #bdbdbd,#080808, 19-19 #e3c78a,#080808, 20-20 #bdbdbd,#080808, 21-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|4: 0-1 d,#444444, 2-6 #626262,#080808, 7-10 #a89c84,#2e2616, 11-11 #4a3a1e,#d8c8a8, 12-20 #bdbdbd,#080808, 21-21 #e3c78a,#080808, 22-22 #bdbdbd,#080808, 23-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|5: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|6: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|7: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|8: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|9: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|10: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|11: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|12: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|13: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|14: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|15: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|16: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|17: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|18: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|19: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|20: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|21: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|22: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+|23: 0-1 d,#444444, 2-6 #626262,#080808, 7-79 d,#080808, 80-81 d,#444444, 82-159 #bdbdbd,#080808,
+== snap commented grid=160x24 cursor=14,2
+|Kill Newcol Tutor Debug NextColor Dump Find Grep Help
+| NOR /tmp/pardes-snap/selregex/cwd/m.zig Save Del NOR /tmp/pardes-snap/selregex/cwd Del
+| 1 // const one = 1;
+| 2 // const two = 2; m.zig
+| 3 // const three = 3;
+| 4
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+== snap uncommented grid=160x24 cursor=11,2
+|Kill Newcol Tutor Debug NextColor Dump Find Grep Help
+| NOR /tmp/pardes-snap/selregex/cwd/m.zig Save Del NOR /tmp/pardes-snap/selregex/cwd Del
+| 1 const one = 1;
+| 2 const two = 2; m.zig
+| 3 const three = 3;
+| 4
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
diff --git a/test/snapshots/selregex.snap b/test/snapshots/selregex.snap
new file mode 100644
index 00000000..193ab314
--- /dev/null
+++ b/test/snapshots/selregex.snap
@@ -0,0 +1,56 @@
+# Interactive regex selection (`s` / `S`) and the comment toggle, on a real
+# file pane. hxdiff pins what they DO against a real helix, but it is headless,
+# so this is the half it cannot see: the prompt living in the TAG rather than a
+# popup, the matches lighting up under a pattern as it is typed, Esc putting
+# back what was there, and Ctrl-c using the token this file's EXTENSION asks
+# for — `//`, where a buffer with no language would get `#`.
+file m.zig const one = 1;\nconst two = 2;\nconst three = 3;\n
+# wide on purpose: the whole point of this script is a tag long enough to hold
+# the marker AND the pattern, and a narrow pane simply truncates it away
+start 24 160 m.zig
+wait 8000 m.zig
+stable 700 20000
+key g g
+stable 400 5000
+# `%` takes the whole file, `s` arms the regex input: the marker goes into the
+# tag tail after the path, and the pane is in insert mode ON THE TAG — the
+# same one-line editor `/` and Find use, and nothing has moved in the body yet.
+key %
+key s
+stable 400 5000
+snap prompt-armed
+# ...and now the point: the selection follows the pattern as it is typed. Three
+# `const` runs light up with Enter nowhere near, and the colours ARE the
+# feature — the primary bright, the other two dim, each with its own cursor.
+text const
+stable 400 5000
+snap preview
+snapstyle preview
+key enter
+stable 400 5000
+snap three-selected
+snapstyle three-selected
+# a second `s` narrows the three to one `t` apiece...
+key s
+text t
+stable 400 5000
+snap narrowed
+# the grid text cannot show a selection, so this is where the styles carry the
+# whole point: three one-cell ranges here, three five-cell ones after the Esc
+snapstyle narrowed
+# ...and Esc throws that away for the selection the prompt opened on, which is
+# free: the preview is re-derived from that snapshot on every keystroke, so
+# cancelling is just applying the empty pattern.
+key esc
+settle 100
+stable 400 5000
+snap esc-restores
+snapstyle esc-restores
+# Ctrl-c comments every line the three cursors touch — one decision for the
+# whole selection, not one per cursor — and again to take it back off.
+key c-c
+stable 400 5000
+snap commented
+key c-c
+stable 400 5000
+snap uncommented