From 30f3a65e2de99cdffd091289b4edb8e14be9032d Mon Sep 17 00:00:00 2001 From: user Date: Thu, 16 Jul 2026 16:17:02 +0200 Subject: sh: handle backspace in readline; prompt is now '#' readc() returning $08/$7F now drops the last char from the command buffer (and emits one $08 so the terminal erases it) instead of storing the raw byte. Previously "lzs" left the buffer as "lz\x08s", so the command "ls" was reported "not found" even though the screen showed "ls". Also change the shell prompt from '$' to '#'. osk: B button types the selected key SHIFTED (uppercase a-z). A types the key as shown (lowercase/digit/symbol); B on a letter subtracts 32 for the uppercase glyph (the font already has A-Z). Non-letters are unchanged. --- c/sh.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'c/sh.c') diff --git a/c/sh.c b/c/sh.c index b1bf630..df2c5e9 100644 --- a/c/sh.c +++ b/c/sh.c @@ -104,13 +104,17 @@ void main(void) { unsigned char nt, i, pipepos, c, bg; /* reap finished background jobs */ { unsigned char p; while ((p = reap())) { putc('['); putu(p); puts(" done]"); nl(); } } - puts(cwd); puts("$ "); + puts(cwd); puts("# "); /* read a line (echoing), stop at newline; exit on EOF */ i = 0; for (;;) { c = readc(); if (c == EOF) poweroff(); if (c == '\r' || c == '\n') { nl(); break; } + if (c == 8 || c == 127) { /* backspace: drop last char */ + if (i > 0) { i--; putc(8); } + continue; + } if (i < 79) { line[i++] = c; putc(c); } } line[i] = 0; -- cgit v1.3.1-sl0p