summaryrefslogtreecommitdiff
path: root/test/snapshots/jumps.snap
diff options
context:
space:
mode:
authorGabriel Schneider <[email protected]>2026-08-11 18:30:13 -0300
committerGabriel Schneider <[email protected]>2026-08-12 13:04:32 -0300
commitb424164922842796619cb6894ec46d729a8a6826 (patch)
treebd4653accfaeb67012f4e7257c61eaf4fb12c892 /test/snapshots/jumps.snap
parent08f32cdde672740b71608f3dfccd629dcbac78f7 (diff)
downloadpardes-b424164922842796619cb6894ec46d729a8a6826.tar.gz
pardes-b424164922842796619cb6894ec46d729a8a6826.zip
clipboard, n/N and the tty prompt: three things that were half-wired
Three changes that all turned out to be the same shape -- a feature that worked in one direction, or for one pane kind, and quietly did not in the others. CLIPBOARD. Every register write emitted set_clipboard, so deleting one character threw away whatever the desktop was holding; multi-cursor yank took the join's early return and emitted nothing at all, so the same key reached the clipboard on one cursor and not on two. Nothing could READ the clipboard: the SDL shell had no SDL_GetClipboardText anywhere in it, and the tty shell never asked for OSC 52, so `p` from another application was dead in both. Now it is helix's split. y/d/c/p/P/R and the acme chords are the DEFAULT REGISTER and nothing else; the system clipboard is five words on helix's own letters -- SPC y, SPC Y, SPC p, SPC P, SPC R -- spelled as builtins so they land in Help and are executable like every other verb. The one exception is the tag `y` chord, which still mirrors out because a tag is always insert, so SPC cannot be pressed there, and copying the path out is the whole point of the chord. Reading is a new read_clipboard effect answered by an ordinary Event.paste, so the round trip is honest about being one: SDL and NSPasteboard answer inside the same drain, the browser answers a promise, and a terminal answers over OSC 52 or -- far more often -- refuses. A refused read is a paste that does not happen, and the request dies at the next keystroke rather than landing minutes late in whatever pane is focused by then. The tty shell also enables BRACKETED PASTE now and coalesces paste_start..paste_end into one event. Before this a paste arrived as a flood of individual key presses: plausible in insert mode, and in normal mode every pasted character ran as a command. n/N. They stepped the armed results buffer and immediately Looked each row, so you could not walk past a hit without opening it. They are a MOTION now: select the next look-able text, open nothing, and let Enter decide. What they step is the largest whitespace-delimited run look.resolve can act on (look.lookableSpan, wrapper punctuation peeled), over a RING of panes -- every pane that has performed a look, most recent first, then the output buffers that have not, newest first, and only if both are empty the pane in front of you. N is the exact inverse of n, computed rather than remembered: both directions ask the same question about the same spans and compare against the column the walk parks on, so x presses one way and x back land exactly where you started, pane boundaries and the ring's seam included. A ring rather than a list with two ends because a shell's cursor sits at the prompt, below everything it has printed, so a walk that could not come round would have nowhere to go on the very first press -- which is the case n/N were written for. One motion everywhere, no pane-kind or buffer-kind special case. The only thing a buffer may change is the GRAIN of what a step selects, and it does it with one flag rather than a branch: output_pane.Traits.commands (renamed from `executes`, which named one reader's behaviour rather than the fact) makes a row select WHOLE, because a ThemeSel line is a word to run and has no path inside it to pick out. `]d`/`[d` are not n/N -- they are helix's diagnostic motions, their job is to ARRIVE, and they still reach searchStep. THE TTY PROMPT. Leaving raw tty blanked the prompt row, and the command you had typed at that prompt shares the row, so it went too -- a shell out of tty read as output only. OSC 133 marks the row CELL by cell, so the two are separable: config.tty_blank = .prompt cuts the prompt's own columns and leaves the command, left-hugged at column 0 in line with the output under it rather than in a bay of blanks. .prompt_and_input is the old behaviour, kept. Because the row is now something you can put a cursor in, enterTty adds the hidden prompt width back before asking ghostty to walk the shell's own cursor to it -- the modal column on a cut row is short by exactly that much. Verified: unit-test 186/186 (nine new), snap 87/87 (new ttyprompt.snap), hxdiff 481 and hxparity 561 with 0 mismatches, tty and gui both build. And against the real binaries rather than the harness: in a pty, SPC y emits OSC 52 carrying exactly the selection while plain y emits nothing, SPC p issues the read and pastes the reply, and a bracketed paste of "dd..." inserts text instead of deleting two lines. In a real SDL window, SPC y then SPC p round trips through the system clipboard while the default register holds different text. Setting tty_blank back to .prompt_and_input reproduces all 86 old goldens byte for byte.
Diffstat (limited to 'test/snapshots/jumps.snap')
-rw-r--r--test/snapshots/jumps.snap50
1 files changed, 36 insertions, 14 deletions
diff --git a/test/snapshots/jumps.snap b/test/snapshots/jumps.snap
index 1e2a9075..db131bd4 100644
--- a/test/snapshots/jumps.snap
+++ b/test/snapshots/jumps.snap
@@ -64,36 +64,58 @@ snap last-back
key space j l
stable 700 15000
snap jumplist
-# n/N step the rows and look them, exactly as they do a +Search: the stepped
-# row is selected in the buffer (snapstyle) and the pane it names follows.
-# Row 1 is the shell (no path, so `@pN`), row 2 the file at line 1, row 4 the
-# file at line 100 — so the body visibly rides the list.
+# n/N select the next/prev look-able span and Enter looks it, exactly as they
+# do a +Search: the stepped span is selected in the buffer (snapstyle) and the
+# Enter after it moves the pane the row names. Row 1 is the shell (no path, so
+# `@pN`), row 2 the file at line 1, row 4 the file at line 100 — so the body
+# visibly rides the list.
#
-# ponytail: stepping onto an `@pN` row selects it but does NOT focus that pane —
-# the cursor stays where it was, which is why step1-shell's header is still the
-# file's. Only rows with a PATH move focus. Nothing tested this before, because
-# until the swap above the shell never survived on the stack to be listed at
-# all. Fix belongs in the location-list step, next to the path case.
+# SPANS, not rows, and this buffer is the one place in the suite where the two
+# differ: an `@pN` row's trailing text is the pane's DIRECTORY, which is a
+# look-able word of its own, so row 1 and row 3 each hold TWO stops and
+# reaching the next row takes two steps. A file row's text is its content line
+# (`line 1`), which resolves to nothing, so those hold one. Stepping words
+# rather than rows is what makes the walk the same motion in a results buffer
+# and in the middle of a paragraph, and this is the price of that.
+#
+# An `@pN` row moves focus like any other, which it did not use to: the STEP
+# only selects now, and the look Enter runs goes to the pane by the same route
+# a path takes.
key n
+key enter
stable 700 15000
snap step1-shell
snapstyle step1-shell
+# past the directory on row 1, then onto row 2
+key n
+stable 400 5000
key n
+key enter
stable 700 15000
snap step2-file
+# row 3 is the shell again, both its spans, and then row 4
key n
-stable 700 15000
+stable 400 5000
key n
+stable 400 5000
+key n
+key enter
stable 700 15000
snap step4-line100
+# N is the exact inverse: the same two spans of row 3 in the other order, so
+# two presses land back on its location and Enter follows it to the shell
+key N
+stable 400 5000
key N
+key enter
stable 700 15000
snap step-back
# and an ordinary LOOK on a row goes there too — the leading word IS a
# location, so the right-click look resolves it like any other path. Row 4
-# again, this time by clicking it: the buffer's four rows are the last four
-# screen rows, so row 4 is the bottom one.
-press right 16 30
-release right 16 30
+# again, this time by clicking it: the walk above scrolled the list by one, so
+# the last four screen rows are its rows 2 through 5 and row 4 is the second
+# from the bottom.
+press right 16 29
+release right 16 29
stable 700 15000
snap look-row