From a91876b6a50ba516d2d9b2691d488b718a58e424 Mon Sep 17 00:00:00 2001 From: MeexReay Date: Fri, 21 Mar 2025 20:01:52 +0300 Subject: [PATCH] kfc display improvement --- app/kfc/kfc.js | 69 ++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 61 insertions(+), 8 deletions(-) diff --git a/app/kfc/kfc.js b/app/kfc/kfc.js index 615d93c..7f347a3 100644 --- a/app/kfc/kfc.js +++ b/app/kfc/kfc.js @@ -17,19 +17,32 @@ async function cropToScreen(text, x, y, width, height) { return screen.join("\n") } +async function printScreen(start_cursor, pos, content, mode, pos, x, y, width, height) { + trimTerminal(getTerminal().length - screen_length) + let screen = await cropToScreen(content, 0, 0, width, height - 1) + await writeStdout(screen) + let status_line = `\nmode: ${mode} | size: ${content.length} | lines: ${content.split("\n").length} | x: ${pos[0]} | y: ${pos[1]}` + await writeStdout(status_line) + setCursor(start_cursor[0] + pos[0], start_cursor[1] + pos[1]) + return [screen.length + status_line.length, status_line.length - 1] +} + async function main(args) { if (args.length != 2) { writeStdout(`Usage: kfc \n`) return 1 } - let [terminal_width, terminal_height] = getTerminalSize() let content = readFile(args[1]) - let pos = getCursor() + let mode = "normal" + let pos = [0, 0] + + let start_cursor = getCursor() + let [width, height] = getTerminalSize() + let [screen_length, status_length] = await printScreen(0, start_cursor, pos, content, mode, pos, 0, 0, width, height) - await writeStdout(await cropToScreen(content, 0, 0, terminal_width, terminal_height - 1)) setStdinFlag(ENABLE_STDIN) setStdinFlag(SILENT_STDIN) @@ -40,14 +53,54 @@ async function main(args) { console.log(event) if (event.type == "key") { - if (event.key == "Escape") { - break - } + if (event.key == "Backspace") { - writeStdout(JSON.stringify(event) + "\n") + } else if (event.key == "Delete") { + + } else if (event.key == "ArrowUp") { + pos[1] = Math.max(0, pos[1] - 1) + } else if (event.key == "ArrowDown") { + pos[1] = Math.min(height - 2, pos[1] + 1) + } else if (event.key == "ArrowLeft") { + pos[0] = Math.max(0, pos[0] - 1) + } else if (event.key == "ArrowRight") { + pos[0] = Math.min(height - 1, pos[0] + 1) + } else if (event.key == "Escape") { + mode = "normal" + } else if (event.key == "Insert") { + mode = "insert" + } } else if (event.type == "char") { - writeStdout(JSON.stringify(event) + "\n") + if (mode == "normal") { + if (event.char == ":") { + trimTerminal(getTerminal().length - status_length) + writeStdout(":") + + let command = readLine() + + setStdinFlag(ENABLE_STDIN) + setStdinFlag(SILENT_STDIN) + + if (command == "w") { + // save + } else if (command == "q") { + break + } else if (command == "x") { + // save + + break + } + } else if (event.char == "i") { + mode = "insert" + } + } else if (mode == "insert") { + + } } + + let res = await printScreen(screen_length, start_cursor, pos, content, mode, pos, 0, 0, width, height) + screen_length = res[0] + status_length = res[1] } setStdinFlag(RENDER_STDIN)