From 2b980b3141f5672e37db651232bf59b589e4bb65 Mon Sep 17 00:00:00 2001 From: katalx Date: Thu, 29 Jan 2026 03:36:38 -0500 Subject: better line editing --- main.c | 40 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) (limited to 'main.c') diff --git a/main.c b/main.c index 27c514e..31e10ce 100644 --- a/main.c +++ b/main.c @@ -71,6 +71,26 @@ delete_word(DynStr *s, int i) return i; } +int +prev_word(DynStr *s, int i) +{ + while (i > 0 && is_space(s->v[i-1])) + i--; + while (i > 0 && !is_space(s->v[i-1])) + i--; + return i; +} + +int +next_word(DynStr *s, int i) +{ + while (i < s->n && is_space(s->v[i])) + i++; + while (i < s->n && !is_space(s->v[i])) + i++; + return i; +} + int read_all(FILE *f, DynStr *out, Arena *a) { @@ -143,16 +163,28 @@ main(int argc, char **argv) if (seli < 0) seli = 0; goto draw; case UIK_LEFT: - if (inpi > 0) inpi--; + if (ev.key.mod & UIM_CTRL) + inpi = prev_word(&input, inpi); + else if (inpi > 0) + inpi--; goto draw; case UIK_RIGHT: - if (inpi < input.n) inpi++; + if (ev.key.mod & UIM_CTRL) + inpi = next_word(&input, inpi); + else if (inpi < input.n) + inpi++; goto draw; case UIK_HOME: - inpi = 0; + if (ev.key.mod & UIM_CTRL) + seli = 0; + else + inpi = 0; goto draw; case UIK_END: - inpi = input.n; + if (ev.key.mod & UIM_CTRL) + seli = opt.n - 1; + else + inpi = input.n; goto draw; default: if (!ev.key.strn) break; -- cgit v1.2.3