From ec3a4c5816620ba53329775b679405d306fd522e Mon Sep 17 00:00:00 2001 From: Ivy Foster Date: Thu, 15 Feb 2018 19:32:05 -0600 Subject: [PATCH] Make ^U behave more like a standard UNIX command-line Traditionally, ^U deletes everything from the character before point to the beginning of the line, and this is how your average shell or REPL behaves. Previously, frotz deleted the whole line. --- src/common/frotz.h | 1 + src/curses/ux_input.c | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/common/frotz.h b/src/common/frotz.h index ca93354..d774365 100644 --- a/src/common/frotz.h +++ b/src/common/frotz.h @@ -321,6 +321,7 @@ typedef struct { #define ZC_DEL_WORD 0x1c #define ZC_WORD_RIGHT 0x1d #define ZC_WORD_LEFT 0x1e +#define ZC_DEL_TO_BOL 0x1f #define ZC_ASCII_MIN 0x20 #define ZC_ASCII_MAX 0x7e #define ZC_BAD 0x7f diff --git a/src/curses/ux_input.c b/src/curses/ux_input.c index 799671e..42c4cbd 100644 --- a/src/curses/ux_input.c +++ b/src/curses/ux_input.c @@ -144,8 +144,6 @@ static int unix_read_char(int extkeys) /* On many terminals the backspace key returns DEL. */ if (c == erasechar()) return ZC_BACKSPACE;; - if (c == killchar()) return ZC_ESCAPE; - switch(c) { /* Normally ERR means timeout. I suppose we might also get ERR if a signal hits getch. */ @@ -239,17 +237,19 @@ static int unix_read_char(int extkeys) case MOD_META | 'f': return ZC_WORD_RIGHT; case MOD_META | 'b': return ZC_WORD_LEFT; - /* these are the emacs-editing characters */ + /* these are the UNIX line-editing characters */ case MOD_CTRL ^ 'B': return ZC_ARROW_LEFT; /* use ^C to clear line anywhere it doesn't send SIGINT */ case MOD_CTRL ^ 'C': return ZC_ESCAPE; case MOD_CTRL ^ 'F': return ZC_ARROW_RIGHT; case MOD_CTRL ^ 'P': return ZC_ARROW_UP; case MOD_CTRL ^ 'N': return ZC_ARROW_DOWN; + case MOD_CTRL ^ 'A': c = KEY_HOME; break; case MOD_CTRL ^ 'E': c = KEY_END; break; case MOD_CTRL ^ 'D': c = KEY_DC; break; case MOD_CTRL ^ 'K': c = KEY_EOL; break; + case MOD_CTRL ^ 'U': c = ZC_DEL_TO_BOL; break; case MOD_CTRL ^ 'W': c = ZC_DEL_WORD; break; default: break; /* Who knows? */ @@ -486,6 +486,18 @@ zchar os_read_line (int max, zchar *buf, int timeout, int width, int continued) } } break; + case ZC_DEL_TO_BOL: + if (scrpos != 0) { + searchpos = -1; + len -= scrpos; + scrnmove(x, x + scrpos, len); + memmove(buf, buf + scrpos, len); + for (int i = len; i <= len + scrpos; i++) { + mvaddch(y, x + i, ' '); + } + scrpos = 0; + } + break; case CHR_DEL: case KEY_DC: /* Delete following character */ if (scrpos < len) { -- 2.34.1