mirror of
https://github.com/earendil-works/pi.git
synced 2026-06-18 15:54:04 +08:00
All keybindings configurable via ~/.pi/agent/keybindings.json
Editor actions:
- cursorUp, cursorDown, cursorLeft, cursorRight
- cursorWordLeft, cursorWordRight, cursorLineStart, cursorLineEnd
- deleteCharBackward, deleteCharForward, deleteWordBackward
- deleteToLineStart, deleteToLineEnd
- newLine, submit, tab
- selectUp, selectDown, selectConfirm, selectCancel
App actions:
- interrupt, clear, exit, suspend
- cycleThinkingLevel, cycleModelForward, cycleModelBackward
- selectModel, expandTools, toggleThinking, externalEditor
Also adds support for numpad Enter key (Kitty protocol codepoint 57414
and SS3 M sequence)
Example emacs-style keybindings.json:
{
"cursorUp": ["up", "ctrl+p"],
"cursorDown": ["down", "ctrl+n"],
"cursorLeft": ["left", "ctrl+b"],
"cursorRight": ["right", "ctrl+f"],
"deleteCharForward": ["delete", "ctrl+d"],
"cycleModelForward": "ctrl+o"
}
40 lines
947 B
TypeScript
40 lines
947 B
TypeScript
import { matchesKey } from "../keys.js";
|
|
import { Loader } from "./loader.js";
|
|
|
|
/**
|
|
* Loader that can be cancelled with Escape.
|
|
* Extends Loader with an AbortSignal for cancelling async operations.
|
|
*
|
|
* @example
|
|
* const loader = new CancellableLoader(tui, cyan, dim, "Working...");
|
|
* loader.onAbort = () => done(null);
|
|
* doWork(loader.signal).then(done);
|
|
*/
|
|
export class CancellableLoader extends Loader {
|
|
private abortController = new AbortController();
|
|
|
|
/** Called when user presses Escape */
|
|
onAbort?: () => void;
|
|
|
|
/** AbortSignal that is aborted when user presses Escape */
|
|
get signal(): AbortSignal {
|
|
return this.abortController.signal;
|
|
}
|
|
|
|
/** Whether the loader was aborted */
|
|
get aborted(): boolean {
|
|
return this.abortController.signal.aborted;
|
|
}
|
|
|
|
handleInput(data: string): void {
|
|
if (matchesKey(data, "escape")) {
|
|
this.abortController.abort();
|
|
this.onAbort?.();
|
|
}
|
|
}
|
|
|
|
dispose(): void {
|
|
this.stop();
|
|
}
|
|
}
|