Add M-b, M-f, M-DEL, M-d, C-w

master
Curtis McEnroe 2018-08-09 19:15:12 -04:00
parent d1fea96e86
commit 1d5cafc2eb
No known key found for this signature in database
GPG Key ID: CEA2F97ADCFCD77C
1 changed files with 43 additions and 6 deletions

49
edit.c
View File

@ -58,9 +58,6 @@ static void home(void) {
static void end(void) { static void end(void) {
line.ptr = line.end; line.ptr = line.end;
} }
static void kill(void) {
line.end = line.ptr;
}
static void backspace(void) { static void backspace(void) {
if (line.ptr == line.buf) return; if (line.ptr == line.buf) return;
@ -96,6 +93,38 @@ static void enter(void) {
line.end = line.buf; 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 char *prefix;
static void complete(void) { static void complete(void) {
if (!line.tab) { if (!line.tab) {
@ -151,8 +180,15 @@ static void reject(void) {
} }
static bool editMeta(wchar_t ch) { static bool editMeta(wchar_t ch) {
(void)ch; switch (ch) {
return false; 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) { 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'A': reject(); home();
break; case L'E': reject(); end(); break; case L'E': reject(); end();
break; case L'D': reject(); delete(); 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'C': accept(); insert(IRC_COLOR);
break; case L'N': accept(); insert(IRC_RESET); break; case L'N': accept(); insert(IRC_RESET);