import { KeyCommand } from './ansi.ts'; import { getRuntime } from './runtime.ts'; import { getTermios } from './termios.ts'; import { Editor } from './editor.ts'; const decoder = new TextDecoder(); function readKey(raw: Uint8Array): string { const parsed = decoder.decode(raw); // Return the input if it's unambiguous if (parsed in KeyCommand) { return parsed; } // Some keycodes have multiple potential inputs switch (parsed) { case '\x1bOH': case '\x1b[7~': case '\x1b[1~': case '\x1b[H': return KeyCommand.Home; case '\x1bOF': case '\x1b[8~': case '\x1b[4~': case '\x1b[F': return KeyCommand.End; default: return parsed; } } export async function main() { const runTime = await getRuntime(); const { term, onExit } = runTime; // Setup raw mode, and tear down on error or normal exit const t = await getTermios(); t.enableRawMode(); onExit(() => { t.disableRawMode(); }); const terminalSize = await term.getTerminalSize(); // Create the editor itself const editor = new Editor(terminalSize); if (term.argv.length > 0) { const filename = term.argv[0]; if (filename.trim() !== '') { await editor.open(filename); } } await editor.refreshScreen(); // The main event loop for await (const chunk of term.inputLoop()) { // Process input const char = readKey(chunk); const shouldLoop = editor.processKeyPress(char); if (!shouldLoop) { return 0; } // Render output await editor.refreshScreen(); } return -1; }