Skip to content

Choose which clips are in play - #20

Merged
willkotheimer merged 1 commit into
repeat-unspoolfrom
clip-selection
Sep 11, 2026
Merged

willkotheimer merged 1 commit into
repeat-unspoolfrom
clip-selection

Conversation

@willkotheimer

Copy link
Copy Markdown
Owner

Ticking clips narrows what the next serve delivers and what the whole-spool paste joins — one working set for both, so Win+Alt+U, Win+Alt+V and the button can never come to mean different things.

The rule that makes it safe

An empty selection means every clip. Selecting nothing and meaning nothing is not a state worth having: it would make both hotkeys dead and the button a no-op, with nothing to distinguish that from a bug. So clearing the selection and selecting everything are the same act — there is one command, not two that disagree at the edges — and unticking the last box returns to all rather than to none.

That is the behaviour requested, and the tests pin it from both directions: unticking the last clip, and a selection emptied by deleting the clip it named.

What it touches

Win+Alt+U serves the next clip in play, stepping over the rest and wrapping among them
Win+Alt+V joins only the clips in play, in spool order
the button Put all 15 on the clipboard → Put 3 of 15 on the clipboard

The total stays visible in the label so a selection reads as a narrowing rather than as the whole truth.

Deliberate decisions

The selection is not stored. It describes what you are doing now, the way a text selection does; one that survived a restart would be a rule the user does not remember making. It ends when the active spool changes, when the spool is cleared, and it drops any clip that is deleted — a set still naming a clip that is gone would make the button promise more than it can deliver.

A cursor on an excluded clip is not an error. It was put there before the choice was made, so the next serve walks forward to the first clip in play instead of refusing. Without that, choosing a clip below the cursor would silently kill unspooling.

Order is spool order, not tick order. Ticking c then a joins a then c. The spool is the arrangement; the selection only says which parts of it count.

Verification

384 tests, typecheck, lint, and the zero-network gate pass. Nineteen are new: seven on the pure selection rules, eleven through the session covering serve, wrap, join, the cursor-on-excluded case, and every path that empties the set.

Note

Branched off repeat-unspool (#19), which is still open, so this includes that fix. Merge #19 first.

🤖 Generated with Claude Code

A spool is not always wanted whole. Ticking clips narrows what the next serve
delivers and what the whole-spool paste joins, using one working set for both, so
Win+Alt+U, Win+Alt+V and the button cannot come to mean different things.

An empty selection means every clip. Selecting nothing and meaning nothing is not
a state worth having: it would make both hotkeys dead and the button a no-op with
nothing to distinguish that from a bug. Clearing the selection and selecting
everything are therefore the same act, and unticking the last box returns to all
rather than to none.

The selection is not stored. It describes what you are doing now, the way a text
selection does, and one that survived a restart would be a rule the user does not
remember making. It ends when the active spool changes or the spool is cleared,
and drops any deleted clip, because a set still naming a clip that is gone makes
the button promise more than it can deliver.

Serving steps over what is not in play and wraps among the chosen clips. A cursor
left on an excluded clip is not an error — it was put there before the choice was
made — so the next serve walks forward to the first clip in play instead of
refusing.

The button names what it will take: "Put all 15 on the clipboard" becomes "Put 3
of 15", keeping the total visible so a selection reads as a narrowing rather than
as the whole truth.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@willkotheimer
willkotheimer merged commit 138140b into repeat-unspool Sep 11, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant