Make ^U behave more like a standard UNIX command-line
authorIvy Foster <iff@escondida.tk>
Fri, 16 Feb 2018 01:32:05 +0000 (19:32 -0600)
committerIvy Foster <iff@escondida.tk>
Fri, 16 Feb 2018 01:32:05 +0000 (19:32 -0600)
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
src/curses/ux_input.c

index ca9335440b3e55c9320dcfb14b40a6f32883c1aa..d774365166a1d64c267b9ca745d8d5f8325f2029 100644 (file)
@@ -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
index 799671e9e5a6a39073a3f7e4aa86e16b29604054..42c4cbd9c50753f2687f85f65fcaf2467c378d66 100644 (file)
@@ -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) {