feat: add a command palette and move panes from it - #2299
Conversation
Opens with prefix+/ as its own overlay, listing every runnable action alongside its shortcut. Typing filters the list, and matches rank by quality so a query naming one command exactly wins over a longer command that merely contains it. Arrows move the selection, enter runs it, esc closes, and clicking a row runs it. Three of the commands relocate the focused pane and have no shortcut of their own: to an existing space, to a new space, or to a new tab. Choosing an existing space arms the session navigator as a destination picker offering a new space, each space as a new tab there, and each tab to split into. Panes are not offered, since a pane is where a move lands rather than somewhere to send one. The line above the footer says what accepting the selected row will do. The keybind reference is unchanged. Its rows carry the action they describe so the palette can source a single inventory, which means a new keybind shows up in both without a second list to maintain. A move that changes nothing now says so. The server reports "already there" as a success carrying changed: false, which the only caller reading these responses was not looking for.
|
Important Review skippedAuto reviews are limited based on label configuration. 🏷️ Required labels (at least one) (1)
Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Comment |
|
Hi @cameronsjo, thanks for your interest in contributing! Herdr automatically admits focused bug fixes from contributors who are not maintainers when the title uses Contributors who are not maintainers may submit only focused bug fixes. If this pull request fixes a bug, rename it to use a conventional Feature requests, behavior changes, and other proposals belong in GitHub Discussions and require maintainer approval before a pull request. If this gate classified the pull request incorrectly, reply and tag a maintainer listed in Patch size: 21 changed files, 1534 changed lines. See https://github.com/herdrdev/herdr/blob/master/CONTRIBUTING.md for the contribution policy. |
Local fork build of herdrdev#2299, which the contribution gate closes automatically as an over-budget feature.
|
@ogulcancelik - Opened a discussion, and I'm kind of sort of just over the line. I know the bot gave me a smack down, but would appreciate some human eyes. Thanks for the consideration. I'd really not like to maintain my own fork, and the plugin architecture wouldn't support this fully. 😞 Not so ninja edit: the big win here is that it really just gives the user an easy way to not have to use the cli commands to do this, and makes it so that I don't have to bloat my agents' context with me throwing darts at an unfamiliar dartboard when we're working on something else. |
|
@cameronsjo bot did the correct thing here, since this is a big feature request. not gigantic but still not a simple bug fix. discussions exist for me to triage, so let's see how much attention your idea gets. if it gets enough upvotes and comments i'll consider it. |
|
@ogulcancelik Agreed, not saying the bot did the wrong thing. And I expected it based on the AGENTS.md and CONTRIBUTING.md. Appreciate the human eyes regardless. |
Follows up on discussion #2283.
Opening this for visibility rather than to jump the queue. It exceeds the
automated intake budget (21 files, ~1400 lines,
feat:title), so it will closeautomatically. The branch is there if the idea is worth pursuing, and I am happy
to cut it down, split it, or drop it entirely on a maintainer's word.
What this adds
A command palette on
prefix+/. Its own overlay, listing every runnableaction alongside that action's shortcut. Typing filters; arrows move the
selection,
enterruns it,esccloses, and clicking a row runs it.Matches rank by quality (exact name, then prefix, then word start, then
substring), so typing
new tabresolves to the command actually named thatrather than to a longer command containing it. Ordering by source position would
get that right only by accident.
Three commands that relocate the focused pane, to an existing space, a new
space, or a new tab.
pane movealready existed in the JSON API and the CLI,but had no keyboard path.
Choosing an existing space arms the session navigator as a destination picker:
+ new spacePanes are not offered as destinations. A pane is where a move lands, not
somewhere to send one, and which pane it splits beside is layout rather than a
destination. The line above the footer states what accepting the selected row
will do, since nothing else on screen distinguishes a space row from a tab row.
Notes for review
describe so the palette can source one inventory, which means a new keybind
appears in both without a second list to maintain.
?itself renders andbehaves exactly as before.
PROTOCOL_VERSIONis unchanged.ModeandNavigatorTargetcarry noSerializederive, so neither crosses the wire, andpane.moveis theexisting API method.
default keys are claimed beyond
prefix+/itself.already occupies returns a success carrying
changed: false; the only callerreading these responses was looking for an
errormember and found none, sonothing reached the user.
changes which rows exist, so seeding first picked an index against a list that
then changed underneath it.
Verification
just checkequivalent in a Linux container, since the dev machine is on macOS26 where libghostty-vt's pinned Zig 0.15.2 cannot link its build runner (#285):
cargo fmt --check,cargo clippy --all-targets --locked -D warnings, andcargo nextest rununder the macOS CI filter (not binary(live_handoff)).3177 passing.
All nine
scripts/test_*maintenance modules pass, split across host andcontainer by tooling (two need
cargo, two neednode; no single environmenthas both).
Docs updated under
docs/next/in en/ja/zh-cn, plus twodocs/next/CHANGELOG.mdentries and the
config-reference.jsonkeybinding entry.