Add configurable Next/Previous Pane keybindings#84
Merged
Conversation
⌘] / ⌘[ cycle projects, so issue #83 asks for a separate, rebindable way to cycle focus through the panes within the current tab. Adds nextPane/previousPane actions (unbound by default) that walk the active tab's panes in tree order with wraparound; the palette, menu bar, and Settings keymaps pick them up automatically via AppCommand.allCases. Closes #83
The first cut cycled panes in spatial tree order. What's actually wanted is browser-style Back/Forward over the panes you've visited: Previous Pane returns to where you came from, Next Pane redoes a step you went back from. Adds PaneNavigator, a linear trail with a cursor (a normal focus change truncates the forward path, like a browser). TerminalTab seeds the trail with the pane being left so Back works from the very first focus move, and prunes closed panes by position so duplicate ids in the trail don't mis-anchor the cursor. Kept separate from the MRU paneFocusHistory that drives next-focus-after-close.
Ghostty's goto_split:next/previous walk panes in creation order (an in-order traversal of the split tree with wraparound), per its docs and source (src/datastruct/split_tree.zig: next_wrapped/previous_wrapped) — not focus history. Drop PaneNavigator and restore the positional cycle so Macterm matches the behavior the issue asked for.
2 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #83.
Why
⌘]/⌘[cycle through projects in Macterm, so the issue asked for a separate, rebindable way to move between the panes within a tab — matching Ghostty'sgoto_split:next/goto_split:previous.Ghostty's
next/previouswalk panes in creation order — its docs describe them as "the adjacent split in the order of creation", and the source (src/datastruct/split_tree.zig) implements them asnext_wrapped/previous_wrapped: an in-order traversal of the split tree with wraparound (the directionalleft/right/up/downvariants are the spatial ones). This PR mirrors that: Macterm'sSplitNode.allPanes()is the same in-order leaf traversal, so cycling presents as creation order.What changed
HotkeyAction— newnextPane/previousPanecases, defaulting to"none"(unbound, likesplitAuto) so they don't clash with existing shortcuts. The user binds them in Settings.AppCommand— matching "Next Pane" / "Previous Pane" commands in the Panes category. This single registration surfaces them in the command palette, menu bar, and Settings keymaps automatically.AppState.cyclePane(forward:projectID:)— steps throughsplitRoot.allPanes()(in-order tree traversal) from the focused pane with modulo wraparound; no-op for a single pane. Focus restoration to the NSView rides the existingTerminalPane.updateNSViewpath, same as directional focus.AppCommandActionsandResponders.Notes for reviewers
Tests
AppStateTestscases: forward advance in tree order, forward/backward wrap, single-pane no-op.mise run test,format, andlintall pass.