diff options
-rw-r--r-- | edit.c | 49 |
1 files changed, 43 insertions, 6 deletions
diff --git a/edit.c b/edit.c index 6b044cb..dde3396 100644 --- a/edit.c +++ b/edit.c @@ -58,9 +58,6 @@ static void home(void) { static void end(void) { line.ptr = line.end; } -static void kill(void) { - line.end = line.ptr; -} static void backspace(void) { if (line.ptr == line.buf) return; @@ -96,6 +93,38 @@ static void enter(void) { line.end = line.buf; } +static void backWord(void) { + left(); + editHead(); + wchar_t *word = wcsrchr(line.buf, ' '); + editTail(); + line.ptr = (word ? &word[1] : line.buf); +} +static void foreWord(void) { + right(); + editHead(); + editTail(); + wchar_t *word = wcschr(line.ptr, ' '); + line.ptr = (word ? word : line.end); +} + +static void killBackWord(void) { + wchar_t *from = line.ptr; + backWord(); + wmemmove(line.ptr, from, line.end - from); + line.end -= from - line.ptr; +} +static void killForeWord(void) { + wchar_t *from = line.ptr; + foreWord(); + wmemmove(from, line.ptr, line.end - line.ptr); + line.end -= line.ptr - from; + line.ptr = from; +} +static void killLine(void) { + line.end = line.ptr; +} + static char *prefix; static void complete(void) { if (!line.tab) { @@ -151,8 +180,15 @@ static void reject(void) { } static bool editMeta(wchar_t ch) { - (void)ch; - return false; + switch (ch) { + break; case L'b': reject(); backWord(); + break; case L'f': reject(); foreWord(); + break; case L'\b': reject(); killBackWord(); + break; case L'd': reject(); killForeWord(); + + break; default: return false; + } + return true; } static bool editCtrl(wchar_t ch) { @@ -162,7 +198,8 @@ static bool editCtrl(wchar_t ch) { break; case L'A': reject(); home(); break; case L'E': reject(); end(); break; case L'D': reject(); delete(); - break; case L'K': reject(); kill(); + break; case L'W': reject(); killBackWord(); + break; case L'K': reject(); killLine(); break; case L'C': accept(); insert(IRC_COLOR); break; case L'N': accept(); insert(IRC_RESET); |