From 98416a5b3ffc64705f81385d68a114a6a9d3ce1d Mon Sep 17 00:00:00 2001 From: Simon Andersson Date: Wed, 22 Jul 2015 22:25:09 +0200 Subject: [PATCH] Add binding ctrl-w - deletes prev word Common key binding in readline, vim --- src/common/frotz.h | 1 + src/curses/ux_input.c | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/common/frotz.h b/src/common/frotz.h index 6347ff0..19e1e4d 100644 --- a/src/common/frotz.h +++ b/src/common/frotz.h @@ -284,6 +284,7 @@ typedef struct { #define ZC_HKEY_HELP 0x15 #define ZC_HKEY_MAX 0x15 #define ZC_ESCAPE 0x1b +#define ZC_DEL_WORD 0x1c #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 f110f00..9f1367a 100644 --- a/src/curses/ux_input.c +++ b/src/curses/ux_input.c @@ -235,6 +235,7 @@ static int unix_read_char(int extkeys) 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 ^ 'W': c = ZC_DEL_WORD; break; default: break; /* Who knows? */ } @@ -447,6 +448,23 @@ zchar os_read_line (int max, zchar *buf, int timeout, int width, int continued) memmove(buf + scrpos, buf + scrpos + 1, len - scrpos); } break; + case ZC_DEL_WORD: + if (scrpos != 0) { + /* Search for start of preceding word */ + int i = len; + while (i > 0 && buf[i] != ' ') { + mvaddch(y, x + i, ' '); + i--; + } + + searchpos = -1; + int delta = scrpos - i; + len -= delta; + scrpos -= delta; + scrnmove(x + scrpos, x + scrpos + delta, delta); + memmove(buf + scrpos, buf + scrpos + delta, delta); + } + break; case CHR_DEL: case KEY_DC: /* Delete following character */ if (scrpos < len) { -- 2.34.1