From 214a765cf3681760eed6437f12c92b8446fc6e2e Mon Sep 17 00:00:00 2001 From: "Thomas G. Lopes" Date: Sat, 21 Feb 2026 13:00:57 +0000 Subject: [PATCH] modal editor is a bit bad --- pi/files/agent/extensions/modal-editor.ts | 85 ----------------------- 1 file changed, 85 deletions(-) delete mode 100644 pi/files/agent/extensions/modal-editor.ts diff --git a/pi/files/agent/extensions/modal-editor.ts b/pi/files/agent/extensions/modal-editor.ts deleted file mode 100644 index c1b9d73..0000000 --- a/pi/files/agent/extensions/modal-editor.ts +++ /dev/null @@ -1,85 +0,0 @@ -/** - * Modal Editor - vim-like modal editing example - * - * Usage: pi --extension ./examples/extensions/modal-editor.ts - * - * - Escape: insert → normal mode (in normal mode, aborts agent) - * - i: normal → insert mode - * - hjkl: navigation in normal mode - * - ctrl+c, ctrl+d, etc. work in both modes - */ - -import { CustomEditor, type ExtensionAPI } from "@mariozechner/pi-coding-agent"; -import { matchesKey, truncateToWidth, visibleWidth } from "@mariozechner/pi-tui"; - -// Normal mode key mappings: key -> escape sequence (or null for mode switch) -const NORMAL_KEYS: Record = { - h: "\x1b[D", // left - j: "\x1b[B", // down - k: "\x1b[A", // up - l: "\x1b[C", // right - "0": "\x01", // line start - $: "\x05", // line end - x: "\x1b[3~", // delete char - i: null, // insert mode - a: null, // append (insert + right) -}; - -class ModalEditor extends CustomEditor { - private mode: "normal" | "insert" = "insert"; - - handleInput(data: string): void { - // Escape toggles to normal mode, or passes through for app handling - if (matchesKey(data, "escape")) { - if (this.mode === "insert") { - this.mode = "normal"; - } else { - super.handleInput(data); // abort agent, etc. - } - return; - } - - // Insert mode: pass everything through - if (this.mode === "insert") { - super.handleInput(data); - return; - } - - // Normal mode: check mapped keys - if (data in NORMAL_KEYS) { - const seq = NORMAL_KEYS[data]; - if (data === "i") { - this.mode = "insert"; - } else if (data === "a") { - this.mode = "insert"; - super.handleInput("\x1b[C"); // move right first - } else if (seq) { - super.handleInput(seq); - } - return; - } - - // Pass control sequences (ctrl+c, etc.) to super, ignore printable chars - if (data.length === 1 && data.charCodeAt(0) >= 32) return; - super.handleInput(data); - } - - render(width: number): string[] { - const lines = super.render(width); - if (lines.length === 0) return lines; - - // Add mode indicator to bottom border - const label = this.mode === "normal" ? " NORMAL " : " INSERT "; - const last = lines.length - 1; - if (visibleWidth(lines[last]!) >= label.length) { - lines[last] = truncateToWidth(lines[last]!, width - label.length, "") + label; - } - return lines; - } -} - -export default function (pi: ExtensionAPI) { - pi.on("session_start", (_event, ctx) => { - ctx.ui.setEditorComponent((tui, theme, kb) => new ModalEditor(tui, theme, kb)); - }); -}