From 186180700c55c224dbf69555debd2a07f52aa19a Mon Sep 17 00:00:00 2001 From: June McEnroe Date: Sat, 12 Mar 2022 17:52:44 -0500 Subject: Implement vi R and r --- edit.c | 53 +++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 39 insertions(+), 14 deletions(-) (limited to 'edit.c') diff --git a/edit.c b/edit.c index 25341d1..e7cb62e 100644 --- a/edit.c +++ b/edit.c @@ -202,27 +202,37 @@ enum { }; static int editViInsert(struct Edit *e, wchar_t ch) { - if (e->vi.lnext) { - e->vi.lnext = false; - return editInsert(e, ch); - } - switch (ch) { - break; case Erase: return editFn(e, EditDeletePrev); - break; case Kill: return editFn(e, EditDeleteHead); - break; case LNext: e->vi.lnext = true; - break; case WErase: return editFn(e, EditDeletePrevWord); - break; case Esc: { - if (e->pos) e->pos--; - e->vi.mode = EditViCommand; + if (!e->vi.lnext) { + switch (ch) { + break; case Erase: return editFn(e, EditDeletePrev); + break; case Kill: return editFn(e, EditDeleteHead); + break; case LNext: e->vi.lnext = true; return 0; + break; case WErase: return editFn(e, EditDeletePrevWord); + break; case Esc: { + if (e->pos) e->pos--; + e->vi.mode = EditViCommand; + return 0; + } } - break; default: return editInsert(e, ch); + } + e->vi.lnext = false; + if (e->vi.verb == 'R' && e->pos < e->len) { + e->buf[e->pos] = ch; + e->pos++; + } else if (e->vi.verb == 'r' && e->pos < e->len) { + e->buf[e->pos] = ch; + e->vi.mode = EditViCommand; + } else { + return editInsert(e, ch); } return 0; } static int editViCommand(struct Edit *e, wchar_t ch) { switch (ch) { - break; case L'i': e->vi.mode = EditViInsert; + break; case L'R': e->vi.verb = 'R'; e->vi.mode = EditViInsert; + break; case L'i': e->vi.verb = 'i'; e->vi.mode = EditViInsert; + break; case L'r': e->vi.verb = 'r'; e->vi.mode = EditViInsert; } return 0; } @@ -261,6 +271,13 @@ static bool eq(struct Edit *e, const char *str1) { } #define editFn(...) assert(0 == editFn(__VA_ARGS__)) +#define editVi(...) assert(0 == editVi(__VA_ARGS__)) + +static void vi(struct Edit *e, const char *str) { + for (const char *ch = str; *ch; ++ch) { + editVi(e, *ch); + } +} int main(void) { struct Edit cut = {0}; @@ -358,6 +375,14 @@ int main(void) { assert(eq(&e, "foo \33\0")); editVi(&e, Kill); assert(eq(&e, "\0")); + + fix(&e, "foo"); + vi(&e, "\33rx"); + assert(e.vi.mode == EditViCommand); + assert(eq(&e, "fo\0x")); + vi(&e, "Robar\33"); + assert(e.vi.mode == EditViCommand); + assert(eq(&e, "fooba\0r")); } #endif /* TEST */ -- cgit 1.4.1 019-10-25 03:04:45 -0400'>2019-10-25Use produce/consume words for ring bufferJune McEnroe 2019-10-25Implement client reading from ring bufferJune McEnroe 2019-10-25Implement ringDiff and ringReadJune McEnroe 2019-10-24Remove manual client naming from manual pageJune McEnroe 2019-10-24Zero entire Client structJune McEnroe 2019-10-24Register readers by client usernamesJune McEnroe 2019-10-24Unset non-blocking on clientsJune McEnroe 2019-10-24Intercept client QUITJune McEnroe 2019-10-24Only set NeedCapEnd if unregisteredJune McEnroe 2019-10-24Set client-side origin to irc.invalidJune McEnroe 2019-10-24Factor out client-side origin nameJune McEnroe 2019-10-24Intercept all CAP commands from clientsJune McEnroe 2019-10-24Ignore further CAP ENDJune McEnroe 2019-10-24Implement client CAP for server-timeJune McEnroe 2019-10-24Implement ringWriteJune McEnroe 2019-10-24Make clientFormat publicJune McEnroe 2019-10-24Make serverFormat publicJune McEnroe 2019-10-24Rename some thingsJune McEnroe 2019-10-23Add ISUPPORT draft to STANDARDSJune McEnroe 2019-10-23Track own originJune McEnroe 2019-10-23Track channels and sync ISUPPORTJune McEnroe 2019-10-23Track nick changesJune McEnroe 2019-10-23Rename Command to MessageJune McEnroe 2019-10-23Synchronize state after client registrationJune McEnroe 2019-10-23Send to server if client has no needsJune McEnroe 2019-10-23Implement some amount of client connectionJune McEnroe 2019-10-23Set clients non-blockingJune McEnroe 2019-10-23Clean up state.c and factor out parsingJune McEnroe 2019-10-23Respond to pingsJune McEnroe 2019-10-23Add verbose flagJune McEnroe 2019-10-23Set NOSIGPIPE on server connectionJune McEnroe 2019-10-23Set an initial loop capJune McEnroe 2019-10-23Fix rest parsingJune McEnroe 2019-10-23Add dynamic poll listJune McEnroe 2019-10-23Don't assume commands have targets and handle ERRORJune McEnroe 2019-10-23Clean up state somewhatJune McEnroe 2019-10-23Actually send the buffer...June McEnroe 2019-10-23Add stateJune McEnroe