Add Ctrl+D to exit when editor is empty

- Add isCtrlD helper to keys.ts
- CustomEditor intercepts Ctrl+D and only triggers callback when editor is empty
- Single Ctrl+D with empty input exits immediately
- Update CHANGELOG to frame as feature (Kitty protocol support) not fix
This commit is contained in:
Ahmed Kamal 2025-12-18 19:39:41 +02:00
parent c3c2bffc68
commit 727a7ab018
5 changed files with 31 additions and 3 deletions

View file

@ -1,4 +1,4 @@
import { Editor, isCtrlC, isCtrlO, isCtrlP, isCtrlT, isShiftTab } from "@mariozechner/pi-tui";
import { Editor, isCtrlC, isCtrlD, isCtrlO, isCtrlP, isCtrlT, isShiftTab } from "@mariozechner/pi-tui";
/**
* Custom editor that handles Escape and Ctrl+C keys for coding-agent
@ -6,6 +6,7 @@ import { Editor, isCtrlC, isCtrlO, isCtrlP, isCtrlT, isShiftTab } from "@marioze
export class CustomEditor extends Editor {
public onEscape?: () => void;
public onCtrlC?: () => void;
public onCtrlD?: () => void;
public onShiftTab?: () => void;
public onCtrlP?: () => void;
public onCtrlO?: () => void;
@ -49,6 +50,15 @@ export class CustomEditor extends Editor {
return;
}
// Intercept Ctrl+D (only when editor is empty)
if (isCtrlD(data)) {
if (this.getText().length === 0 && this.onCtrlD) {
this.onCtrlD();
}
// Always consume Ctrl+D (don't pass to parent)
return;
}
// Pass to parent for normal handling
super.handleInput(data);
}

View file

@ -562,6 +562,7 @@ export class InteractiveMode {
};
this.editor.onCtrlC = () => this.handleCtrlC();
this.editor.onCtrlD = () => this.handleCtrlD();
this.editor.onShiftTab = () => this.cycleThinkingLevel();
this.editor.onCtrlP = () => this.cycleModel();
this.editor.onCtrlO = () => this.toggleToolOutputExpansion();
@ -1128,6 +1129,12 @@ export class InteractiveMode {
}
}
private handleCtrlD(): void {
// Only called when editor is empty (enforced by CustomEditor)
this.stop();
process.exit(0);
}
private updateEditorBorderColor(): void {
if (this.isBashMode) {
this.editor.borderColor = theme.getBashModeBorderColor();