fix(tui): prioritize composer keybinds (#42384)

This commit is contained in:
Kit Langton
2026-08-13 14:12:39 -04:00
committed by GitHub
parent 2cf20e660e
commit 9fff6e2b4f
4 changed files with 9 additions and 17 deletions
@@ -94,6 +94,7 @@ export function Composer(props: ComposerProps) {
Keymap.createLayer(() => ({
mode: "composer",
enabled: () => props.open,
priority: 1,
commands: [
{ bind: "left", title: "Previous tab", group: "Composer", run: () => switchTab(-1) },
{ bind: "right", title: "Next tab", group: "Composer", run: () => switchTab(1) },
@@ -23,19 +23,6 @@ export function ShellTab(props: { sessionID: string }) {
const selectedEntry = createMemo(() => entries()[store.selected])
const keymap = Keymap.use()
createEffect(() => {
if (!composer.active("shell")) return
const cleanup = keymap.intercept("key", ({ event, consume }) => {
if (event.name !== "d" || !event.ctrl) return
if (!shortcuts.list("composer.shell.kill").includes("ctrl+d")) return
if (!selectedEntry()) return
consume()
keymap.dispatch("composer.shell.kill")
})
onCleanup(cleanup)
})
createEffect(() => {
if (store.selected >= entries().length) setStore("selected", Math.max(0, entries().length - 1))
})
@@ -63,6 +50,7 @@ export function ShellTab(props: { sessionID: string }) {
Keymap.createLayer(() => ({
mode: "composer",
enabled: () => composer.active("shell"),
priority: 1,
commands: [
{
id: "composer.shell.up",
@@ -164,6 +164,7 @@ export function SubagentsTab(props: { sessionID: string }) {
Keymap.createLayer(() => ({
mode: "composer",
enabled: () => composer.active("subagents"),
priority: 1,
commands: [
{
id: "composer.subagent.up",
@@ -95,7 +95,6 @@ async function renderComposer(
<TestTuiContexts directory={directory}>
<ConfigProvider config={createTuiResolvedConfig({ keybinds })}>
<Keymap.Provider>
<AppExit />
<ClientProvider api={createApi(calls.fetch)}>
<DataProvider>
<LocationProvider>
@@ -107,6 +106,7 @@ async function renderComposer(
</LocationProvider>
</DataProvider>
</ClientProvider>
<AppExit />
</Keymap.Provider>
</ConfigProvider>
</TestTuiContexts>
@@ -173,11 +173,13 @@ test("disabled shell bindings have no component fallbacks", async () => {
}
})
test("shell kill binding overrides app exit", async () => {
const composer = await renderComposer("shell", {}, true)
test("configured composer bindings work with a focused textarea", async () => {
const composer = await renderComposer("subagents", { "composer.shell.kill": "ctrl+u" }, true)
try {
composer.app.mockInput.pressArrow("right")
await composer.app.renderOnce()
expect(composer.app.captureCharFrame()).toContain("bun test")
composer.app.mockInput.pressKey("d", { ctrl: true })
composer.app.mockInput.pressKey("u", { ctrl: true })
await wait(() => composer.removed.length === 1)
expect(composer.removed).toEqual(["sh-a"])
} finally {